目录
- 环境介绍
- Sentinel的使用可以分为两个部分
- Sentinel管理控制台
- 客户端接入控制台
- 配置启动参数
- 流控规则
- 名词解释
- 熔断策略
- 公共字段说明
- 慢调用比例
- 字段说明
- 异常比例
- 字段说明
- 异常数
- 字段说明
- 热点规则
环境介绍
开发依赖 | 版本 |
---|---|
Spring Boot | 3.0.6 |
Spring Cloud | 2022.0.2 |
Spring Cloud Alibaba | 2022.0.0.0-RC2 |
JDK | 20 |
Sentinel的使用可以分为两个部分
- 控制台(Dashboard):控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等。
- 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 7 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
Sentinel管理控制台
- 下载jar包:
https://github.com/alibaba/Sentinel/releases
- 1.8.6下载地址:
https://objects.githubusercontent.com/github-production-release-asset-2e65be/128018428/cb34497a-008e-48c3-a752-e79684e05fa2?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20230523%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230523T083059Z&X-Amz-Expires=300&X-Amz-Signature=68683a7d73f412ad70cd7fa3adfed3e6f756a313af334985cae8be206b567628&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=128018428&response-content-disposition=attachment%3B%20filename%3Dsentinel-dashboard-1.8.6.jar&response-content-type=application%2Foctet-stream
- 服务启动:
java -server -Xms64m -Xmx64m -Dserver.port=8849 -Dcsp.sentinel.dashboard.server=localhost:8849 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar
- 浏览器输入:
http://localhost:8849
- 默认账号密码: sentinel/sentinel
-Dsentinel.dashboard.auth.username=sentinel
用于指定控制台的登录用户名为sentinel
;-Dsentinel.dashboard.auth.password=123456
用于指定控制台的登录密码为123456
;如果省略这两个参数,默认用户和密码均为sentinel
客户端接入控制台
父工程引入alibaba
实现的SpringCloud
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子工程中引入sentinel
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置启动参数
在工程的application.yml
中添加Sentinel
控制台配置信息
spring:
application:
# 这个名称显示在Sentinel控制台,对应Sentinel的应用名称,如果没有配置,默认显示的是com.wen3.framework.demo.sentinel.server1.SentinelServer1Application
name: Sentinel-server1
cloud:
sentinel:
log:
# 如果不配置,默认会把日志写到C:\Users\Administrator\logs
dir: ./logs
transport:
#sentinel控制台的请求地址
dashboard: 127.0.0.1:8849
# 如果本机有多个网卡,可以手动指定IP
client-ip: 127.0.0.1
# Sentinel控制台通过这个端口与应用通讯
port: 8720
# 默认为true,表示将调用链路收敛,会导致链路流控效果无效,需要改成false
web-context-unify: false
配置项可以参考
com.alibaba.cloud.sentinel.SentinelProperties
流控规则
名词解释
-
资源名 : 唯一名称,默认请求路径
-
针对来源:
Sentinel
可以针对调用者进行限流,填写微服务名,默认default
(不区分来源) -
阈值类型/单机阈值:
QPS
(每秒钟的请求数量):当调用该API
的QPS
达到阈值的时候,进行限流- 线程数:当调用该
API
的线程数量达到阈值的时候,进行限流
-
是否集群:当前不需要集群
-
流控模式:
- 直接:
API
达到限流条件时,直接限流 - 关联:当关联的资源达到阈值时,就限流自己
- 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)(
API
级别的针对来源)
- 直接:
-
流控效果:
-
快速失败:直接失败,抛异常
-
Wam Up
:根据codeFactor
(冷加载因子,默认3
)的值,从阈值/codeFacotor
,经过预热时长,才达到设置的QPS
阈值-
预热公式:初始阈值= 设定阈值/coldFactor(默认值为3),经过预热一段时间后才会达到设定的阈值。
-
预热的访问过程系统允许通过的QPS曲线如下图
使用场景:一般秒杀系统中会有这样的流控设置,为了防止秒杀瞬间造成系统崩溃。
-
-
排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为
QPS
,否则无效
注意:匀速排队模式暂时不支持 QPS > 1000 的场景。
-
熔断策略
公共字段说明
字段名 | 说明 |
---|---|
资源名 | 访问的请求路径 |
熔断时长 | 当条件满足后需要进行熔断的熔断时长,单位:秒 |
最小请求数 | 在统计时长的时间内,请求数要大于该值,才会判断异常请求数是否大于设置的异常数, 所以最小请求数是触发熔断的另外一个条件 |
统计时长 | 触发熔断需要统计请求数的时长,单位:毫秒 |
慢调用比例
慢调用比例是以慢调用数量的比例作为阈值,首先需要设置最大RT
(即最大的响应时间,用于鉴定是否是慢调用),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs
)内请求数大于设置的最小请求数,并且慢调用的比例大于比例阈值,则接下来的请求会自动熔断,熔断时间为设置的熔断时长。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN
状态),若在HALF-OPEN
状态下有一个请求响应时间小于最大RT
则结束熔断,否则继续熔断。
上面的熔断规则表示说: 访问/hello资源时,如果在1000毫秒内,请求数量超过5,并且这些数量中超过1000毫秒的请求数量的比例超过0.5则熔断10秒,10秒后进入半开状态,如果半开状态中有一个请求小于1000毫秒,则取消熔断,否则继续熔断
字段说明
字段名 | 说明 |
---|---|
最大RT | 最大响应时间,单位:毫秒数,用于鉴定是否是慢调用 |
比例阈值 | 值的是慢调用的比例阈值,是触发熔断的其中一个条件 |
异常比例
异常比例是以请求异常数量的比例作为阈值,当单位统计时长(statIntervalMs
)内请求数大于设置的最小请求数,并且异常请求数的比例大于比例阈值,则接下来的请求会自动熔断,熔断时间为设置的熔断时长。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN
状态),若在HALF-OPEN
状态下有一个请求正常响应 则结束熔断,否则继续熔断。
上面的熔断规则表示说: 访问/hello资源时,如果在1000毫秒内,请求数量超过5,并且这些数量中异常的请求数量的比例超过0.5则熔断10秒,10秒后进入半开状态,如果半开状态中有一个请求没有异常,则取消熔断,否则继续熔断
字段说明
字段名 | 说明 |
---|---|
比例阈值 | 统计时长内异常请求数和总请求数的比例,是触发熔断的其中一个条件 |
异常数
上面的熔断规则表示说: 访问/hello资源时,如果在10000毫秒内,请求数量超过5,并且这些数量中异常的请求数量超过2个,则后续的请求进行熔断10秒,10秒后进入半开状态,如果半开状态中有一个请求没有异常,则取消熔断,否则继续熔断
字段说明
字段名 | 说明 |
---|---|
异常数 | 统计时长内异常请求数,是触发熔断的其中一个条件 |
热点规则
何为热点?热点即经常访问的数据。有时候我们某个请求路径中的某个参数更甚至于某个参数值为热点数据。
比如某个商品秒杀,或者说突然降价的热点商品数据, 或者微博中某个人的突发事件等。 这些数据在某一段时间突然暴增,可能会把系统压垮。 所以需要针对他们进行限流,不能影响其他同类。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效
官网介绍: parameter-flow-control
上面的配置表示访问资源hello1时, 参数索引为2这个参数值是1,限定在1秒(统计窗口时长)内只能访问1次,参数值是2只能访问2次