Sentinel使用手册
定义Sentinel的方式
原生api方式
成对使用SphU.entry(xxx)或SphU.asyncEntry(xxx)和entry.exit()包裹代码,区间内的代码将被定义为资源,Sentinel将对资源进行保护。
注解定义
Sentinel 支持通过 @SentinelResource 注解定义资源并配置 blockHandler 和 fallback 函数来进行限流之后的处理。
规则种类
Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。
流量控制规则 (FlowRule)
流量控制规则对流量进行统计,当流量超出阈值时,对请求进行限制,使用FlowRuleManager配置规则。
流量统计方式
流量控制的两种统计方法,一是并发线程数流量控制,二是QPS流量控制
- 并发线程数流量控制(
RuleConstant.FLOW_GRADE_THREAD) - QPS流量控制(
RuleConstant.FLOW_GRADE_QPS)
当QPS超过某个阈值时候,则采取措施进行流量控制,有如下几种方法:
- 直接拒绝(
RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式- 冷启动(
RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式- 匀速器(
RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式
基于调用关系的流量控制(限流策略)
- 调用方origin限流
limitApp - 根据调用链路入口限流:链路限流(
RuleConstant.CHAIN) - 具有关系的资源流量控制:关联流量控制(
RuleConstant.RELATE)
示例
@GetMapping("/flowRule/helloWorld")
public void flowRuleHelloWorld() {
System.out.println("flowRule hello world");
}
熔断降级规则 (DegradeRule)
在微服务架构中,一个服务通常会依赖其他一个或多个服务,当链路上一个服务出现异常时,会造成流量堆积,大量流量堆积而不处理也会导致服务本身出现异常,这时就需要熔断降级机制,断开对异常服务的调用。使用DegradeRuleManager配置规则。
熔断降级策略
sentinel提供了多种熔断降级的策略,包括:
- 慢调用比例 (
SLOW_REQUEST_RATIO):超过设定的慢调用时间RT后响应的调用称为慢调用。当单位统计时间内,慢调用比例超过设定的阈值时,熔断器开启。经过熔断时长后,熔断器进入探测恢复阶段,若接下来一个请求响应时间小于RT,则结束熔断,否则继续熔断。 - 异常比例 (
ERROR_RATIO):当单位统计时间内,请求异常比例超过设定的阈值时,熔断器开启。经过熔断时长后,熔断器进如探测恢复阶段,若接下来一个请求成功,则结束熔断,否则继续熔断。 - 异常数 (
ERROR_COUNT):当单位统计时间内,异常请求数超过阈值时,熔断器开启。经过熔断时长后,熔断器进入探测恢复阶段,若接下来一个请求成功,则结束熔断,否则继续熔断。
示例
@GetMapping("/degradeRule/helloWorld")
public void degradeRuleHelloWorld() {
int i = new Random(System.currentTimeMillis()).nextInt(2);
if (i == 0) {
System.out.println("degradeRule hello world");
} else {
throw new RuntimeException();
}
}
系统保护规则 (SystemRule)
Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。使用SystemRuleManager配置规则。
访问控制规则 (AuthorityRule)
Sentinel提供的黑白名单功能,黑白名单根据资源的请求来源(origin)限制资源是否通过。
通过使用AuthorityRuleManager传入AuthorityRule设置访问控制规则
热点规则 (ParamFlowRule)
热点参数限流是指对最近经常被访问的数据,进行限制。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。
使用
- 引入依赖开启热点参数限流
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-parameter-flow-control</artifactId> <version>x.y.z</version> </dependency>- 通过
ParamFlowRuleManager的loadRules方法更新热点参数规则
网关流量控制
Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。
用户可以通过 GatewayRuleManager.loadRules(rules) 手动加载网关规则,或通过 GatewayRuleManager.register2Property(property) 注册动态规则源动态推送(推荐方式)。
集群流量控制
集群限流是指对整个服务集群进行总的入口流量进行控制,使整个集群内的流量总和不超过阈值。sentinel提供了集群限流服务端组件和集群限流客户端组件。
Token Client向Server发送流量情况,Server统计整个集群的流量情况。client和server互相同步数据,按照集群限流规则进行限流。
集群限流有两种部署模式。一是独立部署,server单独一个应用。二是嵌入式部署,server嵌入到应用实例中部署。
集群限流客户端
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-cluster-client-default</artifactId> <version>1.8.6</version> </dependency>集群限流服务端
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-cluster-server-default</artifactId> <version>1.8.6</version> </dependency>动态规则扩展
Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则:
- 通过 API 直接修改 (
loadRules) - 通过
DataSource适配不同数据源修改
DataSource扩展
DataSource 扩展常见的实现方式有:
- 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;
- 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。
示例
拉模式:使用本地文件配置规则
- 引入数据源依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-extension</artifactId>
<version>x.y.z</version>
</dependency>- 配置规则文件路径以及文件内容解析器,生成文件规则数据源对象,将对象注册到规则管理器中。
- 如需将内存中规则持久化到本地,需要配置规则文件路径以及解析器,生成可写数据源对象,将对象与可读规则数据源对象绑定。
推模式:使用 Nacos 配置规则
Nacos 是阿里中间件团队开源的服务发现和动态配置中心。Sentinel 针对 Nacos 作了适配,底层可以采用 Nacos 作为规则配置数据源。使用时只需添加以下依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>x.y.z</version>
</dependency>然后创建 NacosDataSource 并将其注册至对应的 RuleManager 上即可。比如:
// remoteAddress 代表 Nacos 服务端的地址
// groupId 和 dataId 对应 Nacos 中相应配置
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(remoteAddress, groupId, dataId,
source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());配置项
默认 Sentinel 会尝试从 classpath:sentinel.properties 文件读取配置,读取编码默认为 UTF-8,用户也可以通过 -Dcsp.sentinel.config.file 参数配置 properties 文件的路径。
- sentinel-core 的配置项
- 日志相关配置项
- sentinel-transport-common 的配置项
Sentinel异常
Sentinel限流异常BlockException父类包含5个子类:
- FlowException 限流异常
- DegradeException 降级异常
- ParamFlowException 参数限流异常
- AuthorityException 授权异常
- SystemBlockException 系统负载异常
开源框架适配
sentinel适配多种开源框架:
- spring boot/spring cloud
- web servlet
- spring webflux
- dubbo
- gRPC
- Feign
- spring cloud gateway
- Apache RocketMQ
Spring Boot/Cloud下使用Sentinel
- 引入sentinel的Spring Cloud适配依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>- 在应用配置文件中,配置应用名、监控端口和控制台地址。
spring:
application:
name: app
cloud:
sentinel:
transport:
port: 8719
dashboard: 127.0.0.1:8080
server:
port: 8081- 定义control层,Sentinel starter 默认为所有的 HTTP 服务提供了限流埋点进行拦截增强。
@RestController
public class SentinelControl {
@GetMapping("/helloWorld")
public void helloWorld() {
System.out.println("hello world");
}
}Spring Cloud下Sentinel适配Nacos配置中心
- 引入sentinel的nacos数据源适配器依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--引入nacos作为sentinel的配置源-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-datasource</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>- 应用配置文件applicaiton.yml中配置nacos数据源
spring:
application:
name: sentinel-spring-cloud-study
cloud:
sentinel:
transport:
port: 8719
dashboard: 127.0.0.1:8858
datasource:
#数据源编号
nacos_flow_rule:
#数据源类型
nacos:
server-addr: 127.0.0.1:8848
#默认为空代表public
namespace: 88adade4-8ac6-46d9-addd-e6610a4d87e8
#默认DEFAULT_GROUP
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-sentinel-flow-rule.json
#默认json
data-type: json
rule-type: flow
nacos_degrade_rule:
nacos:
server-addr: 127.0.0.1:8848
namespace: 88adade4-8ac6-46d9-addd-e6610a4d87e8
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-sentinel-degrade-rule.json
data-type: json
rule-type: degrade
server:
port: 8081namespace:传入namespace的id,为public时不用填。server-add:nacos服务器地址,必填data-id:数据集id,必填rule-type:sentinel规则类型,必须
- 在nacos控制台中配置限流规则,会自动推送到应用,同时应用会把规则推送到sentinel控制台。

[
{
"resource": "/flowRule/helloWorld",
"count": 1,
"grade": 1
}
]