SpringCloud 整合Hystrix/Sentinel限流与熔断器
一、Hystrix
简介:Hystrix是Netflix开源的一个延迟和容错库,旨在隔离远程系统、服务和第三方库,阻止级联故障,在复杂系统中实现恢复能力,负责监控服务之间的调用情况,连续多次失败的通过Feign的Fallback方法进行熔断保护。
1. 来源
A. 服务雪崩效应:在微服务中,服务间调用关系错综复杂,一个请求,可能需要调用多个微服务接口才能实现,会形成非常复杂的调用链路,服务器支持的线程和并发有限,请求一直阻塞,会导致服务资源耗尽,从而导致所有其他服务不可用,形成雪崩效应;
B. 服务雪崩效应应对措施
线程隔离:用一个线程池管理所有的服务请求和分发,Hystrix为每个服务依赖调用分配了一个小的线程池,如果线程池已满,调用将立即被拒绝,默认采用排队,加速失败判定时间,用户的请求不再直接访问服务,而是通过线程池中空闲线程访问服务,如果线程池已满或者请求超时,则会进行降级处理;
服务降级:优先保证核心服务,而非核心服务不可用或弱可用,用户的请求故障时,不会被阻塞,更不会无休止的等待或者系统崩溃,至少可以看到友好的提示返回结果;
服务熔断:见Hystrix工作原理;
2. Hystrix工作原理
A. 服务熔断器原理与电路熔断原理类似;
B. 在分布式系统中,服务调用方需要判断哪些服务处理耗时,反应慢而超时或异常等,可以针对这些服务进行主动熔断,防止拖垮整个系统;
C. Hystrix的服务熔断机制,可以实现弹性容错,当服务请求状况好转之后,可以自动重连;
D. 通过断路的方式,将后续请求直接拒绝,默认5秒后允许部分请求通过,如果调用成功则回到熔断器关闭状态,否则继续打开,接着拒绝请求的服务。
3. Hystrix的熔断状态机模型
A. closed(关闭状态):所有请求都可以正常访问服务;
B. open(打开状态):所有请求都会被降级,Hystrix会对请求进行计数,当一定时间内失败请求百分比达到阈值,则触发熔断,熔断器会完全打开。默认失败比例值为50%,请求次数不低于20次;
C. half open(半开状态):熔断器若打开后进入休眠时间,默认5s,随后熔断器会自动进入半开状态,此时请求过来则会释放部分请求通过,若这些请求都是健康的,则会关闭熔断器,否则继续保持打开,再次进行休眠计时。
4. pom.xml Maven依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
5. application.yml 文件配置
hystrix: command: default: execution: timeout: # 是否开启超时熔断 enabled: true isolation: thread: # 全局熔断超时时长,默认1秒 timeoutInMilliseconds: 5000 circuitBreaker: # 熔断触发最小请求次数 requestVolumeThreshold: 20 # 熔断后休眠时长,默认5s sleepWindowInMilliseconds: 5000 # 触发熔断错误比例阈值,默认50% errorThresholdPercentage: 50
6. Hystrix注解
A. @EnableCircuitBreaker:开启熔断降级的配置;
B. @HystrixCommand(fallbackMethod = "methodName"):声明一个降级逻辑的方法,需注意熔断的降级逻辑方法必须跟正常逻辑的方法保持相同的参数列表和返回值声明;
C. @DefaultProperties(defaultFallback = "defaultFallback"):在类上指明统一的失败降级方法,需注意该类中所有方法的返回值类型要与处理失败的方法返回类型一致,其中处理失败的方法没有参数。
可参考:Hystrix官方文档
二、Sentinel
简介:Sentinel是面向分布式服务架构的轻量级流量控制组件,提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能,支持动态规则配置,并提供一个开源控制台。
1. Sentinel了解
A. 特点
丰富的应用场景:秒杀、消息削峰填谷、集群流量控制、实时熔断下游不可用服务等;
完备的实时监控:提供实时的监控功能,查看运行状态数据;
广泛的开源生态:开箱即用,与其他框架进行整合;
完善的SPI扩展点:通过扩展接口可以定制逻辑。
B. Sentinel与Hystrix区别
Hystrix关注点在于隔离和熔断为主的容错机制,超时或被熔断的调用将会快速失败,并提供了fallback机制;
Sentinel关注点在于多样化的流量控制、熔断降级、系统负载保护、实时监控和控制台。
2. pom.xml Maven依赖
<!-- Sentinel熔断降级限流 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!-- Feign服务调用 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- Feign fallback支持 --> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-hystrix</artifactId> <version>11.0</version> </dependency>
3. application.yml 文件配置
spring:
cloud:
sentinel:
enabled: true
transport:
dashboard: 192.168.103.10:8858
port: 8719
heartbeat-interval-ms: 3000
# 服务启动直接建立心跳连接
eager: true
# feign开启sentinel支持
feign:
sentinel:
enabled: true
4. 注解
A. @SentinelResource:
value:资源名称,必须指明;
blockHandler:异常处理函数,注意处理函数的传参必须与资源点的传参一样,并且最后加上BlockException
参数,而且返回类型也一样;
fallback:熔断降级处理函数,传参和返回值也必须保持一致;
defaultFallback:默认熔断降级处理函数,函数默认需要和原方法在同一个类中;
exceptionsToIgnore:忽略指定的异常处理。
B. @SentinelRestTemplate:restTemplate服务调用注解。
5. Sentinel Dashboard搭建
B. 访问地址:http://localhost:8858;
C. 控制台没有应用处理措施:客户端要接入控制台,除了添加依赖和文件配置外,还需要初始化客户端(即访问一次客户端接口,sentinel就会初始化完成并持续向控制台发送心跳包),或者禁用Sentinel的懒加载spring.cloud.sentinel.eager=true。
6. 规则定义
A. 流量控制规则
resource(资源名):限流规则的作用对象,对于Java服务端开发而言就是执行的方法;
limitApp(针对来源):流控限制的指定应用来源,default表示不区分调用来源;
grade(阈值类型):限流阈值类型,分QPS或并发线程数;
count:(单机阈值):限流阈值,单位时间内能按照规则通过的请求量;
strategy(流控模式):调用关系限流策略,分直接、关联和链;
controlBehavior(流控效果):流量控制效果,分快速失败、Warm Up和排队等待;
clusterMode:true/flase是否集群;
B. 熔断降级规则
resource:资源名称;
grade:降级策略 0 RT 1 异常⽐例 2 异常数;
count:阈值;
timeWindow:时间窗。
C. 动态规则扩展:分文件配置规则、Nacos配置规则、Zookeeper配置规则、Apollo配置规则、Redis配置规则。
7. 与Nacos集成(防止服务重启流控或降级数据丢失)
A. 流控规则配置
B. 降级规则配置
C. 注意点
如若一个资源同时有多个限流和降级规则,需要配置在一个json数组中;
Nacos控制台修改规则,Sentinel不仅在内存中生效,Naocs持久化规则也生效,Sentinel重启后规则依然保持;
8. 与OpenFeign集成:无论是Hystrix还是Sentinel,核心代码基本上是一致的,只需要修改依赖和配置文件即可。
可参考:Sentinel官网文档
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2019-08-23 Elasticsearch 核心原理及高级特性