2.1 SpringCloud Alibaba Sentinel基本概念
1、实时监控中同时提供监控功能;实现微服务的降级、熔断、限流;
2、SpringCloud Alibaba Sentinel 和Hystrix的区别:
| Hystrix | Sentinel |
|---|---|
| 1、Hystrix 需要手动搭建监控平台 2、Hystrix 没有web界面更加细的配置流控,速率控制,服务熔断,服务降级…越来越多,很麻烦 |
1. sentinel 单独一个组件,可以独立出来 2. sentinel 支持web界面化细粒度统一配置 |
3、主要特性(绿色部分):
4、Sentinel可分为两部分:
一部分为核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
另一部分为控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
2.2 SpringCloud Alibaba Sentinel安装下载
1、下载地址: https://github.com/alibaba/Sentinel/tags
2、在安装目录下启用cmd命令运行 java- jar sentinel-dashboard-1.8.2.jar(默认端口号为8080,所以在登陆前需要保证8080端口不被占用)
3、登录localhost:8080,登录sentinel的web界面(账号密码都为:sentinel)
2.3 SpringCloud Alibaba Sentinel初始化


注: 需要先访问过8401后再查看sentinel的页面,否则是空的,因为sentinel是懒加载模式,并且如果一段时间不访问方法,则不会显示该方法。
★2.4 SpringCloud Alibaba Sentinel 流控规则
- 资源名:唯一名称,默认请求路径。
- 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。
阈值类型/单机阈值:(注意QPS和线程数的区别!)
- QPS(每秒钟的请求数量)︰当调用该API的QPS达到阈值的时候,进行限流。
- 线程数:当调用该API的线程数达到阈值的时候,进行限流。
是否集群:不需要集群。
- ★流控模式:
直接(默认):API达到限流条件时,直接限流。
关联:当关联的资源达到阈值时,就限流自己:
当关联的资源违反了流控规则,就会限流自己,如test/A关联了test/B,若test/B违反流控规则,则限流A自己(资源A关联了资源B,B惹事,资源A限流报错)

链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【API级别的针对来源】。
- ★流控效果:
快速失败:直接失败,抛异常。
Warm up:根据Code Factor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。
案例,阀值为10+预热时长设置5秒。
系统初始化的阀值为10/ 3约等于3,即阀值刚开始为3;然后过了5秒后阀值才慢慢升高恢复到10
排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。
匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。

可对相应的请求进行流控规则配置:
当请求违反了设置的流控规则,就会报错,页面显示Blocked by Sentinel (flow limiting)。那么是否可以进行自定义的fallback报错页面显示呢?
★2.5 SpringCloud Alibaba Sentinel 熔断降级-保险丝的作用
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。
一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
- 慢调用比例
满足以下两点发生熔断降级:
1、每次未熔断时统计时长为 ms,在此时间内. 响应超过RT时间被标记为慢调用,慢调用比例超过比例阈值后熔断 [取值为 0 - 1 之间] ,熔断时长为s,超过该时间取消熔断,
2、每秒调用数 > 最小请求数
- 异常比例
在3000ms内,至少有8个请求(大于5个请求),错误率达到60%(比例阈值),则熔断3s,然后重新统计时间。
- 异常数
在3000ms内,至少有8个请求,异常5个
如请求错误次数超5次(异常数)则熔断3s,然后重新统计时间。
★2.6 SpringCloud Alibaba Sentinel 热点key限流规则
2.6.1基本概念
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
下图表示调用资源名为testHotKey的请求,传入的参数中的热点参数下标索引为0的参数进行限流处理,其阈值为2,统计窗口时长为3s,当3s内请求的参数索引为0的参数访问次数超过阈值即会产生热点限流

2.6.2 基本配置规则
1、利用@SentinelResource注解对包含热点参数的资源调用进行限流处理
注意与Hystrix服务降级的HystrixCommand()的对比@HystrixCommand(fallbackMethod =”timeout_handler”,
commandProperties ={@HystrixProperty(name = “execution.isolation.thread.timeoutInMilliseconds”,value = “5000”)})
//热点限流模拟//传入两个参数p1、p2@GetMapping(value = "/testHotKey")//@SentinelResource中value代表资源名,blockHandler代表一旦违反热点限流规则兜底的方法@SentinelResource(value = "testHotKey",blockHandler ="deal_testHotKey" )public String KeyTest(@RequestParam(value = "p1",required = false) String p1,@RequestParam(value = "p2",required = false) String p2){return "testHotKey";}//热点限流降级方法public String deal_testHotKey(String p1, String p2, BlockException blockException){return "deal_testHotKey";}
2、在Sentinel的Web界面上对指定索引的参数进行热点限流配置。注:若不在客户端配置blockHandler代表一旦违反热点限流规则兜底的方法,当违反热点限流规则后,会报错500页面。
2.6.3 参数例外项配置规则[VIP通道]
对限流的参数额外添加配置
参数例外项设置即为:当我们期望被限流的参数值它是某个特殊值的时候,它的限流和平时不一样。

注:@SentinelResource只管配置类异常,不负责运行时异常。
★2.7 SpringCloud Alibaba Sentinel 系统配置规则
从整体维度对应用入口流量进行控制
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 达到阈值即触发系统保护。
