Sentinel实现接口流量控制
简介
Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面。
启动控制台
java -Dserver.port=8089 -Dcsp.sentinel.dashboard.server=localhost:8089 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar
注意不要使用windows下的PowerShell,要使用默认的命令行工具(cmd),不然报错误: 找不到或无法加载主类 .port=8089
http://localhost:8089 来打开控制台,默认账号密码 sentinel/sentinel
客户端使用
添加依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.6.3</version>
</dependency>
<!-- sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
添加控制台和nacos的配置
通过nacos来存储限流规则
spring:
application:
name: spring-seata-product
cloud:
sentinel:
transport:
dashboard: localhost:8089
datasource:
ds:
nacos:
server-addr: 42.192.20.119:8848
data_id: ${spring.application.name}-flow-rule.json
group-id: DEFAULT_GROUP
data-type: json
rule-type: flow
具体规则如下
[
{
"resource": "/info", // 限制的资源
"limitApp": "default",
"grade": 1, // 基于QPS控制
"count": 2, // 限流阈值
"strategy": 0, // 根据调用方限流
"controlBehavior": 0, // 控制手段 超过直接拒绝
"clusterMode": false
}
]
更多字段的含义可以查看官方文档,或者查看源码中的 com.alibaba.csp.sentinel.slots.block.flow.FlowRule类。
定义资源
@RestController
public class HealthController {
@SentinelResource(value = "/info")
@GetMapping("/info")
public String info() {
return "success";
}
}
通过@SentinelResource注解来定义资源
限流效果
Blocked by Sentinel (flow limiting)
原理分析
- com.alibaba.cloud.sentinel.SentinelWebAutoConfiguration配置类中配置了CommonFilter
- com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration配置类中配置了SentinelResourceAspect,拦截所有包含@SentinelResource注解的方法
- 过滤器和拦截器最终都会进入com.alibaba.csp.sentinel.SphU的entry()方法
- 会进入com.alibaba.csp.sentinel.slots.block.flow.FlowSlot的entry()方法
- 使用FlowRuleChecker来进行流量检查,如果不能通过,抛出FlowException异常,过滤器捕获此异常做处理。
参考
Spring Boot 集成 Sentinel 实现接口流量控制
springboot集成Sentinel & Nacos「持久化」
阿里 Sentinel 源码解析-javadoop.com
官方文档