引言:硬编码规则的痛点

在前面的文章中,我们一直使用硬编码的方式配置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);
}

硬编码规则的问题

  1. 无法动态调整:修改限流阈值需要重新部署
  2. 无法统一管理:每个服务都要单独配置
  3. 无法应对突发情况:流量激增时无法快速调整
  4. 配置不可追溯:不知道谁在什么时候改了配置

解决方案:将规则配置到配置中心(如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):

  1. 点击"配置管理" → “配置列表”
  2. 点击"+“创建配置
  3. 配置如下:

Data IDorder-service-flow-rules GroupSENTINEL_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

第四步:验证动态更新

  1. 启动应用,观察日志:
✅ 从Nacos加载流控规则:2条
  1. 在Nacos中修改配置,将orderCreatecount改为500

  2. 观察应用日志(实时更新):

✅ 流控规则已更新:orderCreate QPS 1000 → 500
  1. 测试接口,验证限流阈值已改为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
  }
]

系统保护字段说明

字段含义说明
highestSystemLoadLoad阈值-1表示不启用
highestCpuUsageCPU使用率阈值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中配置规则

Namespaceapplication Keysentinel.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配置后,应用未更新。

排查

  1. 检查DataId、Group是否正确
  2. 检查应用是否连接到Nacos
  3. 查看应用日志是否有更新提示

3. 规则冲突

问题:硬编码规则与Nacos规则冲突。

解决

  • 删除代码中的硬编码规则
  • 所有规则统一由Nacos管理

总结

本文我们学习了Sentinel的动态规则配置:

  1. 硬编码规则的问题:无法动态调整、无法统一管理
  2. 三种持久化模式:原始模式、Pull模式、Push模式
  3. Nacos集成:配置数据源、在Nacos中管理规则、实时更新
  4. Dashboard改造:推送规则到Nacos,实现持久化
  5. Apollo集成:作为Nacos的替代方案
  6. 最佳实践:命名规范、版本管理、变更流程、备份、监控

核心要点

动态规则配置是Sentinel生产化的关键,它将规则从硬编码迁移到配置中心,实现了规则的统一管理、动态更新和持久化。

第四阶段完结

恭喜你完成了Sentinel进阶特性篇的学习!我们系统地学习了:

  • 系统自适应保护(Load、CPU、RT)
  • 热点参数限流(精准保护热点数据)
  • 黑白名单与授权规则(访问控制)
  • 集群流控(跨实例统一管理)
  • 网关流控(统一入口防护)
  • 动态规则配置(配置中心集成)

后续阶段预告

  • 第五阶段:框架集成篇(Spring Boot、Spring Cloud、Dubbo)
  • 第六阶段:架构原理篇(核心架构、SlotChain、滑动窗口)
  • 第七阶段:生产实践篇(Dashboard部署、监控告警、性能调优)

让我们继续探索Sentinel的更多精彩内容!