Sentinel替代Hystrix进行熔断与限流

Hystrix缺点

  • 需要自行搭建监控平台
  • 没有web界面可以进行细粒度化配置:流量控制、速率控制、服务熔断、服务降级…

    Sentinel改进

  • 单独一个组件,可以独立出来

  • web界面细粒度统一配置

    Sentinel配置与安装

    Sentinel下载地址
    运行:java -jar sentinel-dashboard-1.7.0.jar,在运行前要确保8080端口不被占用,因为其前端页面是8080端口
    访问管理界面:localhost:8080,默认用户名和密码为sentinel sentinel

    Sentinel的使用

  • pom引入spring-cloud-starter-alibaba-nacos-discovery、spring-cloud-starter-alibaba-sentinel、sentinel-datasource-nacos(做持久化需要用到)

  • yml配置如下

image.png

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

image.png

Sentinel流控规则

image.pngimage.png
流量模式

  • 直接:流量达到阈值,直接限流
  • 关联:支付接口出问题了就限流订单接口
  • 链路:

流量效果

  • Warm up(预热):设定阈值是10,则刚开始允许的访问量是10/3=3,经过设定的预热时间后才慢慢的达到10这个阈值,应用场景是秒杀系统开启的瞬间,会有很多流量上来,预热方式是为了保护系统,把流量慢慢放进来
  • 排队等待:匀速排队,让请求以均匀的速度通过,阈值类型必须设成QPS,否则无效。

    Sentinel降级规则

    image.pngimage.png
    降级策略

  • RT:平均响应时间,当1s内持续进入5个及以上的请求,且对应时刻的平均响应时间均超过阈值,那么在接下来的时间窗口之内,对这个方法的调用都会自动熔断,时间窗口期后关闭降级,恢复访问。Sentinel的RT默认上限时4900ms,超出阈值的都会算作4900ms

  • 异常比例:当资源的每秒请求量>=5,并且每秒异常总数占通过量的比值超过了阈值之后,资源进入降级状态,即在接下来的时间窗口内,对这个方法的调用都会自动熔断。异常比例的阈值范围时[0.0,1.0],即0%~100%
  • 异常数:当资源近1分钟的异常数目超过阈值之后会进行熔断。这里的统计时间窗口时分钟级别的,若timeWindow小于60s,则结束熔断状态后仍可能再次进入熔断,因此时间窗口一定要>=60s

    Sentinel热点规则

    热点即经常访问的数据,很多时候希望统计某个热点数据中访问频次最高的数据,并对其进行访问限制,热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看作是一种特殊的流量控制,仅对包含热点参数的资源调用生效

  • 代码演示

image.png

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

image.png

  • 参数例外项

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2519093/1614046843625-f1bee64e-8b26-4aa5-814e-e80593212401.png#align=left&display=inline&height=131&margin=%5Bobject%20Object%5D&name=image.png&originHeight=262&originWidth=732&size=53824&status=done&style=none&width=366)<br />指定参数进行热点规则控制后,若该参数的值为参数例外项中设定的值,则允许其按照参数例外项中设置的阈值进行流量控制<br />

    Sentinel系统规则

    从整体维度对应用入口流量进行控制,结合应用的Load、CPU使用率、总体平均RT、入口QPS和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性

  • 系统规则支持的模式

image.png

@SentinelResource详解

替代Hystrix中的@HystrixCommand注解,不仅使用与热点规则,同样适用于流控规则、降级规则,在配置规则时,可以用URL和资源名称作为配置规则的资源名

如何自定义限流处理逻辑?

  • 定义全局限流处理类

image.png

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

image.png

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

image.png

  • 若想要忽略程序中的某个异常,不需要返回fallback函数,则需配置如下参数

image.png

Sentinal熔断

sentinel整合Ribbon+OpenFeign+Fallback

OpenFegin与Fallback

  • pom引入spring-cloud-starter-openfeign
  • yml激活sentinel对Fegin的支持

image.png

  • 主启动类增加@EnableDiscoveryClient(Nacos服务注册)和@EnableFeignClients(Fegin调用)注解
  • 业务类增加@FeignClient注解,value表明调用的微服务,fallback表明熔断后调用的fallback函数,2处表示带调用1处微服务中的具体哪个接口

image.png

持久化

一旦重启应用,sentinel规则将小时,生产环境需要将配置持久化
解决方案
将限流配置规则持久化进Nacos保存,只要刷新相应端口的某个接口,sentinel控制台的流控规则就能看得到,只要Nacos里面的配置不删除,针对相应端口的sentinel的流控规则就持续有效
步骤

  • pom引入sentinel-datasource-nacos
  • yml增加配置如下

image.png

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

image.png
image.png

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