微服务:Eureka,Ribbon,Hystrix( 十 )

使用 Postman 测试:
GET http://localhost:9100/page/loadProductServicePort3
 
Hystrix 舱壁模式Hystrix 舱壁模式即线程池隔离策略 。
如果不进行任何设置,所有熔断方法使用一个 Hystrix 线程池(10 个线程),那么这样的话会导致问题,这个问题并不是扇出链路微服务不可用导致的,而是线程机制导致的,如果方法 A 的请求把 10 个线程都用了,方法 2 请求处理的时候压根都没法去访问 B,因为没有线程可用,并不是 B 服务不可用:
----> 带有 @HystrixCommand 注解方法1 --10个请求--> Hystrix 默认的线程池----> A 服务?----> 带有 @HystrixCommand 注解方法2 --10个请求--> Hystrix 默认的线程池----> A 服务?所有加有 @HystrixCommand 的方法会共同维护一个线程池;默认线程池有 10 个线程,默认队列值为 -1;如果不进行任何设置,Hystrix 默认的线程池实现不适合在生产环境中使用 。为了避免问题服务请求过多导致正常服务无法访问,Hystrix 不是采用增加线程数,而是单独的为每一个控制方法创建一个线程池的方式,这种模式叫做“舱壁模式",也是线程隔离的手段;即在 @HystrixCommand 中设置 threadPoolProperties 属性
 
Hystrix 工作流程与高级应用出现调用错误 ----> 是否达到最小请求数 没有达到最小请求数 ----> 没有遇到问题达到最小请求数 ----> 错误数量是否达到阈值错误数量没有达到阈值 ----> 没有遇到问题错误数量达到阈值 ----> 跳闸跳闸 ----> 远程服务是否已经正常远程服务不正常 ----> 跳闸远程服务正常 ----> 重置断路器,调用可以通过10 秒时间窗口:检测是否达到最小请求数和错误数量是否达到阈值 。5 秒活动窗口:检测远程服务是否已经正常 。1)当调用出现问题时,开启一个时间窗(10s)
2)在这个时间窗内,统计调用次数是否达到最小请求数?如果没有达到,则重置统计信息,回到第 1 步;如果达到了,则统计失败的请求数占所有请求数的百分比 。然后统计是否达到阈值? 如果达到,则跳闸(不再请求对应服务);如果没有达到,则重置统计信息,回到第 1 步 。
3)如果跳闸,则会开启一个活动窗口(默认 5s),每隔 5s,Hystrix 会让一个请求通过,到达那个问题服务,看是否调用成功,如果成功,重置断路器回到第 1 步,如果失败,回到第 3 步 。
可以自定义的断路器行为:

  • 出现错误时,时间窗口的长度 。
  • 最小请求数 。
  • 错误请求的百分比 。
  • 跳闸后,活动窗口的长度 。
@HystrixCommand(// 超时时间的设置commandProperties = {// 设置请求的超时时间,一旦请求超过此时间那么都按照超时处理,默认超时时间是 1s@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = https://www.isolves.com/it/cxkf/jiagou/2021-03-03/"2000"),// 统计窗口时间的设置@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value = "8000"),// 统计窗口内的最小请求数@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "2"),// 统计窗口内错误请求阈值的设置50%@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50"),// 自我修复的活动窗口时间@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "3000")},)上述通过注解进行的配置也可以配置在配置文件中:
# 配置熔断策略:hystrix:command:default:circuitBreaker:# 强制打开熔断器,如果该属性设置为 true,强制断路器进入打开状态,将会拒绝所有的请求 。默认 false 关闭的forceOpen: false# 触发熔断错误比例阈值,默认值 50%errorThresholdPercentage: 50# 熔断后休眠时长,默认值 5 秒sleepWindowInMilliseconds: 3000# 熔断触发最小请求次数,默认值是 20requestVolumeThreshold: 2execution:isolation:thread:# 熔断超时设置,默认为 1 秒timeoutInMilliseconds: 2000基于 spring boot 的健康检查观察跳闸状态(自动投递微服务暴露健康检查细节):
# springboot 中暴露健康检查等断点接口management:endpoints:web:exposure:include: "*"# 暴露健康接口的细节endpoint:health:show-details: always使用 Postman 访问健康检查接口:
GET http://localhost:9100/actuator/health
 
Hystrix 线程池队列配置案例有一次在生产环境,突然出现了很多笔还款单被挂起,后来排查原因,发现是内部系统调用时出现了 Hystrix 调用异常 。在开发过程中,因为核心线程数设置的比较大,没有出现这种异常 。放到了测试环境,偶尔有出现这种情况 。


推荐阅读