1. 引入依赖
在 pom.xml 中添加 Sentinel 依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.6</version>
</dependency>
<!-- Spring Cloud Alibaba Sentinel Starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2021.0.5.0</version>
</dependency>
2. 基本配置(application.yml)
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel 控制台地址
port: 8719 # 应用与控制台通信端口
eager: true # 启动时立即建立连接
3. 启动 Sentinel 控制台
下载 Sentinel 控制台,运行:
java -jar sentinel-dashboard-xxx.jar
默认端口是 8080。
4. 代码中使用 Sentinel 注解
比如对某个接口限流:
@RestController
public class TestController {
@GetMapping("/hello")
@SentinelResource(value = "hello", blockHandler = "handleBlock")
public String hello() {
return "Hello, Sentinel!";
}
public String handleBlock(BlockException ex) {
return "请求被限流啦!";
}
}
5. 配置规则(方式)
- 控制台配置:推荐,直观易用。
- 代码配置:如限流规则,可以在启动时通过代码加载。
示例:代码方式添加限流规则
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("hello");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(2); // QPS = 2
rules.add(rule);
FlowRuleManager.loadRules(rules);
6. 常见规则类型
- 限流(FlowRule)
- 熔断降级(DegradeRule)
- 热点参数限流(ParamFlowRule)
- 系统保护(SystemRule)
7. Sentinel 配置文件方式
可以通过 sentinel.properties 文件进行配置,常见参数如下:
csp.sentinel.dashboard.server=localhost:8080
csp.sentinel.api.port=8719
8. 与 Nacos、Apollo 等配置中心集成
可以将 Sentinel 规则持久化到 Nacos、Apollo 等配置中心,实现动态规则变更。
9. 常见规则详细说明
9.1 限流规则(FlowRule)
- 资源名:需要保护的资源(如接口名、方法名等)。
- 限流阈值:如 QPS、线程数。
- 限流模式:直接、关联、链路。
- 流控效果:快速失败、排队等待、预热。
示例代码:
FlowRule rule = new FlowRule();
rule.setResource("testResource");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(5); // 每秒最多 5 次
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT); // 直接拒绝
FlowRuleManager.loadRules(Collections.singletonList(rule));
9.2 熔断降级规则(DegradeRule)
- 触发条件:慢调用比例、异常比例、异常数。
- 熔断时长:熔断多少秒后自动恢复。
示例代码:
DegradeRule rule = new DegradeRule();
rule.setResource("testResource");
rule.setGrade(CircuitBreakRuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);
rule.setCount(0.5); // 异常比例达到 50% 时熔断
rule.setTimeWindow(10); // 熔断 10 秒
DegradeRuleManager.loadRules(Collections.singletonList(rule));
9.3 热点参数限流(ParamFlowRule)
针对带参数的接口,可以根据参数值限流。
ParamFlowRule rule = new ParamFlowRule("testParamResource")
.setParamIdx(0) // 对第一个参数限流
.setCount(10); // 每秒最多 10 个不同参数访问
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
9.4 系统保护规则(SystemRule)
根据系统负载、CPU 使用率等自动保护。
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(3.0);
SystemRuleManager.loadRules(Collections.singletonList(rule));
10. 规则持久化
10.1 Nacos 持久化
在 application.yml 中配置:
spring:
cloud:
sentinel:
datasource:
flow:
nacos:
server-addr: 127.0.0.1:8848
dataId: ${spring.application.name}-sentinel-flow
groupId: DEFAULT_GROUP
rule-type: flow
这样配置后,限流规则会自动从 Nacos 加载和持久化。
10.2 Apollo、ZooKeeper 等
可以参考 官方文档 配置。
11. 微服务场景下的 Sentinel
11.1 与 Spring Cloud Gateway 集成
引入依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置 application.yml:
spring:
cloud:
gateway:
sentinel:
enabled: true
通过控制台或配置中心管理限流规则。
11.2 与 Feign、RestTemplate 集成
Feign 客户端自动支持 Sentinel,可通过 @SentinelResource 注解实现自定义降级逻辑。
12. Sentinel 控制台使用技巧
- 登录控制台后,左侧菜单可以选择流控规则、降级规则等,针对具体资源进行配置。
- 支持实时监控,查看 QPS、响应时间等指标。
- 支持集群限流,适用于分布式场景。
13. 常见问题与解决
- 控制台无法连接:检查端口和防火墙,确保
dashboard地址和端口正确。 - 规则不生效:确认资源名(如接口名)与规则一致,且已正确加载。
- 持久化失败:检查配置中心地址和权限,确保应用能访问 Nacos/Apollo。
14. 集群限流(Cluster Flow Control)
在分布式系统中,单机限流可能不够,需要集群限流。
14.1 集群限流模式
- 客户端模式:业务服务作为客户端,所有限流请求发送到集群服务端处理。
- 服务端模式:专门部署 Sentinel 集群服务端,负责限流规则的统一管理和计算。
14.2 集群限流部署步骤
-
下载并启动 Sentinel 集群服务端
参考 官方文档 下载集群服务端 jar 包,启动服务端。 -
配置业务服务为客户端
在application.yml或sentinel.properties配置集群服务端地址:csp.sentinel.cluster.server.host=127.0.0.1 csp.sentinel.cluster.server.port=7777 csp.sentinel.cluster.request.timeout=200 -
配置规则
可以通过控制台或 API 设置集群限流规则。
15. 自定义扩展
Sentinel 支持多种自定义扩展,主要包括:
15.1 自定义 BlockException 处理
可以全局处理限流/降级异常,提升用户体验。
public class MyUrlBlockHandler implements UrlBlockHandler {
@Override
public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException {
response.setStatus(429);
response.getWriter().write("自定义限流提示:请求太快啦!");
}
}
然后注册到 Spring:
@Bean
public UrlBlockHandler urlBlockHandler() {
return new MyUrlBlockHandler();
}
15.2 自定义资源定义
Sentinel 支持对任意代码块进行保护:
Entry entry = null;
try {
entry = SphU.entry("myCustomResource");
// 受保护的业务逻辑
} catch (BlockException ex) {
// 限流处理
} finally {
if (entry != null) {
entry.exit();
}
}
16. 监控与报警
16.1 控制台监控
Sentinel 控制台可以实时监控每个资源的 QPS、RT、Block 次数等。
16.2 集成外部监控系统
- Prometheus:通过 Sentinel Adapter for Prometheus 导出指标。
- 自定义报警:通过实现
com.alibaba.csp.sentinel.slots.block.BlockException的处理器,将报警信息推送到钉钉、邮件等。
17. 动态规则推送
Sentinel 支持多种动态规则推送方式:
- Nacos:推荐,支持规则热更新。
- Apollo、ZooKeeper、Etcd:适合不同的配置中心场景。
配置示例(Nacos):
spring:
cloud:
sentinel:
datasource:
flow:
nacos:
server-addr: 127.0.0.1:8848
dataId: ${spring.application.name}-sentinel-flow
groupId: DEFAULT_GROUP
rule-type: flow
18. 常见最佳实践
- 资源名规范:建议用
服务名:接口名作为资源名,便于管理。 - 规则分级管理:不同业务、不同环境可配置不同的限流/降级规则。
- 预警机制:及时发现限流、熔断现象,快速定位问题。
- 灰度发布规则:可以先只对部分流量或接口启用限流,逐步扩展。

8821

被折叠的 条评论
为什么被折叠?



