作用
保护服务整体可用性,防止服务之间调用故障而引发的故障蔓延。
功能
服务降级、服务熔断、线程和信号量隔离、请求缓存、请求合并等功能。
使用方式
@HystrixCommand或者HystrixCommand
触发降级的异常
(1)异常处理:run()方法抛出除了HystrixBadRequestException之外,其他都会触发调用降级逻辑,如果希望某个一次异常不触发降级,可以抛出HystrixBadRequestException不触发降级;使用注解是可以使用ignoreException=(BadRequestException.class),Hystrix会包装异常为HystrixBadRequestException抛出,这样就不会触发降级逻辑。
(2)异常获取:可以在getFallback()方法或者注解标识方法参数中增加Throwable对象,这样在方法内部就可以针对不同异常做不同处理。
依赖隔离
(1)通过实现对依赖服务的线程池隔离,不会因为个别依赖服务出现问题而引起非相关服务的异常。同时,也使得我们的应用变得更加灵活,可以在不停止服务的情况下,配合动态配置刷新实现性能配置上的调整。
(2)通过设置分组、命令名以及线程池信息实现资源分组,同时也便于组织和统计命令告警、仪表盘等信息。
请求缓存
请求缓存通过开启请求缓存,优化服务依赖调用,降低服务调用压力。
请求合并
将处于一个时间窗口(默认10ms)内对同一个依赖服务的多个请求进行整合并以批量方式发起请求功能(服务提供方也需要提供相应的批量实现接口)。
触发降级的异常
(1)异常处理:run()方法抛出除了HystrixBadRequestException之外,其他都会触发调用降级逻辑,
如果希望某个一次异常不触发降级,可以抛出HystrixBadRequestException不触发降级;使用注解是可
以使用ignoreException=(BadRequestException.class),Hystrix会包装异常为HystrixBadRequestException抛出,
这样就不会触发降级逻辑。
(2)异常获取:可以在getFallback()方法或者注解标识方法参数中增加Throwable对象,
这样在方法内部就可以针对不同异常做不同处理。
依赖隔离
(1)通过实现对依赖服务的线程池隔离,不会因为个别依赖服务出现问题而引起非相关服务的异常。同时,也使得我们的应用变得更加灵活,可以在不停止服务的情况下,配合动态配置刷新实现性能配置上的调整。
(2)通过设置分组、命令名以及线程池信息实现资源分组,同时也便于组织和统计命令告警、仪表盘等信息。
请求缓存
请求缓存通过开启请求缓存,优化服务依赖调用,降低服务调用压力。
请求合并
将处于一个时间窗口(默认10ms)内对同一个依赖服务的多个请求进行整合并以批量方式发起请求功能(服务提供方也需要提供相应的批量实现接口)。
属性配置
Command属性:对应服务降级、熔断、信号量功能
(1)run方法属性配置
方法执行的隔离策略(线程或信号量隔离);
是否启用超时;超时时间设置,使用信号量隔离策略时信号量数;
方法执行超时是否中断等。
(2)fallback属性配置
是否启用降级策略;
降级最大并发请求数等。
(3)circuitBreaker断路器属性
当服务请求命令失败时,是否使用断路器来跟踪其健康指标和熔断请求;
在滚动时间窗内收到多少请求失败打开熔断器;
熔断器打开的错误百分比等。
注:断路器的状态有关闭、打开和半开三种状态,断路器处于打开状态时,链路处于非健康状态,命令执行时,直接调用降级逻辑。
(4)metrics配置:断路器收集统计指标
执行HystrixCommand和HystrixObservableCommand中捕获的指标信息。(通过动态刷新配置不会产生效果,这样做是为了避免出现运行期检测数据丢失)。包括收集信息的时间窗口;在收集健康指标的时间窗口内,拆分桶的数量;是否采用百分比统计等。
(5)requestContext配置:对应请求缓存上下文,只有在同一个请求上下文缓存才会有效
Collapser属性
对应请求合并功能。包括合并请求最大数;批量执行的延迟时间、是否开启请求缓存等。
ThreadPool属性
对应线程隔离功能。包括执行命令的核心线程数;线程池最大队列大小;队列拒绝阀值等。
断路器响应过程