3. 断路器:Hystrix
3.1 禁用 Spring Cloud 断路器 Hystrix
将 spring.cloud.circuitbreaker.hystrix.enabled
设置为 false
可以禁用断路器 Hystrix 的自动配置
3.2 配置 Hystrix 断路器
3.2.1 默认配置
为所有的断路器提供一个默认配置,您需要创建一个 Customizer
bean 传递一个 HystrixCircuitBreakerFactory
或者 ReactiveHystrixCircuitBreakerFactory
。 configureDefault 方法将提供一个默认配置。
@Bean
public Customizer<HystrixCircuitBreakerFactory> defaultConfig() {
return factory -> factory.configureDefault(id -> HystrixCommand.Setter
.withGroupKey(HystrixCommandGroupKey.Factory.asKey(id))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withExecutionTimeoutInMilliseconds(4000)));
}
响应式例子
@Bean
public Customizer<ReactiveHystrixCircuitBreakerFactory> customizer() {
return factory -> factory.configure(builder -> builder.commandProperties(
HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(2000)), "foo", "bar");
}
4. 断路器:Hystrix 客户端
Netflix 实现了一个断路器模式的库 Hystrix。在微服务架构中,有多层服务调用是正常的,如下所示:
图1. 微服务图片
低级别的服务故障可以导致直到用户级别的服务故障。当调用特定的服务超过circuitBreaker.requestVolumeThreshold
(默认为20)并且在窗口期metrics.rollingStats.timeInMilliseconds
(默认为10)调用失败的比例超过 circuitBreaker.errorThresholdPercent
(默认为50%), 电路将断开且请求不会发送。在出现错误和开路的情况下,开发人员可以提供回调。
图2. Hystrix 回调防止级联故障
采用开路可以防止级联故障,并允许过载或故障服务有时间恢复。回调可以是另一个 Hystrix 受保护的调用、静态数据或合理的空值。可以对回调进行链接,以便第一个回调可以进行一些其他业务调用,这些业务调用将返回静态数据。(没太看懂)
4.1. 如何引入 Hystrix
在您的项目中引入 Hystrix, 需要包含以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
有关使用当前Spring Cloud发布系列设置构建系统的详细信息,请参照Spring Cloud Project。
以下示例为一个使用 Hystrix 断路器的最简 Eureka Server:
@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
注解由 Netflix 贡献的一个叫“javanica”的类库提供。Spring Cloud 自动将带有该注释的 Spring bean 包装在一个连接到 Hystrix 断路器的代理中。断路器决定何时打开和关闭回路,以及在出现故障的情况下做什么。
要配置 @HystrixCommand
,可以使用 commandProperties
属性和一列@HystrixProperty
注解。更多细节请看这里。有关可用属性的详细信息,请参阅 Hystrix wiki。