spring boot 中 sentinel + redis 实现集群限流的关键是:必须启用 sentinel-cluster-server-default 模块、配置 cluster.server.enabled=true、使用 stringredistemplate 且不覆盖默认 bean、规则与计数器共用同一 redis 实例,并确保网关注册规则源及暴露 8719 端口以支持节点发现。

Spring Boot 里用 Sentinel + Redis 做集群流控,关键不是“能不能配通”,而是「Sentinel 的集群限流规则必须存到 Redis,且所有网关实例共用同一套规则和计数器」。否则单机限流起不到分布式保护作用。
sentinel-cluster-server-default.conf 配置必须显式启用
Sentinel 默认只支持单机限流,集群模式需要额外启动 sentinel-cluster-server-default 模块,并在配置中明确打开。常见错误是只加了依赖、写了 redis:// 地址,但没配集群服务开关,结果限流始终走本地内存计数,压测时完全失效。
- 确认引入了
com.alibaba.csp:sentinel-cluster-server-redis依赖(注意不是-client) - 在
application.yml中添加:spring: cloud: sentinel: transport: dashboard: localhost:8080 datasource: ds1: nacos: server-addr: 127.0.0.1:8848 data-id: sentinel-flow-rules group-id: DEFAULT_GROUP rule-type: flow # 必须开启集群服务端 cluster: client: enabled: true server: enabled: true redis: # 指向共享的 Redis 实例(非哨兵/集群地址,用单点或连接池直连) address: redis://127.0.0.1:6379 password: your_password database: 1 -
database: 1建议单独划出一个 DB,避免和业务缓存混用导致 key 冲突或误清
RedisTemplate 必须使用 StringRedisTemplate 且 key 命名需兼容 Sentinel
Sentinel 集群服务端内部通过固定前缀写入 Redis,比如限流计数器用 sentinel:cluster:counter:{app}:{resource},如果项目里自定义了 RedisTemplate<object object></object> 并全局替换掉默认 Bean,会导致 Sentinel 无法读写自己的 key。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 不要覆盖 Spring Boot 自动配置的
StringRedisTemplate,尤其避免在@Configuration里声明同名 Bean - 若需自定义序列化,只针对业务用的
RedisTemplate<string yourdto></string>,并指定不同 bean 名,例如:@Bean("businessRedisTemplate") public RedisTemplate<string yourdto> businessRedisTemplate(RedisConnectionFactory factory) { ... }</string> - 检查实际写入 Redis 的 key:用
redis-cli连上后执行KEYS sentinel:cluster:*,应能看到类似sentinel:cluster:token:xxx和sentinel:cluster:counter:gateway-api:/order/create的 key
网关层必须注册 FlowRuleManager 并监听 Redis 规则变更
Spring Cloud Gateway 自身不感知 Sentinel 集群规则,得靠手动触发加载。否则即使你在 Sentinel 控制台推送了集群流控规则,网关也不会生效。
- 在网关启动类或
@PostConstruct方法中调用:FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
- 推荐用
NacosDataSource或RedisDataSource加载规则,例如基于 Redis 的规则源:new RedisDataSource<list>>( redisTemplate, "sentinel:flow:rules", source -> JSON.parseObject(source, new TypeReference<list>>() {}) );</list></list> - 注意:
sentinel:flow:rules这个 key 是你自定义的,需和 Sentinel 控制台推送的目标 key 一致;Sentinel Dashboard 默认推送到 Nacos,如用 Redis 存规则,需二次开发控制台或改用 API 手动写入
最容易被忽略的是:Sentinel 集群限流依赖心跳保活和节点发现,如果网关实例部署在 Docker 或 K8s 里,且未正确暴露 port 8719(Sentinel 默认通信端口),节点间会无法组网,表现为控制台显示“无机器”,集群规则根本下发不了。










