微服务实战(四)Sentinel服务的限流熔断降级
微服务实战(四) Sentinel 服务的限流熔断降级
官⽅⽂档:ntinelguard.io/zh-cn
概述
随着微服务的流⾏,服务和服务之间的稳定性变得越来越重要。Sentinel 是⾯向分布式服务架构的流量控制组件,主要以流量为切⼊点,从流量控制、熔断降级、系统⾃适应保护等多个维度来帮助您保障微服务的稳定性。任何地方的英文
功能
多样化的流量控制
熔断降级
系统负载保护
实时监控和控制台
组成部分
Sentinel 的使⽤可以分为两个部分:
核⼼库(Java 客户端):不依赖任何框架/库,能够运⾏于 Java 7 及以上的版本的运⾏时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的⽀持(见 )。
控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。
Sentinel 与 Hystrix
Sentinel 与Hystrix都能实现服务的限流、熔断、降级,上篇也简单介绍了Hystrix的熔断和降级。不敢说那个服务更好⽤,但就学习⽽
⾔,Sentinel ⽂档要详细的多。
Hystrix在2018年也官宣进⼊维护模式,称Hystrix(版本1.5.18)⾜够稳定,可以满⾜Netflix对我们现有应⽤程序的需求,并
将resilience4j这样的开放和活动项⽬⽤于新的内部项⽬。虽然不影响现有的项⽬,但相信会有越来越多的⼈倾向于选
择Sentinel、resilience4j等。
也简单做了同类组件功能对⽐:
Sentinel Hystrix resilience4j
隔离策略信号量隔离(并发控制)线程池隔离/信号量隔离信号量隔离
熔断降级策略基于慢调⽤⽐例、异常⽐例、异常数基于异常⽐例基于异常⽐例、响应时间
实时统计实现滑动窗⼝(LeapArray)滑动窗⼝(基于 RxJava)Ring Bit Buffer
动态规则配置⽀持近⼗种动态数据源⽀持多种数据源有限⽀持
扩展性多个扩展点插件的形式接⼝的形式
基于注解的⽀持⽀持⽀持⽀持
单机限流基于 QPS,⽀持基于调⽤关系的限流有限的⽀持Rate Limiter
集群流控⽀持不⽀持不⽀持
蓄奴州
流量整形⽀持预热模式与匀速排队控制效果不⽀持简单的 Rate Limiter 模式
系统⾃适应保护⽀持不⽀持不⽀持
热点识别/防护⽀持不⽀持不⽀持
Sentinel Hystrix resilience4j
多语⾔⽀持Java/Go/C++Java Java
Service Mesh ⽀持⽀持 Envoy/Istio不⽀持不⽀持控制台提供开箱即⽤的控制台,可配置规则、实时监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统Sentinel 控制台
Sentinel 提供⼀个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。 基于 Spring Boot 开发,打包后可以直接运⾏,不需要额外的 Tomcat 等应⽤容器。
启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
启动
#-Drver.port=8080 ⽤于指定 Sentinel 控制台端⼝为 8080
#-Dntinel.dashboard.auth.urname=ntinel ⽤于指定控制台的登录⽤户名为 ntinel;
#-Dntinel.dashboard.auth.password=123456 ⽤于指定控制台的登录密码为 123456;如果省略这两个参数,默认⽤户和密码均为 ntinel;
#-Drver.rvlet.ssion.timeout=7200 ⽤于指定 Spring Boot 服务端 ssion 的过期时间,如 7200 表⽰ 7200 秒;60m 表⽰ 60 分钟,默认为 30 分钟;
ntinel-dashboard -jar ntinel-dashboard.jar
java -Drver.port=8080 -inel.dashboard.rver=localhost:8080 -Dproject.name=
客户端接⼊
Nacos+OpenFeign+Sentinel(Sentinel Spring Cloud)
引⼊依赖
<!-- SpringCloud Ailibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
<!-- SpringCloud Ailibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Ailibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-ntinel</artifactId>
</dependency>
<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
添加配置
Feign取消abled配置或设置为fal
Feign添加abled配置
spring:
application:
name: sunnyws-rvice-example2
profiles:
active: dev
cloud:
nacos:
discovery:
rver-addr: 172.16.220.10:8848
namespace: e90d261b-9c05-4bcb-b99f-b419d952737a
config:
rver-addr: 172.16.220.10:8848
file-extension: yml
namespace: e90d261b-9c05-4bcb-b99f-b419d952737a ntinel:
transport:
#控制台地址
dashboard: 172.16.220.10:8080
port:8917
eager:true
feign:
ntinel:
enabled:true
management:
# 端点检查(健康检查)
endpoints:朝夕之间
web:罗志祥个人资料
exposure:
include:"*"
Sentinel 控制台添加配置
流控规则
阈值类型
QPS:每秒查询率,是对⼀个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
线程数:访问该资源的线程数。
流控模式
直接:当达到阈值就进⾏限流。
关联:当关联的资源达到阈值,就限流⾃⼰。
适⽤场景:查询和修改同⼀表的数据,如果是⾼并发的应⽤,查询接⼝的流量过⼤,就会影响修改接⼝的性能,反之同理,这就可以根据业务需求,去衡量希望优先读还是优先写。
关联其实是⼀种保护关联资源的设计。
链路:只记录指定链路上的流量,即指定资源从⼊⼝资源进来的流量如果达到阈值就限流。
网上申购
链路其实是⼀种细粒度的针对来源,⽽编辑流控规则中的针对来源输⼊框是微服务级别的,可以指定指定微服务过来的流量达到阈值就限流。
⽽链路是api级别的,指定的是api的调⽤流量达到阈值就限流。
流控效果
快速失败:直接失败,抛异常
Warm Up(预热):根据codeFactor(冷加载因⼦,默认值为3),从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。
即如果阈值为100,冷加载因⼦为3,预热时长为10秒,那么就会⽤100 / 3作为最初的阈值,经过10秒之后才会将阈值达到100,进⽽进⾏限流,意思就是让允许通过的流量缓慢增加,在达到⼀定的时间之后才达到阈值这样会更好的保护微服务
排队等待:匀速排队,让请求以均匀的速度通过,阈值类型必须设置成QPS,否则⽆效。此种模式可适⽤于应对突发流量的场景
生活压力大心累的句子熔断策略
Sentinel 1.8后对熔断降级做了⼤的调整,可以定义任意时长的熔断时间,引⼊了半开启恢复⽀持。OpenFeign+Sentinel 熔断后降级 是将fallback交给feign处理
Sentinel 默认统计的RT上限是4900ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-inel.=xxx 来配置
慢调⽤⽐例 (SLOW_REQUEST_RATIO ):选择以慢调⽤⽐例作为阈值,需要设置允许的慢调⽤ RT(即最⼤的响应时间),请求的响应时间⼤于该值则统计为慢调⽤。当单位统计时长(statIntervalMs )内请求数⽬⼤于设置的最⼩请求数⽬,并且慢调⽤的⽐例⼤于阈值,则接下来的熔断时长内请求会⾃动被熔断。经过熔断时长后熔断器会进⼊探测恢复状态(HALF-OPEN 状态),若接下来的⼀个请求响应时间⼩于设置的慢调⽤ RT 则结束熔断,若⼤于设置的慢调⽤ RT 则会再次被熔断。
异常⽐例 (ERROR_RATIO ):当单位统计时长(statIntervalMs )内请求数⽬⼤于设置的最⼩请求数⽬,并且异常的⽐例⼤于阈值,则接下来的熔断时长内请求会⾃动被熔断。经过熔断时长后熔断器会进⼊探测恢复状态(HALF-OPEN 状态),若接下来的⼀个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常⽐率的阈值范围是 [0.0, 1.0]
,代表 0% - 100%。
异常数 (ERROR_COUNT ):当单位统计时长内的异常数⽬超过阈值之后会⾃动进⾏熔断。经过熔断时长后熔断器会进⼊探测恢复状态(HALF-OPEN 状态),若接下来的⼀个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
Sentinel 持久化
Sentinel 默认将规则保存在内存中,重启即消失。
⽣产环境的 Sentinel Dashboard 规则需要集中管理和持久化。
官⽅⽂档中提到了三种推送模式来管理规则的推送。
推送模式
说明
优点
缺点
API 将规则推送⾄客户端并直接更新到内存中,扩展写数据源()
茶靡花简单,⽆任何依赖
不保证⼀致性;规则保存在内存中,重启即消失。严重不建议⽤
于⽣产环境
扩展写数据源(), 客户端主动向某个规则管理中⼼定期轮询拉取规则,这个规则中⼼可以是
RDBMS、⽂件 等
简单,⽆任何依赖;规则持久化不保证⼀致性;实时性不保证,拉取过于频繁也可能会有性能问
题。传统游戏有哪些
扩展读数据源(),规则中⼼统⼀推送,客户端通过注册监听器的⽅式时刻监听变化,⽐如使⽤Nacos、Zookeeper 等配置中⼼。这种⽅式有更好的实时性和⼀致性保证。⽣产环境下⼀般采⽤
规则持久化;⼀致
引⼊第三⽅依赖