简介:本资源是面向微服务架构开发者与运维工程师的 Sentinel 1.8.6 版本实战集成方案,聚焦于 Sentinel-dashboard 与 Nacos 的深度对接,并扩展支持 Spring Cloud Gateway 的动态限流能力,解决分布式系统中流量治理规则分散、配置难同步、管控不直观等核心痛点。压缩包共568个文件,涵盖151个Java源码(含GatewayFlowRuleController、ClusterConfigService等关键类)、170个编译后class文件、98个前端JS/HTML页面(支撑控制台交互)、74个HTML/htm视图页及18个XML配置文件,整体26.25MB,结构完整覆盖后端逻辑、前端界面与配置体系。已有194人学习下载,资源提供开箱即用的application.properties配置模板、Nacos规则持久化适配代码及Gateway网关限流全链路实现,可直接部署验证,助读者快速掌握服务发现、动态规则下发与网关级流控三位一体的生产级治理实践。
1. Sentinel Dashboard 1.8.6 + Nacos + Gateway 三件套落地:不是配完就能限流,而是配完得能看见、改得动、压不垮
你花两小时把sentinel-dashboard-1.8.6.jar启起来,Nacos 也跑通了,Gateway 的spring-cloud-alibaba-sentinel-gateway依赖加好了,接口一压——流量还是直冲后端,Dashboard 上连个规则影子都看不到。这不是你环境没配对,而是Sentinel 的规则下发链路根本没打通:Dashboard 是控制台,Nacos 是规则存储中心,Gateway 是执行端,三者之间缺一个“握手协议”和“心跳确认”。1.8.6 版本恰恰卡在旧版 Dashboard 默认用HttpCommandCenter拉取规则(已弃用),而 Gateway 2.x+ 默认走NacosDataSource推送模式,两边根本不在一个频道上。这篇文章不讲概念,只拆你真正要改的 5 个配置项、3 个 Java 类、2 个 Nacos GroupKey 命名规范,以及为什么flowRules写进 Nacos 后 Gateway 就是不生效——因为你在application.yml里漏写了spring.cloud.sentinel.datasource.ds1.nacos.group-id,而这个 group-id 必须和 Dashboard 里sentinel.nacos.groupId完全一致,差一个字母,规则就永远躺在 Nacos 里睡大觉。适合正在联调网关限流、被 Dashboard 规则不生效折磨超过 4 小时的后端/中间件工程师。
2. 为什么必须用 Nacos 而不是默认内存?——规则持久化与集群协同的本质需求
2.1 内存规则的致命缺陷:重启即失 + 多实例不同步
Sentinel Dashboard 默认使用InMemoryRuleRepository存储流控规则。这意味着:
- 所有在 Dashboard UI 上新增/修改的规则,仅保存在 JVM 堆内存中;
- Dashboard 进程重启后,全部规则清零;
- 若部署多个 Dashboard 实例(如高可用场景),各实例内存规则完全独立,无法同步;
- Gateway 实例通过
HeartbeatSender定期向 Dashboard 拉取规则,但 Dashboard 自身无持久化能力,导致 Gateway 拉到的永远是“空规则”。
提示:生产环境绝对禁止使用内存规则。哪怕单机部署,只要 Gateway 重启或机器宕机,限流策略就归零,等于裸奔。
2.2 Nacos 作为规则中心的不可替代性
Nacos 在此架构中承担规则注册中心 + 配置分发中枢 + 变更通知总线三重角色:
- 持久化:规则写入 Nacos 的
ConfigService,即使 Dashboard 或 Gateway 全部宕机,规则依然存在; - 多实例协同:所有 Gateway 实例监听同一 Nacos DataId,Nacos 推送变更,各实例实时更新本地规则缓存;
- 动态热更新:无需重启任何服务,修改 Nacos 配置即可秒级生效;
- 权限与审计:Nacos 控制台支持配置版本回滚、操作日志审计,满足合规要求。
对比其他方案:
- Apollo:需额外部署 Apollo Server,Spring Cloud Alibaba 官方对 Apollo 的 Sentinel DataSource 支持较弱,社区维护滞后;
- ZooKeeper:无原生配置管理 UI,规则调试成本高,且 ZK 的 Watcher 机制在大规模变更时易丢事件;
- Redis:需自行实现发布订阅逻辑,Sentinel 官方未提供 RedisDataSource,稳定性风险高。
因此,Nacos 不是“可选”,而是 Sentinel 生产级限流落地的事实标准。尤其当你的 Gateway 是集群部署(≥2 实例)时,Nacos 是唯一能保证规则强一致性的方案。
2.3 Sentinel 1.8.6 对 Nacos 的适配关键点
Sentinel 1.8.6 的sentinel-datasource-nacos模块基于 Nacos 2.x SDK 开发,需特别注意:
- 最低兼容版本:Nacos Server ≥ 2.0.3(1.x 版本不支持
ConfigService的addListener增量推送); - SDK 版本绑定:
sentinel-datasource-nacos1.8.6 依赖com.alibaba.nacos:nacos-client:2.1.0,若项目中已引入更高版本(如 2.2.3),需显式排除旧版避免冲突; - Group ID 语义强化:1.8.6 开始,
groupId不再是简单命名空间,而是规则作用域标识。例如SENTINEL_GROUP表示“所有 Sentinel 规则”,GATEWAY_GROUP表示“仅限 Gateway 流控规则”,Dashboard 和 Gateway 必须使用完全相同的 groupId才能匹配。
验证方式:启动 Nacos 控制台 → 查看配置管理 > 配置列表→ 确认Data ID格式为com.alibaba.csp.sentinel.config.gateway.flow.rule,Group显示为你配置的SENTINEL_GROUP。若 Group 显示为空或DEFAULT_GROUP,说明配置未生效。
3. Dashboard 1.8.6 集成 Nacos:从启动参数到源码级改造
3.1 启动参数配置(最简路径)
直接运行 JAR 包时,通过 JVM 参数注入 Nacos 地址与认证信息:
java -Dserver.port=8080 \ -Dcsp.sentinel.dashboard.server=localhost:8080 \ -Dproject.name=sentinel-dashboard \ -Dsentinel.nacos.server-addr=127.0.0.1:8848 \ -Dsentinel.nacos.namespace=public \ -Dsentinel.nacos.groupId=SENTINEL_GROUP \ -Dsentinel.nacos.username=nacos \ -Dsentinel.nacos.password=nacos \ -jar sentinel-dashboard-1.8.6.jar关键参数说明:
sentinel.nacos.server-addr:Nacos Server 地址,必须是 IP:PORT 格式,不能写 localhost(Gateway 实例可能跨主机);sentinel.nacos.namespace:Nacos 命名空间 ID,非名称。若使用默认 public 空间,ID 为public;若创建了自定义空间(如prod-sentinel),此处填该空间的ID 字符串(非名称);sentinel.nacos.groupId:规则所属 Group,必须与 Gateway 配置中的spring.cloud.sentinel.datasource.ds1.nacos.group-id完全一致;sentinel.nacos.username/password:Nacos 认证凭据,若 Nacos 关闭鉴权可省略。
注意:参数名带
sentinel.nacos.前缀,这是 Sentinel Dashboard 内部NacosConfigUtil类读取的固定 key,拼错一个字母(如nacos.serverAddr少-)将静默失败。
3.2 源码级改造:修复 Dashboard 1.8.6 的 Nacos 初始化缺陷
Sentinel 1.8.6 的sentinel-dashboard模块存在一个隐藏 Bug:NacosConfigUtil类在初始化ConfigService时,未正确设置Properties中的namespace,导致规则始终写入public空间,即使你指定了sentinel.nacos.namespace。
修复步骤(需重新编译 Dashboard):
- 下载
sentinel-dashboard1.8.6 源码(GitHub tag v1.8.6); - 打开
sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/config/NacosConfigUtil.java; - 定位
buildNacosProperties()方法,在properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);后添加:
// 修复 namespace 未生效问题 String namespace = System.getProperty("sentinel.nacos.namespace"); if (StringUtils.isNotBlank(namespace)) { properties.put(PropertyKeyConst.NAMESPACE, namespace); }- 同时检查
NacosConfigUtil.getGroupId()方法,确保其返回值与sentinel.nacos.groupId参数一致:
public static String getGroupId() { return System.getProperty("sentinel.nacos.groupId", "SENTINEL_GROUP"); }- 执行
mvn clean package -Dmaven.test.skip=true生成新 JAR。
为什么必须改?
若不修复,Dashboard 创建规则时会忽略sentinel.nacos.namespace,所有规则强制写入public空间。而 Gateway 实例若配置了namespace=prod-sentinel,则永远监听不到规则,Dashboard UI 上显示“规则已保存”,实际 Nacos 中查不到对应配置。
3.3 Dashboard UI 规则推送逻辑验证
启动修复后的 Dashboard 后,执行以下验证:
- 访问
http://localhost:8080→ 登录 → 左侧菜单点击「流控规则」→ 「新增流控规则」; - 填写资源名(如
gateway_route_api_v1_user)、阈值、流控模式等; - 打开浏览器开发者工具 → Network 标签 → 点击「保存」→ 查看
POST /v2/flow/rule请求响应; - 正常响应应为
{"code":0,"message":"success","data":[]},且响应头含X-Flow-Rule-Source: nacos; - 登录 Nacos 控制台 →
配置管理 > 配置列表→ 筛选Group=SENTINEL_GROUP→ 应看到 Data ID 为com.alibaba.csp.sentinel.config.flow.rule的配置,内容为 JSON 格式规则数组。
若 Nacos 中无配置,检查 Dashboard 日志是否报错com.alibaba.nacos.api.exception.NacosException: no available server—— 这表示 Nacos 地址不通,而非配置错误。
4. Gateway 集群对接 Sentinel:从依赖引入到规则监听闭环
4.1 Maven 依赖与版本对齐
Gateway 项目pom.xml必须严格匹配以下组合(实测有效):
<properties> <spring-boot.version>2.6.13</spring-boot.version> <spring-cloud.version>2021.0.5</spring-cloud.version> <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version> <sentinel.version>1.8.6</sentinel.version> </properties> <dependencies> <!-- Spring Cloud Gateway --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!-- Sentinel 核心 --> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-spring-cloud-gateway-flow-control</artifactId> <version>${sentinel.version}</version> </dependency> <!-- Sentinel Nacos 数据源 --> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>${sentinel.version}</version> </dependency> <!-- Nacos Config Client --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>${spring-cloud-alibaba.version}</version> </dependency> </dependencies>关键约束:
- Spring Boot ≤ 2.6.x:Spring Cloud Gateway 3.1.x 与 Sentinel 1.8.6 兼容性不佳,2.7+ 会出现
RouteDefinitionLocatorBean 冲突; sentinel-spring-cloud-gateway-flow-control是 Alibaba 官方提供的 Gateway 专用适配器,不可替换为sentinel-spring-webmvc-adapter;sentinel-datasource-nacos版本必须与sentinel-core一致,否则NacosDataSource构造函数签名不匹配。
4.2 application.yml 核心配置
spring: cloud: # Nacos 配置中心基础配置 nacos: config: server-addr: 127.0.0.1:8848 namespace: prod-sentinel # 必须与 Dashboard 的 sentinel.nacos.namespace 一致 group: DEFAULT_GROUP username: nacos password: nacos # Sentinel 配置 sentinel: transport: dashboard: localhost:8080 # Dashboard 地址,用于上报心跳和监控数据 port: 8719 # Sentinel 客户端暴露端口,Dashboard 通过此端口拉取 metrics datasource: ds1: nacos: server-addr: ${spring.cloud.nacos.config.server-addr} namespace: ${spring.cloud.nacos.config.namespace} # 关键!必须与 Nacos Config 的 namespace 一致 group-id: SENTINEL_GROUP # 关键!必须与 Dashboard 的 sentinel.nacos.groupId 一致 style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />