前言:本文的 Hystrix 断路器主要技术内容学习自教程视频:https://www.bilibili.com/video/BV1jJ411S7xr?p=13,此教程非常通俗易懂且有质量,也希望更多人能够支持这样高质量的UP,我在学习时收获很多,因视频形式不易复习回顾,因此加了一部分自己的见解并整理成图文博客的形式。
文章目录
1 Hystrix 概述
1.1 分布式系统面临的问题
1.2 服务雪崩
1.3 什么是 Hystrix
1.4 Hystrix 的应用
- 服务降级
- 服务熔断
- 服务限流
- 接近实时的监控
- …
2 Hystrix 服务熔断(在服务端实现!)
2.1 是什么
2.2 项目实战
注:本系列文章的项目部分是前后关联的,多数项目是从前面写过来的,因此也可去参考之前的【Spring Cloud】文章
1、参考之前的服务提供者模块 springcloud-provider-dept-8001
- 新建springcloud-provider-dept-hystrix-8001
- 将之前8001的所有东西拷贝一份
2、修改pom,添加Hystrix的依赖
<!--Hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
3、修改yml,修改eureka实例的id
4、修改DeptController
5、修改主启动类,添加新注解 @EnableCircuitBreaker,修改名称为 DeptProviderHystrix8001
6、测试:
-
启动Eureka集群,启动此服务提供者的主启动类 DeptProviderHystrix8001(含 Hystrix 服务熔断机制)进行测试。
-————可见,当访问不存在数据库中的 id 时,不会报错崩溃,具有很好的健壮性。
-
之后启动原本的服务提供者模块 springcloud-provider-dept-8001(不含熔断机制) 进行对比测试。
-————将会报 500 错误,如果后续的微服务模块也要用到这个结果的话,那么像这种情况,也会导致后续的微服务模块出现雪崩式的问题。
3 Hystrix 服务降级(在客户端实现!)
3.1 是什么
另外,服务降级处理是在客户端实现完成的,与服务端没有关系
3.2 项目实战
1、修改 springcloud-api 工程,根据已经有的 DeptClientService 接口新建一个实现了 FallbackFactory 接口的类 DeptClientServiceFallbackFactory
【注意:这个类上需要@Component注解!!!,方法无特殊情况不要返回 null,下图中的 queryAll() 返回返回 null 是不正确的!】
2、修改 springcloud-api 工程,DeptClientService 接口在注解 @FeignClient 中添加 fallbackFactory 属性值
3、springcloud-consumer-dept-feign-80 工程修改 yml
4、测试
4 对比:服务熔断,服务降级
服务熔断:在服务端实现
,一般是某个服务故障或者异常引起
,类似现实世界中的 “保险丝” , 当某个异常条件被触发,直接熔断整个服务,而不是一直等到此服务超时。
服务降级:在客户端实现
,所谓降级,一般是从整体负荷考虑
,就是当某个服务熔断之后,服务器将不再被调用,此时客户端自己准备一个本地的fallback回调,返回一个缺省值。这样做,虽然服务水平下降,但好歹可用,比直接挂掉要强。
5 Hystrix Dashboard 服务监控
5.1 是什么
对应 Spring Cloud 官网的一张图:
5.2 项目实战
1、新建工程 springcloud-consumer-hystrix-dashboard-9001,内容是复制之前服务消费者 80 模块,并此新模块的 pom 文件中新增以下依赖:
<!--Hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
2、application.yaml配置
server:
port: 9001
3、主启动类改名 + 新注解@EnableHystrixDashboard
4、为了让所有的Provider微服务提供模块(8001/8002/8003) 也都能被监控,因此
(1)也都需要配置监控依赖
(2)都要注入一个 Servlet Bean
5、测试,启动springcloud-consumer-hystrix-dashboard-9001该微服务监控消费端
启动 springcloud-provider-dept-hystrix-8001
访问 http://localhost:8001/dept/get/1
http://localhost:8001/actuator/hystrix.stream 【查看1秒一动的数据流】
我们在监控页面的主页输入这两个参数信息后,就可以来到详细监控页面
详细监控页面的信息会随着服务消费者模块的请求而动态变化,
如何分析监控页面:
更复杂的情况: