Netflix建立了一个名为Hystrix的库,用于实现断路器模式,在微服务架构中,一般有多层服务调用,如如下示例所示:html
较低级别的服务中的服务故障可能致使级联故障一直到用户,当对特定服务的调用超过circuitBreaker.requestVolumeThreshold
(默认值:20个请求)而且在metrics.rollingStats.timeInMilliseconds
(默认值:10秒)定义的滚动窗口中,失败百分比大于circuitBreaker.errorThresholdPercentage
(默认值:> 50%)时,电路打开,没有调用,在出现错误和开路的状况下,开发人员能够提供回退。java
拥有一个开放的电路能够中止级联故障,并容许过载或故障服务有时间恢复,回退能够是另外一个受Hystrix保护的调用、静态数据或合理的空值,回退能够被连接,以便第一个回退执行一些其余业务调用,而这些业务调用又反过来回退到静态数据。git
要在项目中包含Hystrix,请使用组ID为org.springframework.cloud
和工件ID为spring-cloud-starter-netflix-hystrix
的启动器。github
如下示例显示了具备Hystrix断路器的最小Eureka服务器:web
@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
由名为“javanica”的Netflix contrib库提供,Spring Cloud在链接到Hystrix断路器的代理中自动包装带有该注解的Spring bean,断路器计算什么时候打开和关闭电路以及在发生故障时应采起的措施。spring
要配置@HystrixCommand
,能够将commandProperties
属性与@HystrixProperty
注解列表一块儿使用,有关详细信息,请参见此处,有关可用属性的详细信息,请参阅Hystrix wiki。segmentfault
若是但愿某些线程本地上下文传播到@HystrixCommand
,则默认声明不起做用,由于它在线程池中执行该命令(在超时的状况下),你能够经过配置或直接在注解中切换Hystrix以使用与调用者相同的线程,方法是让它使用不一样的“隔离策略”,如下示例演示如何在注解中设置线程:安全
@HystrixCommand(fallbackMethod = "stubMyService", commandProperties = { @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE") } ) ...
若是你使用@SessionScope
或@RequestScope
,则一样适用,若是遇到运行时异常,表示没法找到做用域上下文,则须要使用相同的线程。服务器
你还能够选择将hystrix.shareSecurityContext
属性设置为true
,这样作会自动配置Hystrix并发策略插件挂钩,将SecurityContext
从主线程传输到Hystrix命令使用的线程。Hystrix不会注册多个Hystrix并发策略,所以能够经过将本身的HystrixConcurrencyStrategy
声明为Spring bean来实现扩展机制,Spring Cloud在Spring上下文中查找你的实现,并将其包装在本身的插件中。架构
链接断路器的状态也暴露在调用应用程序的/health
端点中,如如下示例所示:
{ "hystrix": { "openCircuitBreakers": [ "StoreIntegration::getStoresByLocationLink" ], "status": "CIRCUIT_OPEN" }, "status": "UP" }
要启用Hystrix指标流,请包含对spring-boot-starter-actuator
的依赖关系并设置management.endpoints.web.exposure.include: hystrix.stream
,这样作会将/actuator/hystrix.stream
公开为管理端点,如如下示例所示:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
Hystrix的主要好处之一是它收集了关于每一个HystrixCommand的指标集,Hystrix仪表板以高效的方式显示每一个断路器的健康情况。