Sentinel使用详解


1. 什么是Sentinel

Sentinel:随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel分为两个部分:
核心库:不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对Dubbo / Spring Cloud 等框架也有较好的支持。

控制台:基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat等应用容器。

Sentinel架构:

它的内部API接口如下:

    #接口概览
    http://127.0.0.1:8720/api
    #获取资源的metrics信息
    http://127.0.0.1:8720/cnode?id=/jifen/{jifenId}
    #获取流控规则接口
    http://127.0.0.1:8720/getRules?type=flow
    #设置规则接口
    http://127.0.0.1:8720/setRules 




2. Sentinel控制台安装

控制台:

  • 可以实时观看每个资源的访问情况
  • 可以设置流控规则,熔断降级==。

启动Sentinel控制台需要JDK版本为1.8及以上。

文档地址:https://github.com/alibaba/Sentinel/wiki
下载地址:https://github.com/alibaba/Sentinel/releases

下载完成之后(是一个Jar包,直接控制台打包部署即可。java -jar sentinel-dashboard-1.8.0.jar --server.port=8888 )








3. 微服务整合Sentinel

3.1 添加依赖

    
        com.alibaba.cloud
        spring-cloud-starter-alibaba-sentinel
        2.2.3.RELEASE
    

3.2 配置Sentinel

spring: 
  cloud:
    sentinel:
      transport:
        port: 8719 # 默认是8719,如果8719被占用 +1,一直到没有被占用
        dashboard: localhost:8888
      eager: true # 默认是false,表示是否开启饥饿加载,true:开启,即当项目一启动立即完成初始化。




4. Sentinel服务流控

服务流控:就是对服务的访问流量进行控制处理。
QPS:每秒资源被访问的次数。

补充下:
``java
针对来源:default,表示所有资源。
如果你指定了来源,那么就会只针对那一个资源做处理。


####4.1 QPS超过阈值 + 直接失败
触发条件:
```java
    /order/test5当qps>1时,会触发流控。

4.2 线程数超过阈值 + 直接失败

触发条件:

    当/order/test5 正在工作的线程数>1

    解释:
        正在工作的线程数:就是指当前这个服务被CPU调度执行,有一个正在被执行就线程数+1。
        比如:若这里的线程数阈值设置为1(每秒最大为一个线程数调度),若该服务执行一次需要5秒,那么在该服务执行完成之前,有其他访问来了,就会触发了。

4.3 QPS超过阈值 + 关联失败

触发条件:

    当关联资源(/order/test6)访问qps>1 ,那么/order/test5 就会被流控

4.4 线程数超过阈值 + 关联失败

触发条件:

    当关联资源(/order/test6)正在工作的线程数(并发数)>1 ,那么/order/test5 就会被流控

4.5 QPSQPS超过阈值 + 链路失败

触发条件:

    saveOrder[jifen save]有两个入口,分别为/order/test5和/order/test6。
             当/order/test5访问qps>1 那么/order/test5就不能访问受保护资源,其他入口照常访问。
    feign.sentinel.enabled=true
    spring.cloud.sentinel.web-context-unify=false

4.6 流控效果 —— Warm-up

https://www.bilibili.com/video/BV1hf4y1A7ym?p=46

4.7 流控效果 —— 匀速排队

https://www.bilibili.com/video/BV1hf4y1A7ym?p=47







4. Sentinel熔断降级

除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。

    一个服务常常会调用别的服务模块,而这个被依赖的服务模块的稳定性是不能保证的。
    如果被依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的一方的响应时间也会变长。
    线程会产生堆积,最终可能耗尽业务自身的线程池,使服务本身也变得不可用。

4.1 熔断降级 —— 慢调用比例

触发条件:

    1s内最小请求数必须大于5。
    man请求 ÷ 总请求 > 0.6

慢调用比例:

    最大RT:允许的最大响应时间,当请求的响应时间大于该值则统计为慢调用。

    比例阈值:当单位统计时长(1s)内,被判定为慢调用的比例。

    熔断时长:该时间段内的请求会被熔断,经过熔断时长后熔断器会进入探测恢复状态【HALF-OPEN 状态】
              若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用RT 则会再次被熔断。

    最小请求数:当单位统计时长(1s)内,① 请求数目大于设置的最小请求数目,② 且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。

4.2 熔断降级 —— 异常比例

触发条件:

    1s内最小请求数大于5
    1s内 异常数/总请求数 > 0.6

异常比例:当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。

4.1 熔断降级 —— 异常数

触发条件:

    每秒请求数必须大于5
    每秒的异常数必须大于10【我们设置的阈值】

异常数:当单位统计时长内的异常数目超过阈值之后会自动进行熔断。







5. 热点key规则

触发条件:

    必须有一个参数,参数的值可以任意 例如   http://localhost:9002/order/test7?name=jack
    接口访问qps>1

热点key规则:

    参数索引:该资源uri后面的参数所在位置索引,从0开始。

    统计窗口时长:定义该资源uri在指定多少秒内的一个统计时长。

//========================================================================================================================================//

触发条件:

    若第一个参数的值如果为jack,那么qps阈值为1
    若第一个参数的值如果为rose,那么qps阈值为5
    若第一个参数的值如果为其他指,那么qps阈值为1

PS:必须加一个注解,不然热点key功能不生效








6. 权限规则

黑白名单控制:
很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时可以使用Sentinel的来源访问控制(黑白名单控制)的功能。

来源访问控制:是根据资源的请求来源(origin)限制资源是否通过。


请求头中获取origin,告诉我你的来源 ![](https://img2022.cnblogs.com/blog/1471584/202204/1471584-20220407104306104-771805824.png)

那么,你在服务里面调一个远程服务的时候,怎么在发请求的时候传请求头呢,单个的很容易就可以搞,如果想实现全局的,每个接口都带呢。
我们可以写一个openfeign的拦截器。








7. 针对来源

之前最上面讲到过针对来源,默认是 default , 表示针对所有资源。

如果你要针对某一资源,就要利用拦截器,你请求的时候带上你的origin。







8. 流控——自定义异常处理