4.3 Circuit Breaker: Hystrix Clients
断路器:Hystrix客户端
Netflix实现了一个断路器模式的类库叫做Hystrix。 在一个微服务架构中通常来说会有一个多层服务的调用。
Figure 1. Microservice Graph
对于用户来说,一个底层服务失败,就会引发一系列的连锁反应。当调用一个服务达到一个阈值(Hystrix默认是5秒内20次失败),断路器打开,并拒绝调用。开发者可以指定一些特定错误,来触发降级操作。
Figure 2. Hystrix fallback prevents cascading failures
断路器打开后,阻止了连锁反应并且允许丢弃或者等待服务重新响应。降级调用是Hystrix提供的另一种策略,比如提供一个静态数据或者一个合理的空值。 降级也可以链式触发,比如,一个服务降级可能引起另外一些业务调用得到一个降级的静态数据。
4.3.1 How to Include Hystrix 如何引入Hystrix
在工程中引入Hystrix只需要使用特定的starter就可以了。如:group:
org.springframework.cloud
,artifact id :spring-cloud-starter-hystrix
。如何使用Spring Cloud构建系统可以参见 Spring Cloud Project page
例如:
@SpringBootApplication
@EnableCircuitBreaker
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
@Component
public class StoreIntegration {
@HystrixCommand(fallbackMethod = "defaultStores")
public Object getStores(Map<String, Object> parameters) {
//do stuff that might fail
}
public Object defaultStores(Map<String, Object> parameters) {
return /* something useful */;
}
}
@HystrixCommand
是由Netfix开源的javanica提供的。
Spring Cloud 通过这个注解自动包装了一个代理去关联Hystrix断路器。 断路器提供对调用链路的断开和闭合控制,主要用于调用失败处理。
可以通过配置
@HystrixCommand
的commandProperties
属性来列出一些列的@HystrixProperty
,来对Hystrix断路器进行配置。详情见此处。详细的属性配置项说明可以参见Hystrix的Wiki。
4.3.2 Propagating the Security Context or using Spring Scopes 安全上下文的传播机制或者Spring作用域配置
如果你想要让一些本地线程上下文传播到
@HystrixCommand
中,那么默认情况下是不行的,因为Hystrix是在一个普通的线程池中执行的。
你可以二选一来达到传播上下文的目的,要么配置Hystrix,让其使用同一个线程去处理调用;要么,干脆直接在注解中使用一个不同的隔离策略。例如:
@HystrixCommand(fallbackMethod = "stubMyService",
commandProperties = {
@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
}
)
...
同样的,如果你使用过
@SessionScope
或者@RequestScope
。你就会知道你这样做是因为,运行时异常会找不到作用域的上下文。
你还可以配置
hystrix.shareSecurityContext
为true
。这样做,将会让Hystris自动配置一个并发策略插件,当使用Hystris命令从主线程迁移SecurityContext
时自动同步。Hystris不允许多个并发策略同时存在,所以需要自己扩展一个HystrixConcurrencyStrategy
注册到Spring中。Spring Cloud会自动在Spring上下文中发现你的实现类,并自动包装成一个自定义Hystrix插件。
4.3.3 Health Indicator 健康指示器
断路器的状态也可以通过
/health
接口被应用查看到。
{
"hystrix": {
"openCircuitBreakers": [
"StoreIntegration::getStoresByLocationLink"
],
"status": "CIRCUIT_OPEN"
},
"status": "UP"
}
4.3.4 Hystrix Metrics Stream Hystrix实时数据监控(这个说法可能不靠谱^_^)
开启流量测量需要引入依赖:
spring-boot-starter-actuator
。将会提供一个/hystrix.stream
管理接口。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>