Sentinel替代Hystrix进行熔断与限流
Hystrix缺点
- 需要自行搭建监控平台
没有web界面可以进行细粒度化配置:流量控制、速率控制、服务熔断、服务降级…
Sentinel改进
单独一个组件,可以独立出来
-
Sentinel配置与安装
Sentinel下载地址
运行:java -jar sentinel-dashboard-1.7.0.jar,在运行前要确保8080端口不被占用,因为其前端页面是8080端口
访问管理界面:localhost:8080,默认用户名和密码为sentinel sentinelSentinel的使用
pom引入spring-cloud-starter-alibaba-nacos-discovery、spring-cloud-starter-alibaba-sentinel、sentinel-datasource-nacos(做持久化需要用到)
- yml配置如下

- 主启动类增加@EnableDiscoveryClient,使其作为微服务被发现
- 启动后访问Sentinel管理界面localhost:8080,因其执行懒加载机制,需要执行一次访问才可以在管理界面看到注册进来的微服务
Sentinel流控规则


流量模式
- 直接:流量达到阈值,直接限流
- 关联:支付接口出问题了就限流订单接口
- 链路:
流量效果
- Warm up(预热):设定阈值是10,则刚开始允许的访问量是10/3=3,经过设定的预热时间后才慢慢的达到10这个阈值,应用场景是秒杀系统开启的瞬间,会有很多流量上来,预热方式是为了保护系统,把流量慢慢放进来
排队等待:匀速排队,让请求以均匀的速度通过,阈值类型必须设成QPS,否则无效。
Sentinel降级规则


降级策略RT:平均响应时间,当1s内持续进入5个及以上的请求,且对应时刻的平均响应时间均超过阈值,那么在接下来的时间窗口之内,对这个方法的调用都会自动熔断,时间窗口期后关闭降级,恢复访问。Sentinel的RT默认上限时4900ms,超出阈值的都会算作4900ms
- 异常比例:当资源的每秒请求量>=5,并且每秒异常总数占通过量的比值超过了阈值之后,资源进入降级状态,即在接下来的时间窗口内,对这个方法的调用都会自动熔断。异常比例的阈值范围时[0.0,1.0],即0%~100%
异常数:当资源近1分钟的异常数目超过阈值之后会进行熔断。这里的统计时间窗口时分钟级别的,若timeWindow小于60s,则结束熔断状态后仍可能再次进入熔断,因此时间窗口一定要>=60s
Sentinel热点规则
热点即经常访问的数据,很多时候希望统计某个热点数据中访问频次最高的数据,并对其进行访问限制,热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看作是一种特殊的流量控制,仅对包含热点参数的资源调用生效
代码演示

- 在配置了热点规则的接口controller处增加@SentinelResource注解,用于处理Sentinal控制台配置的违规情况,其中参数value,为其名称,表明在配置热点规则时资源名为该名称;参数blockHandler,表明若接口违反了规则,其fallback方法是blockHandler参数的值
- 在定义fallback方法时,其传入参数与上述接口一致,但需要增加一个BlockException方法

参数例外项
<br />指定参数进行热点规则控制后,若该参数的值为参数例外项中设定的值,则允许其按照参数例外项中设置的阈值进行流量控制<br />
Sentinel系统规则
从整体维度对应用入口流量进行控制,结合应用的Load、CPU使用率、总体平均RT、入口QPS和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性
系统规则支持的模式
@SentinelResource详解
替代Hystrix中的@HystrixCommand注解,不仅使用与热点规则,同样适用于流控规则、降级规则,在配置规则时,可以用URL和资源名称作为配置规则的资源名
如何自定义限流处理逻辑?
- 定义全局限流处理类

- 在需要限流的接口处增加@SentinelResource注解,并在其中增加blockHandlerClass指定处理类,blockHandler指定处理方法

- @SentinelResource注解除了可以增加blockHandler来进行sentinel层面的Fallback,还可以增加fallback参数用于对java层面的异常进行处理

- 若想要忽略程序中的某个异常,不需要返回fallback函数,则需配置如下参数
Sentinal熔断
sentinel整合Ribbon+OpenFeign+Fallback
OpenFegin与Fallback
- pom引入spring-cloud-starter-openfeign
- yml激活sentinel对Fegin的支持

- 主启动类增加@EnableDiscoveryClient(Nacos服务注册)和@EnableFeignClients(Fegin调用)注解
- 业务类增加@FeignClient注解,value表明调用的微服务,fallback表明熔断后调用的fallback函数,2处表示带调用1处微服务中的具体哪个接口
持久化
一旦重启应用,sentinel规则将小时,生产环境需要将配置持久化
解决方案
将限流配置规则持久化进Nacos保存,只要刷新相应端口的某个接口,sentinel控制台的流控规则就能看得到,只要Nacos里面的配置不删除,针对相应端口的sentinel的流控规则就持续有效
步骤
- pom引入sentinel-datasource-nacos
- yml增加配置如下

- nacos上配置这个微服务下某个接口的业务规则


- 再使用这个接口后,重启该微服务后规则也不会消失
