引言:硬编码规则的痛点
在前面的文章中,我们一直使用硬编码的方式配置Sentinel规则:
@PostConstruct
public void initFlowRule() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("orderCreate");
rule.setCount(1000); // ← 硬编码在代码中
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
硬编码规则的问题:
- 无法动态调整:修改限流阈值需要重新部署
- 无法统一管理:每个服务都要单独配置
- 无法应对突发情况:流量激增时无法快速调整
- 配置不可追溯:不知道谁在什么时候改了配置
解决方案:将规则配置到配置中心(如Nacos、Apollo),实现动态更新。
规则持久化的三种模式
1. 原始模式(内存模式)
特点:
- 规则存储在内存中
- 应用重启后规则丢失
- Dashboard推送规则,应用无法持久化
问题:无法持久化,生产环境不推荐。
2. Pull模式(定时拉取)
工作流程:
应用启动
↓
定时从配置中心拉取规则(如每30秒)
↓
更新内存中的规则
↓
继续定时拉取
优点:实现简单 缺点:实时性差,可能延迟30秒
3. Push模式(推送模式)
工作流程:
Dashboard修改规则
↓
推送到配置中心(如Nacos)
↓
配置中心通知所有订阅的应用
↓
应用实时更新规则
优点:实时性高(秒级) 缺点:实现复杂
推荐:生产环境使用Push模式 + Nacos。
Nacos配置中心集成(Push模式)
第一步:添加依赖
<!-- Sentinel Nacos数据源 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.6</version>
</dependency>
<!-- Nacos客户端 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.0</version>
</dependency>
第二步:配置application.yml
spring:
application:
name: order-service
cloud:
sentinel:
transport:
dashboard: localhost:8080
datasource:
# 流控规则
flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-flow-rules
groupId: SENTINEL_GROUP
rule-type: flow
data-type: json
# 熔断规则
degrade:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-degrade-rules
groupId: SENTINEL_GROUP
rule-type: degrade
data-type: json
# 系统保护规则
system:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-system-rules
groupId: SENTINEL_GROUP
rule-type: system
data-type: json
第三步:在Nacos中配置规则
登录Nacos控制台(http://localhost:8848/nacos):
- 点击"配置管理" → “配置列表”
- 点击"+“创建配置
- 配置如下:
Data ID:order-service-flow-rules
Group:SENTINEL_GROUP
配置格式:JSON
配置内容:
[
{
"resource": "orderCreate",
"limitApp": "default",
"grade": 1,
"count": 1000,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
},
{
"resource": "orderQuery",
"limitApp": "default",
"grade": 1,
"count": 2000,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
字段说明:
| 字段 | 含义 | 值说明 |
|---|---|---|
resource | 资源名 | 接口或方法名 |
limitApp | 来源应用 | default表示所有来源 |
grade | 限流模式 | 1=QPS, 0=线程数 |
count | 限流阈值 | 数值 |
strategy | 流控策略 | 0=直接, 1=关联, 2=链路 |
controlBehavior | 流控效果 | 0=快速失败, 1=Warm Up, 2=匀速排队 |
clusterMode | 是否集群模式 | true/false |
第四步:验证动态更新
- 启动应用,观察日志:
✅ 从Nacos加载流控规则:2条
在Nacos中修改配置,将
orderCreate的count改为500观察应用日志(实时更新):
✅ 流控规则已更新:orderCreate QPS 1000 → 500
- 测试接口,验证限流阈值已改为500
完整实战案例:订单服务动态规则
场景描述
订单服务需要动态管理以下规则:
- 流控规则:订单创建、订单查询
- 熔断规则:调用商品服务、调用库存服务
- 系统保护规则:CPU、Load
在Nacos中配置规则
1. 流控规则(order-service-flow-rules)
[
{
"resource": "orderCreate",
"limitApp": "default",
"grade": 1,
"count": 1000,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
},
{
"resource": "orderQuery",
"limitApp": "default",
"grade": 1,
"count": 2000,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
2. 熔断规则(order-service-degrade-rules)
[
{
"resource": "callProductService",
"grade": 0,
"count": 1000,
"timeWindow": 10,
"minRequestAmount": 5,
"statIntervalMs": 10000,
"slowRatioThreshold": 0.5
},
{
"resource": "callInventoryService",
"grade": 0,
"count": 1000,
"timeWindow": 10,
"minRequestAmount": 5,
"statIntervalMs": 10000,
"slowRatioThreshold": 0.5
}
]
熔断规则字段说明:
| 字段 | 含义 | 值说明 |
|---|---|---|
grade | 熔断策略 | 0=慢调用比例, 1=异常比例, 2=异常数 |
count | 阈值 | 慢调用RT阈值(ms) / 异常比例 / 异常数 |
timeWindow | 熔断时长 | 单位秒 |
slowRatioThreshold | 慢调用比例 | 0.0-1.0 |
3. 系统保护规则(order-service-system-rules)
[
{
"highestSystemLoad": 4.0,
"highestCpuUsage": 0.8,
"avgRt": 500,
"maxThread": 50,
"qps": -1
}
]
系统保护字段说明:
| 字段 | 含义 | 说明 |
|---|---|---|
highestSystemLoad | Load阈值 | -1表示不启用 |
highestCpuUsage | CPU使用率阈值 | 0.0-1.0 |
avgRt | 平均RT阈值 | 毫秒 |
maxThread | 并发线程数阈值 | 整数 |
qps | 入口QPS阈值 | -1表示不启用 |
Sentinel Dashboard + Nacos集成
问题:Dashboard推送的规则不持久化
现状:
- Dashboard推送规则到应用
- 应用重启后规则丢失
目标:
- Dashboard推送规则到Nacos
- 应用从Nacos加载规则
- 应用重启后规则不丢失
解决方案:改造Sentinel Dashboard
第一步:下载Sentinel源码
git clone https://github.com/alibaba/Sentinel.git
cd Sentinel/sentinel-dashboard
第二步:修改pom.xml
<!-- 取消Nacos依赖的注释 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<scope>test</scope>
</dependency>
去掉<scope>test</scope>。
第三步:修改配置文件
在src/main/resources/application.properties中添加:
# Nacos配置
nacos.server-addr=localhost:8848
nacos.namespace=
nacos.group-id=SENTINEL_GROUP
第四步:修改推送逻辑
修改FlowControllerV2.java,将推送目标从应用改为Nacos。
第五步:重新打包
mvn clean package -DskipTests
第六步:启动Dashboard
java -jar sentinel-dashboard.jar
Apollo配置中心集成
添加依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-apollo</artifactId>
<version>1.8.6</version>
</dependency>
配置application.yml
spring:
cloud:
sentinel:
datasource:
flow:
apollo:
namespace-name: application
flow-rules-key: sentinel.flow.rules
default-flow-rule-value: []
rule-type: flow
在Apollo中配置规则
Namespace:application
Key:sentinel.flow.rules
Value:
[
{
"resource": "orderCreate",
"count": 1000,
"grade": 1
}
]
最佳实践
1. 规则命名规范
建议格式:{应用名}-{规则类型}-rules
order-service-flow-rules # 流控规则
order-service-degrade-rules # 熔断规则
order-service-system-rules # 系统规则
order-service-authority-rules # 授权规则
order-service-param-flow-rules # 热点规则
2. 规则版本管理
方案:在Nacos中使用不同的DataId管理版本
order-service-flow-rules-v1 # 版本1
order-service-flow-rules-v2 # 版本2(测试)
order-service-flow-rules # 当前生产版本
3. 规则变更流程
开发环境测试
↓
提交变更申请
↓
技术负责人审核
↓
在Nacos中修改配置
↓
灰度发布(先更新1个实例)
↓
观察效果
↓
全量发布
4. 规则备份
定时备份Nacos配置:
#!/bin/bash
# backup_sentinel_rules.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/sentinel/$DATE"
mkdir -p $BACKUP_DIR
# 备份流控规则
curl "http://localhost:8848/nacos/v1/cs/configs?dataId=order-service-flow-rules&group=SENTINEL_GROUP" \
> $BACKUP_DIR/flow-rules.json
# 备份熔断规则
curl "http://localhost:8848/nacos/v1/cs/configs?dataId=order-service-degrade-rules&group=SENTINEL_GROUP" \
> $BACKUP_DIR/degrade-rules.json
echo "备份完成:$BACKUP_DIR"
5. 监控规则变更
记录规则变更日志:
@Component
public class RuleChangeListener implements InitializingBean {
@Autowired
private ConfigService configService;
@Override
public void afterPropertiesSet() throws Exception {
// 监听流控规则变更
configService.addListener(
"order-service-flow-rules",
"SENTINEL_GROUP",
new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
log.info("流控规则已更新:{}", configInfo);
// 记录到数据库或发送告警
}
@Override
public Executor getExecutor() {
return null;
}
}
);
}
}
常见问题
1. 规则格式错误
问题:Nacos中的JSON格式错误,导致规则加载失败。
解决:
- 使用JSON格式校验工具校验
- 查看应用日志,定位错误字段
2. 规则未生效
问题:修改Nacos配置后,应用未更新。
排查:
- 检查DataId、Group是否正确
- 检查应用是否连接到Nacos
- 查看应用日志是否有更新提示
3. 规则冲突
问题:硬编码规则与Nacos规则冲突。
解决:
- 删除代码中的硬编码规则
- 所有规则统一由Nacos管理
总结
本文我们学习了Sentinel的动态规则配置:
- 硬编码规则的问题:无法动态调整、无法统一管理
- 三种持久化模式:原始模式、Pull模式、Push模式
- Nacos集成:配置数据源、在Nacos中管理规则、实时更新
- Dashboard改造:推送规则到Nacos,实现持久化
- Apollo集成:作为Nacos的替代方案
- 最佳实践:命名规范、版本管理、变更流程、备份、监控
核心要点:
动态规则配置是Sentinel生产化的关键,它将规则从硬编码迁移到配置中心,实现了规则的统一管理、动态更新和持久化。
第四阶段完结:
恭喜你完成了Sentinel进阶特性篇的学习!我们系统地学习了:
- 系统自适应保护(Load、CPU、RT)
- 热点参数限流(精准保护热点数据)
- 黑白名单与授权规则(访问控制)
- 集群流控(跨实例统一管理)
- 网关流控(统一入口防护)
- 动态规则配置(配置中心集成)
后续阶段预告:
- 第五阶段:框架集成篇(Spring Boot、Spring Cloud、Dubbo)
- 第六阶段:架构原理篇(核心架构、SlotChain、滑动窗口)
- 第七阶段:生产实践篇(Dashboard部署、监控告警、性能调优)
让我们继续探索Sentinel的更多精彩内容!