Sentinel 规则持久化最省事的路子就是走 SCA 自带的 datasource 配置,一个 Java 配置类都不用写。
spring:
cloud:
sentinel:
datasource:
flow:
nacos:
server-addr: 127.0.0.1:8848
data-id: user-service-flow-rules
group-id: SENTINEL_GROUP
rule-type: flow
Nacos 里建同名 dataId,内容是 FlowRule 的 JSON 数组,比如 [{"resource":"/order/create","limitApp":"default","grade":1,"count":20,"strategy":0,"controlBehavior":0}]。grade 1 是 QPS、0 是线程数,rule-type 按需换 flow / degrade / param-flow / gw-flow。启动后改 Nacos 配置即时生效,重启也不丢。
但这条路是只读的——规则得去 Nacos 控制台手写 JSON。想让 Sentinel 控制台里改的规则回写 Nacos,官方 dashboard 做不到,它把规则只存在自己内存里。要双向就得改 dashboard 源码:把 sentinel-dashboard 里 test 目录下的 Nacos 相关实现挪进 main,然后替换 FlowRuleRepository 等的 provider/publisher 为 Nacos 版本,改完重新打包。嫌麻烦就接受只读方案,把 Nacos 当唯一规则源头,控制台只看不改,反而更干净——生产环境本来也不该有人在控制台手点规则。
你前面三条我都认,补两个细节。@ConfigurationProperties 能刷新靠的是 ConfigurationPropertiesRebinder 重建 Bean,所以带运行时状态的(连接池、本地缓存)刷新后状态会丢,这类 Bean 反而适合用 @Value 加 @RefreshScope 精确控制。另外走 spring.config.import 时 group 和 namespace 是写在 dataId 后面的查询参数里的,像 optional:nacos:user-service.yaml?group=DEFAULT_GROUP,不写就默认 DEFAULT_GROUP,这点容易和 shared-configs 的写法搞混。
Feign 首次慢还有个更直接的解法:spring.cloud.loadbalancer.eager-load.clients 列上服务名,启动时就把实例列表拉全,压测第一波不会那么难看。7858 那事提醒得好,集群 Raft 端口确实最容易被漏掉。