Hystrix
简介
雪崩:一个服务失败导致整条链路的服务都失败的情况,称之为服务雪崩。
Hystrix是一个用于处理分布式系统的延迟和容错的开源库。它能保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
-
服务降级:服务器有问题时,不让客户端等待而立即返回一个友好提示,fallback。程序运行异常,超时,服务熔断触发服务降级,线程池或信号量打满。
-
服务熔断:达到最大服务访问后,直接拒绝访问,拉闸断电,再调用服务降级的方法。服务降级->熔断->恢复调用链路。
-
服务限流:严禁高并发一起访问,而是进行排队有序进行。
案例
-
服务提供者,先构建一个简单的eureka的client,有两个访问,一个立即返回字符串a,一个等待3s再返回字符串b。
-
Jmeter压力测试,发送2w个线程给b,明显感觉对a的访问慢了很多。
-
新建feign的消费者,再次压力测试,对a的访问慢了
服务降级
- 对于提供者,在方法上加
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000") //3秒钟以内就是正常的业务逻辑
})
即可指定兜底方法。主启动类加**@EnableCricuitBreaker**
- 对于消费者,可能可提供者有不同的要求,也可以自己指定。基本过程如上,但是主启动类加@Enablehystrix,yml文件要加
feign: hystrix: enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。
- 全局的降级方法
在业务类上加@DefaultProperties(defaultFallback = “payment_Global_FallbackMethod”) 即可指定默认的降级方法,在直接用@HystrixCommand即可实现降级。对于想特殊对待的在用2中方法指定即可。
- 将降级和业务代码解耦
在Feign中,实现加了@FeignClient的接口为类A,在@FeignClient中新增属性fallback=A.class即可自动将A中方法对应为降级方法,注意A要加@Component。
熔断+总结
服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制,当满足一定条件时,就会熔断该服务,快速返回错误信息,当检测到服务恢复正常时,恢复链路。
提供者配置
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",
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"), //失败率达到多少后跳闸 })
- 测试:多次错误后,再输入正确参数,开始仍然报错,过段时间变好。
结论
- 熔断类型
-
打开:请求不在调用当前服务,内部设置时钟一般设置为MTTR平均故障处理时间,当打开时长达到所设时钟则进入熔断状态。
-
关闭:不会对服务进行熔断
-
半开:根据规则调用服务,若符合规则认为当前服务恢复正常,关闭熔断。一般关闭5s后进入半开状态。
- 三个重要参数
-
快照时间窗:断路器确定是否需要打开并统计一些请求和错误数据,统计的时间范围就是快照时间窗,默认为最近的10s。
-
请求总数阀值:在时间窗内,必须满足阀值才有资格熔断,默认为20次请求。
-
错误百分比阀值:满足以上两个条件时,请求错误率达到阀值就会开启熔断,默认为50%。
- 如何恢复主逻辑
当熔断即断路器打开时,会启动一个休眠时间窗,在此期间,降级逻辑成为临时的主逻辑。当休眠到期时进入半开状态,并将下一次请求转发到原来的主逻辑上,若此次正常返回,则断路器闭合,若仍然异常,则断路器继续打开。
服务监控HystrixDashboard
简介
准实时的调用监控,Hystrix会持续记录各种数据并以统计报表和图形的形式展现给用户。
创建
-
引入依赖
-
主启动类加@EnableHystrixDashboard
-
如何监控:
修改服务提供者:主启动类加
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
在输入栏输入http://localhost:8001/hystrix.stream即可看到数据。
说明
熔断配置+工作流程图解