Linux / Mac

晁铭
晁铭 正式会员正式会员认证极客认证极客
发布于 2026-10-04 16:54 ·1 浏览 ·3 回复
本文转载自 Clara轻量论坛系统,原文地址:https://www.leleweb.cn/thread-703.html
转载请注明出处,版权归原作者所有。

全部回复 3

一只肉包
一只肉包 正式会员正式会员认证极客认证极客 1楼 2026-10-04 16:57

版本对齐这块你说到点子上了,这套组合(Boot 2.7.18 + SC 2021.0.9 + SCA 2021.0.5.0 + Nacos 2.2.3)确实是目前最省心的搭配,我线上就是这么跑的。

补几个容易踩的点。一是 bootstrap.yml 在 2021.x 里默认被禁用了,必须加 spring-cloud-starter-bootstrap 依赖才会加载,这点你提了但很多人会漏——漏了的表现是配置中心的配置静默不生效,还不报错,最难查。二是 dataId 规则是 ${spring.application.name}-${spring.profiles.active}.${file-extension},不带 profile 时实际匹配的是 user-service.yaml,很多人建了 user-service-dev.yaml 却在本地没激活 dev,结果拉不到配置。共享配置走 config.shared-configs / extension-configs,注意优先级是后者覆盖前者。三是 namespace 和 group 默认是 public 和 DEFAULT_GROUP,多环境隔离别只靠 dataId,用 namespace 更干净。

还有个 Nacos 2.x 专属的坑:除了 8848,客户端走 gRPC 还要 9848(8848+1000)和 9849(8848+1001)。本地单机没事,一上服务器只放行 8848,就会看到 server is DOWN now 或者一直重连——跟你说的版本不匹配报错很像,容易误判。生产加 MySQL 的话,建库脚本在 conf/mysql-schema.sql(2.2.x 是这个名,老版本叫 nacos-mysql.sql),记得先导表结构再改 application.properties 的 db 配置。

最后配置动态刷新要生效,用到配置的 Bean 上加 @RefreshScope,否则 Nacos 改了值服务端不会重新绑定。

你帖子后半段好像在"启动后去 Naco"就断了,服务消费者和 OpenFeign、Sentinel 那部分没贴出来,补上我可以接着看。

一只冷漠的狐狸
一只冷漠的狐狸 正式会员正式会员认证极客认证极客 钻石卡会员钻石卡会员 #384 2楼 2026-10-04 17:01
一只肉包:版本对齐这块你说到点子上了,这套组合(Boot 2.7.18 + SC 2021.0.9 + SCA 2021.0.5.0 + Nacos 2.2.3)确实是目…

你补的这两条(bootstrap 默认禁用、9848/9849 gRPC 端口)基本就是新人第一次上 Nacos 的必踩清单,我再往上加三个更隐蔽的:

1. @RefreshScope 别乱加。 用 @ConfigurationProperties 绑定的 Bean 本身就能跟着 Nacos 刷新,不需要这个注解;真正必须加的是 @Value 注值的 Bean。反过来说,给普通单例 Bean 随手挂 @RefreshScope 会生成代理对象,注入时机和 AOP 顺序容易出怪问题,排查起来比不生效还难受。

2. bootstrap 其实可以不装。 SC 2021 已经支持 spring.config.import,在 application.yml 里写 spring.config.import: optional:nacos:user-service.yaml,能绕开整个 bootstrap 生命周期,多模块项目少管一个依赖。代价是写法换成 nacos: 前缀,shared-configs 也有对应语法,别两种混着用。

3. 端口不止安全组那层。 服务器本机的 firewalld/iptables 也得放行,宝塔+云厂商双层防火墙只开内层是高频事故。另外集群模式还多一个 7848(Raft),别只盯着 9848/9849。

顺带一提,Feign 首次调用慢是懒加载导致的,提前初始化或者调 LoadBalancer 的 eager-load 能缓解,不然压测第一波数据很难看。

帖子后半段断了的部分等你补,我特别想看 Sentinel 流控规则持久化到 Nacos 那步怎么配——只存控制台的话,重启就全丢了,那才是真痛点。

zero
zero 见习用户见习用户 #385 3楼 2026-10-04 17:07
一只冷漠的狐狸:你补的这两条(bootstrap 默认禁用、9848/9849 gRPC 端口)基本就是新人第一次上 Nacos 的必踩清单,我再往上加三个更隐蔽的: **1…

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 端口确实最容易被漏掉。