什么是
Hystrix
分布式微服务架构面临的问题
在微服务架构中,根据业务来拆分成一个个的服务,而服务与服务之间存在着依赖关系 (比如用户调商品, 商品调库存,库存调订单等等),在Spring Cloud
中多个微服务之间可以用
RestTemplate+Ribbon
和
Feign来调用。
![](https://i-blog.csdnimg.cn/direct/1b68033b3ff94b1da3968e4ee7ee41df.png)
在服务之间调用的链路上由于网络原因、资源繁忙或者自身的原因,服务并不能保证
100%
可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,导致响应时间过长或不可用,此时若有大量的请求涌入,容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“
雪崩
”
效应。
为了解决这个问题,业界提出了熔断器模型
Hystrix
作用
Hystrix
是
Netflix
公司开源项目
(
https://github.com/Netflix/Hystrix
)
,实现了熔断器模型,
Spring Cloud
对这一
组件进行了整合。
服务熔断
服务监控
……
服务熔断
什么是服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制。在微服务架构中,一个请求需要调用多个服务是非常常见的,如下图:
![](https://i-blog.csdnimg.cn/direct/7b32f5d0d7264c4e996022795f3e6234.png)
当服务之间调用的链路上某个微服务不可用或者响应时间太长时,会导致连锁故障。当失败的调用到一定阈值(缺省是5
秒内
20
次调用失败
)
就会启动熔断机制。在
SpringCloud
框架里熔断机制通过
Hystrix
实现,
Hystrix
会监控微服务间调用的状况。熔断机制的注解是 @HystrixCommand
![](https://i-blog.csdnimg.cn/direct/86e2cdd4fd7c459db9a5a816f105263b.png)
熔断器打开后,可用避免连锁故障,
fallback
方法可以直接返回一个固定值。
服务熔断实战
创建
Hystrix
模块
新建
microservice-cloud-08-provider-product-hystrix-8001
参考
microservice-cloud-03-provider-product-8001
,相当于在此工程上添加
Hystrix
服务熔断机制
配置
pom.xml
文件
添加配置
![](https://i-blog.csdnimg.cn/direct/803ae7fc864344dfb5dbb4a8c2ecb4d2.png)
完整配置
![](https://i-blog.csdnimg.cn/direct/7cbc01d71c65475abe30ec9dcca8108a.png)
![](https://i-blog.csdnimg.cn/direct/53892c62951345c39be4f791e99cd772.png)
![](https://i-blog.csdnimg.cn/direct/0cebe76b0fe74ec8b136582a9211ae90.png)
配制
application.yml
文件
便于区分
,
在实例名后面添加
-
hystrix
![](https://i-blog.csdnimg.cn/direct/1f9bdccd9a6f43788f340d0ac6652152.png)
![](https://i-blog.csdnimg.cn/direct/8e199ebcd6074211ad849bd1b47f2a18.png)
修改
ProductController
出现异常后如何处理?
使用
@HystrixCommand
注解
一旦调用服务方法失败并抛出了错误信息后,会自动调用
@HystrixCommand
注解中
fallbackMethod属性指定的当前类中的方法
整合代码
![](https://i-blog.csdnimg.cn/direct/2e4d4d2d80804bb88cb2cd95e1997bf9.png)
![](https://i-blog.csdnimg.cn/direct/bff471e806ae4d779e286f5da4462df8.png)
![](https://i-blog.csdnimg.cn/direct/8f83768efa3540ef9f94c9ab1ff10f27.png)
修改启动类
启动类重命名为
ProductProvider_8001_Hystrix
, 并添加新注解
@EnableHystrix
开启
Hystrix
熔断机制的支持
![](https://i-blog.csdnimg.cn/direct/9846f6ac805743398be98fde7ea1c65f.png)
![](https://i-blog.csdnimg.cn/direct/83f599cd1c95417c921d85ed7e9e1c80.png)
功能测试
先启动
2
个
Eureka
主启动类
ProductProvider_8001_Hystrix
![](https://i-blog.csdnimg.cn/direct/9841d3e8977a48999262ed9068fa7802.png)
启动消费者
microservice-cloud-04-consumer-product-80
访问:
http://localhost/consumer/product/get/-1
![](https://i-blog.csdnimg.cn/direct/b9354fb756e34634bf8c603cc9fe0177.png)
Feign
客户端服务熔断
Feign
是自带断路器的,也就是针对 消费者(客户端)进行服务熔断,需要在配置文件中开启它,在配置文件加以下代码:
![](https://i-blog.csdnimg.cn/direct/1abf7551516a4cec910a1d149e03d2ac.png)
重构
consumer-product-feign
工程
基于
microservice-cloud-07-consumer-product-feign
工程进行改造
只要在已存在的
ProductClientService
接口上的
@FeignClient
注解中,加上
fallback
指定熔断处
理类即可:
ProductClientServiceFallBack.class
![](https://i-blog.csdnimg.cn/direct/38edae1d99f94f059e97a493ccaaab08.png)
![](https://i-blog.csdnimg.cn/direct/123dbecb249148a3a144f03593d9e4ce.png)
![](https://i-blog.csdnimg.cn/direct/776b85de9b844a6a96fc4ecf886334f2.png)
创建
ProductClientServiceFallBack
类,并实现
ProductClientService
接口
创建
ProductClientServiceFallBack
类,并实现
ProductClientService
接口,
注意使用
@Component
注解将它注入到容器中
![](https://i-blog.csdnimg.cn/direct/8e56b2afcb364a789e2ec1900fff50a0.png)
![](https://i-blog.csdnimg.cn/direct/269d1b7fdb35425fa48158463844d48e.png)
修改
YML
文件
在
Feign
中需要开启
Hystrix
![](https://i-blog.csdnimg.cn/direct/8efb39a3f3cd4b68a6e694a06c89da9d.png)
![](https://i-blog.csdnimg.cn/direct/7fe4faff701344148d750c740ce62615.png)
功能测试
启动
2
个
eureka
启动服务提供者
microservice-cloud-03-provider-product-8001
启动
microservice-cloud-07-consumer-product-feign
正常访问测试:
http://localhost/consumer/product/get/2
![](https://i-blog.csdnimg.cn/direct/ebdeac5bd5aa4ed0898a70b125fdcd26.png)
故意关闭
服务提供者
microservice-cloud-03-provider-product-8001
客户端自己调用提示
http://localhost/consumer/product/get/2
![](https://i-blog.csdnimg.cn/direct/fea533fd0d2b415889b3d3de4868c72b.png)
此时服务端 提供者 已经
down
了,但是我们做了服务熔断处理,让客户端在服务端不可用时,也会获得提示信息而不会挂起耗死服务器
Hystrix Dashboard
监控平台搭建
什么是服务监控
除了隔离依赖服务的调用以外,
Hystrix
还提供了
准实时的调用监控(
Hystrix Dashboard
),
Hystrix
会持续地记录所有通过Hystrix
发起的请求的执行信息,
并以统计报表和图形的形式展示给用户
,包括每秒执行多少请求多少成功,多少失败等。
Netflix
通过
hystrix
-
metrics
-
event
-
stream
项目实现了对以上指标的监控。
Spring Cloud
也提供了
Hystrix Dashboard
的整合,对监控内容转化成可视化界面。
服务监控实战
创建
hystrix-dashboard
模块
创建
microservice-cloud-09-hystrix-dashboard-9001
监控模块
配置
pom.xml
文件
添加配置
![](https://i-blog.csdnimg.cn/direct/edc407cbcacf4f05868f54e3b779f897.png)
完整配置
![](https://i-blog.csdnimg.cn/direct/c68e59a07e434e07ba99f4e79dcef233.png)
![](https://i-blog.csdnimg.cn/direct/06e2bac1600949239981b146b5ef6d28.png)
配置
application.yml
文件
![](https://i-blog.csdnimg.cn/direct/2130bb50312049e9b944432e9e41f5e0.png)
创建启动类
创建一个启动类
HystrixDashboard_9001
添加
@EnableHystrixDashboard
注解开启服务监控
![](https://i-blog.csdnimg.cn/direct/1741625c4af54e70acc18144f328398f.png)
![](https://i-blog.csdnimg.cn/direct/499d770ea12642819bc0bd2c695ceb96.png)
启动监控微服务
启动微服务监控
microservice-cloud-09-hystrix-dashboard-9001
访问:
http://localhost:9001/hystrix
效果如下:出现一个图形页面: 豪猪
![](https://i-blog.csdnimg.cn/direct/88b3cf3b8c704f589b86c057ae62fa86.png)
为要被监控的服务添加配置
在需要监控的服务
pom.xml
中的
dependencies
节点中新增
spring
-
boot
-
starter
-
actuator
监控依赖,以开启监控相关的端点,并确保已经引入断路器的依赖 spring
-
cloud
-
starter
-
netflix
-
hystrix
核实服务提供者
microservice-cloud-08-provider-product-hystrix-8001
是否已添加监控相关依赖配置
![](https://i-blog.csdnimg.cn/direct/b08d0015f31746ea81f1d9fa9a2dcc1e.png)
在需要监控的服务
application.yml
配制中添加暴露端点
在服务提供者
microservice-cloud-08-provider-product-hystrix-8001
添加如下配置:
![](https://i-blog.csdnimg.cn/direct/b6c4dcbe91054bc09bc055bf04a18b8e.png)
JSON
格式监控信息测试
启动监控服务:
microservice-cloud-09-hystrix-dashboard-9001
启动
2
个
Eureka
启动
microservice-cloud-08-provider-product-8001
先访问:
http://localhost:8001/product/get/1
再访问:
http://localhost:8001/actuator/hystrix.stream
看效果
每隔
2
秒进行
ping
获取
json
格式数据(
9001
监控
8001
),但是阅读性不好,如果数据可以图形化显示效果就更完美
![](https://i-blog.csdnimg.cn/direct/0b26086e983a423984610ef2c1ba4d53.png)
图形化监控测试
请求多次
:
http://localhost:8001/product/get/1
观察监控窗口
请求
http://localhost:9001/hystrix
![](https://i-blog.csdnimg.cn/direct/50fbb23b31f04962b38569c52b39f2e3.png)
第一个输入框填写监控地址
:
http://localhost:8001/actuator/hystrix.stream
Delay
:控制服务器上轮询监控信息的延迟时间,默认为
2000
毫秒,可以通过配置该属性来降低客
户端的网络和
CPU
消耗。
Title
:可以通过配置该信息来展示更合适的标题,默认会使用具体监控实例的
URL
监控结果如果没有请求会一直显示 “Loading…”
这时访问一下
http://localhost:8001/product/get/1
,可以看到出现了下面的效果:
![](https://i-blog.csdnimg.cn/direct/11d6c3a6179d43a69303d09ef2087dcc.png)
如何查看监控页面
7
色
:右上角
1
圈
实心圆:共有两种含义。
它通过
颜色的变化代表了实例的健康程度
,
它的健康度从绿色
<
黄色
<
橙色
<
红色递减。
该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,
流量越大该实心圆就越
大
。所以通过该实心圆的展示,就可以在大量的实例中快速的发现
故障实例和高压力实例
。
1
线
曲线:用来记录
2
分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势。
整图说明
![](https://i-blog.csdnimg.cn/direct/e6cc856d65754e91bcc783351e39932c.png)
由一个扩展复杂的多个图
![](https://i-blog.csdnimg.cn/direct/69cd52da28194dfc9ed4d427f15a5c0e.png)
常见错误
报:
Unable to connect to Command Metric Stream
解决方式:按
7.4.2.6
节操作
看被监控服务中是否添加
spring-cloud-starter-netflix-hystrix
与
spring-boot-starter-actuato
依赖,并且暴露的端
点是否有配置:
management.endpoints.web.exposure.include=hystrix.stream
![](https://i-blog.csdnimg.cn/direct/8851aaea171448d88ffa5b3ac7264cb5.png)