微服务之熔断器篇-Hystrix
雪崩效应与熔断机制
什么是雪崩效应?
微服务内部调用时,由于某一个服务出现故障,导致请求调用阻塞,最终服务崩溃,且故障沿着调用链路蔓延,影响到其它依赖该服务的服务,导致整个微服务系统的瘫痪,称之为雪崩效应。
如何解决雪崩效应?
针对出现故障的服务提供熔断机制,当发现服务状态不正常、处理不及时情况时中断运行,采用服务降级策略,直至服务状态回归正常。
Hystrix 简介
Hystrix (豪猪),是Netflix提供的开源熔断器组件,向微服务提供熔断机制并预防雪崩,用来保证微服务整体架构健康。
Hystrix [hɪst'rɪks],中文含义是豪猪,豪猪的背上长满了棘刺,使它拥有了强大的自我保护能力。而 Spring Cloud Hystrix 作为一个服务容错与保护组件,也可以让服务拥有自我保护的能力,因此也有人将其戏称为“豪猪哥”。
其主要功能有:
- 预防微服务由于故障,请求长时间等待导致Web容器线程崩溃
- 为故障提供备选方案,通过fallback机制,提供服务降级
- 提供仪表盘DashBoard,实时监控运行状态
服务降级:将出现故障服务,通过简单、轻量级且稳定的处理方式,对其进行屏蔽。而不是长时间的阻塞或抛出调用方无法处理的异常。这样可以保证线程不会被长时间占用,避免故障在调用链路蔓延,防止雪崩的发生。
Hystrix 熔断器工作原理
如图所示,熔断器具有三种状态:CLOSED关闭、OPEN打开、HALF-OPEN半开。三种状态依次发生转变。
服务启动后熔断器默认为CLOSED
关闭状态。
当过去20次请求错误率(触发服务降级次数)超过50%时,则认为当前服务是不稳定的,Hystrix会将熔断器状态切换为OPEN
打开状态。熔断器被开启后将不再发起任何实质的请求,直接进行服务降级,熔断窗口期为5秒。
窗口期过后再次尝试访问故障服务,同时将状态切换为HALF-OPEN
半开,如果目标服务能够返回正常的响应,则将状态切换为CLOSED
关闭熔断器。反之则重新将状态切换为OPEN
,继续进行熔断。
什么情况下会触发服务降级?
- FAILURE:执行失败,抛出异常
- TIMEOUT:执行超时(默认1秒)
- SHORT_CIRCUITED:熔断器状态为OPEN
- THREAD_POOL_REJECTED:线程池拒绝
- SEMAPHORE_REJECTED:信号量拒绝
信号量:通过一个整数,记录当前有多少个请求正在被处理。
OpenFeign中使用Hystrix
操作流程
-
OpenFeign内置了Hystrix,默认关闭,需要手动开启。
-
在
@FeignClient
注解中添加fallback
属性说明Fallback类。 -
Fallback类要实现相同接口,重写服务降级业务逻辑。
具体步骤(以下为示例代码,实际开发请遵循编码规范)
假设存在用户服务(user-service),提供/user/queryList
查询并返回用户信息。
{
"code": "200",
"result": [
{
"id": "1",
"name": "张三"
},
{
"id": "2",
"name": "李四"
}
]
}
-
创建工程,引入OpenFeign依赖(注册中心依赖与相关配置不再赘述)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
开启Hystrix
feign: hystrix: enabled: true
-
启动类添加
@EnableFeignClients
注解 -
创建Feign客户端,在
@FeignClient
注解中设置fallback
属性来指定服务降级处理类@FeignClient(name = "USER-SERVICE", fallback = UserServiceFallback.class) public interface UserService { @GetMapping("/user/queryList") CallbackResult queryUserList(); }
-
创建降级处理类
该类需要实现Feign客户端,将其放入Spring容器,并重新方法为服务降级业务代码。
@Component public class UserServiceFallback implements UserService { @Override public CallbackResult queryUserList() { return new CallbackResult("500", "用户信息查询失败,请稍后再试"); } }
-
此时,当目标服务故障,则会自动降级,返回较为友好的响应信息。
Hystrix超时设置
-
连接时间:服务之间的通信时间。
-
读取时间:服务的业务处理时间。
熔断时间需要≥总时间,否则会出现业务未处理完成就被熔断情况。关于业务处理时间的计算依据通常为若干次(不包含第一次)请求的响应时间最大值。
Hystrix熔断设置项
超时选项 | 说明 |
---|---|
feign.client.config.[微服务ID|default].connectTimeout | Ribbon连接超时时间默认1秒,建议1秒内 |
feign.client.config.[微服务ID|default].readTimeout | Ribbon读取超时时间默认1秒,按业务处理时间设置 |
hystrix.command.[commandKey|default].execution.isolation.thread.timeoutInMilliseconds | Hystrix熔断超时时间默认1秒 |
hystrix.command.[commandKey|default].circuitBreaker.forceOpen | 强制打开熔断器默认关闭,服务下线时手动开启 |
application.yml 配置如下
feign:
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 500
readTimeout: 500
hystrix:
command:
#"类名#方法名(参数类型1,参数类型2,参数类型n)"
"MessageService#sendSMS(String,String)":
execution:
isolation:
thread:
timeoutInMilliseconds: 1000
circuitBreaker:
forceOpen: false #true代表强制熔断器强制处于Open状态,即服务不可用
requestVolumeThreshold: 50
errorThresholdPercentage: 60
sleepWindowInMilliseconds: 10000
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
参考文章:
本文作者:漆原Blog
本文链接:https://www.cnblogs.com/7moon/p/16636908.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步