Alibaba Sentinel
本文sentinel版本 : 1.8.1
详细文档: https://github.com/alibaba/Sentinel/wiki
官网下载地址 : https://github.com/alibaba/Sentinel/releases
1. 准备工作
-
下载sentinel(jar包)
-
启动sentinel
java -jar sentinel-dashboard-1.8.1.jar
-
浏览器访问localhost:8080访问sentinel控制台, 访问成功即sentinel启动成功
-
代码添加依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
配置文件
server: port: 9080 spring: application: name: demo-sentinel-service cloud: nacos: discovery: # Nacos服务注册中心地址 server-addr: localhost:8848 sentinel: transport: dashboard: localhost:8080 # 默认为8719,如果被占用会自动+1,直到找到为止 port: 8719 endpoints: web: exposure: include: "*"
-
启动项目
- 访问sentinel控制台, 发现一点动静没有, 因为sentinel默认懒加载, 在代码中写个controller, 访问几次在控制台即可看到监控成功
2. 控制台内容
2.1 实时监控
同时,同一个服务下的所有机器的簇点信息会被汇总,并且秒级地展示在"实时监控"下。
注意: 实时监控仅存储 5 分钟以内的数据,如果需要持久化,需要通过调用实时监控接口来定制。
2.2 簇点链路
"簇点链路"中显示刚刚调用的资源
2.3 流控规则
两种添加方式:
在簇点链路中选择链路添加流控方式
在流控规则中添加流控规则, 绑定资源名
2.3.1 流控模式:
-
控制台配置流控规则, 有QPS和线程数的流控方式
达到流控规则后页面返回系统默认流控信息
Blocked by Sentinel (flow limiting)
-
关联
A, B两个接口, 设置A的流控规则为关联, 并且关联资源B, 假设B已经设置好流控规则, 并且达到了流控条件, 即A会降级(B闯祸, A买单)
2.3.2 流控效果:
-
默认快速失败 - Blocked by Sentinel (flow limiting)
-
Warm Up(预热) 冷加载因子固定是3. 假设配置的QPS是12, 预热时长设置的是5, 在前5s实际QPS峰值是4(12/3), 这5s内访问QPS超过4会限流, 这5s之后QPS会达到初始设定的12
-
排队等待 让请求以均匀方式通过, 对应漏桶算法, 阈值类型必须是QPS, 线程数无该选项, 设置QPS和超时时间, 超过最大等待时间即限流 适用于消息队列, 不会在一开始拒绝多余的请求. 希望达到的效果(即没有让服务崩掉, 又没有拒绝请求)
2.4 降级规则
-
慢调用比例 (
SLOW_REQUEST_RATIO
):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。 -
异常比例 (
ERROR_RATIO
):当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0, 1.0]
,代表 0% - 100%。 -
异常数 (
ERROR_COUNT
):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
2.5 热点规则(QPS限流)
-
代码中在controller上添加如下代码, value=资源名, blockHandler=降级方法
@SentinelResource(value = "resourceName",blockHandler = "fallbackMethod")
-
在该controller下面编写fallbackMethod, 加上BlockException参数
public String fallbackMethod(String param, BlockException exception){ return "test_fallback"; }
-
在热点规则中添加规则, 按照参数下标来定义第几个参数
-
达到限流条件后会执行fallbackMethod
参数例外项
条件: 被限流的参数, 希望遇到一些特定值, 有自己的特定限流规则, 自己的QPS限流方式
if(热点规则限流) {
if (参数值 == 例外项A) {
do A例外项的限流规则
}
if (参数值 == 例外B) {
do B例外项的限流规则
}....
do 常规限流规则
}
2.6 系统规则
- 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 达到阈值即触发系统保护。
2.7 授权规则
- 配置资源名
- 流控应用填写调用方应用名
2.8 sentinel持久化机制(持久化到nacos)
以上的控制台操作都会随着服务的停止而消失.
-
需要添加持久化规则的项目pom添加依赖
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>
-
配置文件添加持久化配置
spring: application: name: demo-sentine cloud: nacos: discovery: server-addr: localhost:8848 sentinel: transport: dashboard: localhost:8080 # 默认为8719,如果被占用会自动+1,直到找到为止 port: 8719 # 流控规则持久化到nacos datasource: dsl: nacos: server-addr: localhost:8848 data-id: ${spring.application.name} group-id: DEFAULT_GROUP data-type: json rule-type: flow
-
编写json文件
[ { "resurce":"/demo", 资源名称 "limitApp":"default", 来源应用 "grade":1, 阈值类型: 0: 线程数, 1: QPS "count":1, 单机阈值 "strategy":0, 流控模式: 0: 直接, 1: 关联, 2: 链路 "controlBehavior":0, 流控效果: 0: 快速失败, 1: Warm Up预热, 2: 排队等待 "clusterMode":false 是否集群 } ]
-
Nacos添加配置文件
- dataId: ${spring.application.name} 服务名称
- group: 分组
感觉这一版sentinel持久化没有锤子用 !!!, 期待后面可以直接在sentinel中配置持久化