Spring Cloud Alibaba Sentinel
一、介绍(sentinel 1.7.0)
1,官网地址
https://github.com/alibaba/Sentinel
中文地址:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
2,主要特征
Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
3,安装使用
下载:https://github.com/alibaba/Sentinel/tags (选择对应的版本下载jar包这里以1.7.0为例)
启动:java -jar sentinel-dashboard-1.7.0.jar (默认启动8080端口)
访问:http://localhost:8080
二、项目示例
源码:cloudalibaba-sentinel-service8401
三、流控规则
注:Sentinel的监控页面一开始是没有东西,需要对监控的服务发起请求后才会出现
-
资源名:唯一名称,默认请求路径
-
针对来源:
Sentinel
可以针对调用者进行限流,填写微服务名,指定对哪个微服务进行限流 ,默认default
(不区分来源,全部限制) -
阈值类型/单机阈值:
-
QPS(每秒钟的请求数量):当调用该接口的QPS达到了阈值的时候,进行限流;
-
线程数:当调用该接口的线程数达到阈值时,进行限流
-
-
是否集群:不需要集群
-
流控模式:
-
直接:接口达到限流条件时,直接限流
-
关联:当关联的资源达到阈值时,就限流自己
-
链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就可以限流)[api级别的针对来源]
-
-
流控效果
-
快速失败:直接失败,就异常
- Warm Up:根据
codeFactor
(冷加载因子,默认为3)的值,即请求 QPS 从threshold / 3
开始,经预热时长逐渐升至设定的 QPS 阈值 [https://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81—%E5%86%B7%E5%90%AF%E5%8A%A8#%E6%A6%82%E8%BF%B0]
-
详细使用参考:https://www.cnblogs.com/coder-zyc/p/12926644.html
注意:针对url制定的流控规则会走系统默认的规则,而针对SentinelResource中的资源value制定的流控规则会走自定义的blockHandler方法。
四、降级规则
1,基本介绍
Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误。Sentinel的断路器不存在半开状态,当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出DegradeException)。
2,RT
平均响应时间(DEGRADE_GRADE_RT):当1s内持续进入5个请求,对应时刻的平均响应时间(秒级)均超过阈值(以ms为单位),那么接下来的时间窗口(DegradeRule中的timeWindow,以s为单位)之内,对这个方法的调用都会出现熔断(抛出DegradeException)。注意Sentinel默认统计的RT上限为4900ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置。
3,异常比例
异常比例(DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量>=5,并且每秒异常总数占通过量的比值超过阈值(DegradeRule中的count)之后,资源进入降级状态,即在接下来的时间窗口(DegradeRule中的timeWindow,以s为单位)之内,对这个方法的调用都会自动地返回。异常比例的阈值范围是[0.0,1.0],代表0%~100%。
4,异常数
异常数(DEGRADE_GRADE_EXCEPTION_COUNT):当资源近1分钟的异常数目超过阈值之后,会进行熔断。注意通过时间窗口是分钟级别的,若timeWindow小于60s,则结束熔断状态后仍可能再进入熔断状态。
五、热点规则
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
1,代码
@GetMapping("/testHotKey") @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey") public String testHotKey(@RequestParam(value = "p1",required = false) String p1, @RequestParam(value = "p2",required = false) String p2) { //int age = 10/0; return "------testHotKey"; } //备用方法 public String deal_testHotKey (String p1, String p2, BlockException exception){ return "------deal_testHotKey,o(╥﹏╥)o"; }
2,参数
#只要含有p1参数且阈值达到了之后就会进行限流 http://localhost:8401/testHotKey?p1=abc&p2=33 #当不含有p2参数时就不会被限流 http://localhost:8401/testHotKey?p2=abc
3,参数例外项
#当参数为p1=abc时此时的阈值为10 http://localhost:8401/testHotKey?p1=abc&p2=33 #当参数为p1不为abc时此时的阈值为1 http://localhost:8401/testHotKey?p1=xyz&p2=33
六、系统规则
系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN
),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。
系统规则支持以下的模式:
- Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的
maxQps * minRt
估算得出。设定参考值一般是CPU cores * 2.5
。 - CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
- 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
- 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。
七、feign和ribbon应用
启动nacos
sentinel服务端:cloudalibaba-sentinel-dashboard8081
服务提供者:cloudalibaba-provider-payment9004 / cloudalibaba-provider-payment9005
服务消费者:cloudalibaba-consumer-nacos-order84
八、规则持久化
启动nacos
sentinel服务端:cloudalibaba-sentinel-dashboard8081
服务消费客户端:cloudalibaba-sentinel-dashboard-client8402