Spring Cloud Hystrix
什么是Hytrix
分布式微服务架构面临的问题
在微服务架构中,根据业务来拆分成一个个的服务,而服务与服务之间存在着依赖关系 (比如用户调商品,商品调库存,库存调订单等等),在Spring Cloud中多个微服务之间可以用 RestTemplate+Ribbon 和 Feign
来调用。
在服务之间调用的链路上由于网络原因、资源繁忙或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,导致响应时间过长或不可用,此时若有大量的请求涌入,容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。
为了解决这个问题,业界提出了熔断器模型。
什么是服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制。在微服务架构中,一个请求需要调用多个服务是非常常见的,如下图:
当服务之间调用的链路上某个微服务不可用或者响应时间太长时,会导致连锁故障。当失败的调用到一定阈值(缺省是5秒内20次调用失败) 就会启动熔断机制。在 SpringCloud 框架里熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况。熔断机制的注解是 @HystrixCommand
熔断器打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值。
服务熔断实战
创建 Hystrix 模块,microservice-cloud-08-provider-product-hystrix-8001,添加pom依赖
修改yml,便于区分添加后缀
修改controller
修改启动类
功能测试,Get不存在的id时候,抛出异常,进入fallback方法
Feign客户端服务熔断
Feign 是自带断路器的,也就是针对 消费者(客户端)进行服务熔断,需要在配置文件中开启它。
修改application.yml
在已存在的 ProductClientService 接口上的 @FeignClient 注解中,加上 fallback 指定熔断处理类即可: ProductClientServiceFallBack.class
创建 ProductClientServiceFallBack 类
功能测试,80无法访问8001服务时,进入fallback处理类
Hystrix Dashboard监控平台搭建
除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix Dashboard),Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少
请求多少成功,多少失败等。
Netflix 通过 hystrix-metrics-event-stream 项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard 的整合,对监控内容转化成可视化界面。
创建 hystrix-dashboard 模块,添加pom依赖
配置application.yml
创建启动类
启动微服务监控,如下正常访问
为要被监控的服务添加配置,在需要监控的服务 pom.xml 中的 dependencies 节点中新增 spring-boot-starter-actuator 监控依赖,
以开启监控相关的端点,并确保已经引入断路器的依赖 spring-cloud-starter-netflix-hystrix
需要监控的服务 application.yml 配制中添加暴露端点
功能测试
- 正常访问 http://localhost:8001/product/get/1
- 正常访问 http://localhost:8001/actuator/hystrix.stream
- 测试可视化监控界面 http://localhost:9001/hystrix
- 七色的含义如图。
- 实心圆的颜色表示健康程度:绿>黄>橙>红,实心圆的大小表示请求流量:流量越大实心圆就越大。所以通过实心圆的展示,可以判断故障实例和高压力实例。
- 曲线表示2分钟内流量的相对变化,可以通过它来观察上升下降趋势。