Hystrix用于处理分布式系统的延迟和容错的开源库,在分布式库里,许多依赖不可避免的会调用失败,例如:超时,异常,宕机,网络卡顿等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免联级故障,以提高分布式系统的弹性。
——概念
- 断路器:本身是一种开关装置,当某个服务发生故障后,通过断路器的故障监控(类似保险丝),向调用方法返回一个符合预期、可处理的备选响应(Fallback),而不是长时间的等待或者抛出调用方法无法处理的异常,保证服务调用方的线程不会被长时间的占用,避免了故障在分布式系统的蔓延,乃至雪崩。
服务降级
服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好的提示,Fallback
触发条件
- 程序异常
- 超时
- 服务熔断触发降级
- 线程池 / 信号量满
服务熔断
- 类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示
- 服务的降级->进而熔断->恢复调用链路
服务限流
秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行
——实操
- pom依赖
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- yml
#开启feign和hystrix
feign:
hystrix:
enabled: true
- 主启动增加
@EnableHystrix
注解
服务降级
// 调用当前方法等待响应时间不超过3s,超过3s后调用getTimeoutHandle方法处理
@HystrixCommand(fallbackMethod = "getTimeoutHandle", commandProperties =
{@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")})
// 注意:修改 @HystrixCommand建议重启微服务,热部署可能不生效
每个方法配置一个对应的服务降级方法,技术上可行,实际上代码冗余
// Hystrix全局降级处理
@DefaultProperties(defaultFallback = "globalFallbackHandle")
……
@HystrixCommand
服务熔断
- 达到最大访问后,直接拒绝访问,调用服务降级的方式返回友好提示
- 服务降级——>进而熔断——>恢复调用链路
// 断路器配置
@HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), // 开启断路器
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), // 请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), // 失败率达到多少后跳闸
})
- 失败率达到一定的比率后,再调用原本成功的页面也依然显示失败,调用次数超过该失败率,即可调用成功
服务限流
- 秒杀高并发等操作,严禁一窝蜂进行拥挤,排队一秒钟N个,有序进行(利用JMeter工具进行压力测试)
- 同一层次的其他接口服务被困死,此时客户端再进行调用时,响应缓慢,持续等待
工作流程
- 包装请求
- 发起请求
- 缓存处理
- 判断断路器是否打开(熔断)
- 判断是否进行业务请求(请求是否需要隔离或降级)
- 执行业务请求
- 健康监测
- 响应失败或成功的处理结果
图形化仪表盘
微服务提供类需要监控依赖配置(spring-boot-starter-actuator)