Hystrix熔断机制
一、分布式系统面临的问题
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候可能会出现错误。
二、服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B、C,微服务B、C又分别调用其他微服务。这就是所谓的扇出,如果扇出的链路上某个微服务的调用响应时间过长,或是不可用,那么微服务A的调用就会占用越来越多的资源,进而引起系统崩溃,这就是”雪崩效应“。
对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。
三、什么是Hystrix?
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等。Hystrix能够保证在一个依赖出故障的情况下,不会导致整体服务失败,避免级联故障,从而提高分布式系统的弹性
“断路器” 本身就是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控。断路器会向调用方返回一个服务预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间,不必要的占用。从而避免了故障在分布式系统中的蔓延,甚至雪崩。
四、Hystrix能用来做什么
- 服务降级
- 服务熔断
- 服务限流
- …
五、什么是服务熔断
服务熔断是应对雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的相应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。在SpringCloud中熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的情况,当失败的调用达到一定的阈值,(5秒内20次失败)就会启动熔断机制。
熔断机制注解是:@HystrixCommand。
六、测试项目
复制springcloud-provider-dept-8003项目 到 springcloud-provider-dept-hystrix-8003项目。(在不破坏原来的服务提供者项目的基础上进行测试,所以 以下代码都是在springcloud-provider-dept-hystrix-8003项目上进行测试)
6.1.导入依赖
1 | <!--hystrix--> |
6.2.配置文件(不需要修改)
6.3.控制层:
回顾控制层遇到的问题:如查询一个用户,如果用户id不存在,系统就会出现错误。
有以下两种解决办法:
- 如果用户id不存在,就抛出异常。(这样容易导致页面报错、服务器崩等)
- 利用熔断机制:如果当前方法出错,就调用备选方法。
1 | // 此Controller提供Restful服务 |
6.4.在启动类中,开启对熔断的支持。
1 |
|
6.5.启动相应的服务:输入 http://localhost/consumer/dept/get/8 。结果如下
七、熔断降级
服务降级,就是整体的资源不够用了,那么要适当地关掉一些服务。
那么这个其实是由客户端相关的,在客户访问的时候,我们可以返回客户信息,告知服务已停掉。
测试:
7.1.在springcloud-api
项目的Service层,添加一个 提醒服务端关闭的 回调工厂
- 编写一个类,实现FallbalkFactory接口。
- 重写一个方法,返回类型是Feign的那个接口 ,并重写方法(方法中返回用户的提示信息)。
1 | // 降级 |
7.2.在springcloud-api
项目的Service层,在注解@FeignClient
中添加fallbackFactory
属性值 :
1 | // 客户端服务 |
7.3.在springcloud-consumer-dept-feign
客户端项目 配置文件中,开启服务降级:
1 | server: |
7.4.启动所有相关项目。
访问http://localhost/consumer/dept/get/3
7.5.关闭springcloud-provider-dept-8001
服务提供者项目。
访问http://localhost/consumer/dept/get/3
服务熔断 与 服务降级
服务熔断 | 服务降级 | |
---|---|---|
位置 | 服务端 | 客户端 |
概念 | 某个服务超时或异常,引起熔断 | 从整体网站请求的负载考虑。 当某个服务熔断或者关闭后,服务将不再被调用。 此时在客户端,我们可以准备一个FallbackFactory,返回一个默认值(缺省值)。 虽然整体服务水平下降了,但好歹能用,比直接挂掉强。 |
范围 | 针对某一方法 | 针对一个类 |
备注 | 负载均衡是要加钱买服务器的,这个就是在没钱的时候凑合一下,保护核心功能。 |
八、Dashboard流监控
监控属于客户端。
新建项目springcloud-consumer-hystrix-dashboard,用做监控。
8.1.首先引入dashboard依赖 :
1 | <dependency> |
完整依赖如下:
1 | <!--实体类 + web--> |
8.2.配置文件 application.yml
1 | server: |
8.3.创建启动类 并开启监控
1 |
|
8.4.既然要监控,服务端必须要有被监控的依赖。(三个服务提供者都要加上这个依赖)
以项目springcloud-provider-dept-8001
为例
1 | <!-- 完善监控信息 --> |
8.5.服务端要有 配合监控使用的 Servlet。
以项目springcloud-provider-dept-8001
的启动类为例
1 |
|
8.6.测试:
启动所有相关项目。
访问:http://localhost:9001/hystrix
- Delay:该参数用来控制服务器上轮询监控信息的延迟时间,默认为2000毫秒,可以通过配置该属性来降低客户端的网络和CPU消耗。
- Title:该参数对应了头部标题Hystrix Stream之后的内容,默认会使用具体监控实例的URL,可以通过配置该信息来展示更合适的标题。
访问:http://localhost:8001/dept/get/1 并不断刷新,观察监控页面的效果。
实心圆:共有两种含义:
- 它通过颜色的变化代表了实例的健康程度,它的健康度从绿色。
- 它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过该实心圆的展示,就可以在大量的实例中快速的发现故障实例和高压力实例。
曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势。