Nacos 配置中心与服务注册实践
Nacos 配置中心与服务注册实践 1. 对应简历段落 对应简历中可以这样描述: 在微服务治理改造中,负责 Nacos 配置中心与服务注册发现落地,统一管理客户、商机、营销、出单、报表等服务的环境配置、动态开关、限流规则和服务实例。通过 namespace、group、dataId 分层,配置灰度、动态刷新、敏感配置隔离、服务健康检查、权重路由和注册发现治理,降低多环境配置混乱和服务调用不可控风险。 这段经历的关键是把 Nacos 放在“微服务治理基础设施”的位置上讲,而不是只说“用 Nacos 存配置”。面试官更关心配置怎么分层、动态刷新怎么保证安全、注册发现怎么处理实例上下线和故障隔离。 2. 业务背景 随着系统从单体拆成客户中心、商机中心、营销活动、销售工作台、出单系统、报表系统,配置数量会快速膨胀。数据库地址、Redis 地址、MQ Topic、线程池参数、限流规则、活动开关、灰度开关、第三方接口地址都散落在各个服务和环境中。 如果仍然靠本地 application.yml 管理,会出现几个问题:测试、预发、生产配置不一致;紧急开关需要重新发版;限流阈值不能活动期间动态调整;实例扩缩容后调用方感知慢;下线实例仍被请求打到。 Nacos 在项目里承担两件事:配置中心负责统一配置和动态刷新,注册中心负责服务实例注册、发现和健康检查。它让微服务从“写死地址和配置”变成“按环境、服务和规则动态治理”。 3. 核心原理 作为配置中心,Nacos 通过 namespace、group、dataId 定位一份配置。客户端启动时拉取配置,并与服务端保持长轮询,配置变更后客户端收到通知并刷新本地配置。 作为注册中心,服务启动时把自己的 IP、端口、服务名、集群、元数据注册到 Nacos。调用方通过服务名获取实例列表,结合负载均衡选择实例。临时实例通过心跳维持,心跳异常会被标记不健康或剔除。 常见分层方式: namespace 区分环境,如 dev、test、pre、prod。 group 区分业务域或应用组,如 B2B、MARKETING、POLICY。 dataId 区分服务和配置类型,如 opportunity-service.yml、sentinel-flow-rules.json。 配置中心要关注一致性和安全性,注册中心要关注可用性和健康状态。两者都不能随意修改生产配置,因为一次错误配置可能比一次代码 bug 影响更大。 4. 项目落地 配置中心落地时,可以把配置分为四类: 第一类是基础连接配置,如数据库、Redis、MQ、ES。这类配置通常不频繁变更,生产环境要严格权限控制,敏感值最好接入密钥系统或加密。 第二类是业务开关,如活动是否开启、某渠道是否准入、出单回写是否走新链路。这类配置需要动态刷新,但必须有默认值和回滚方案。 第三类是治理规则,如 Sentinel 限流规则、线程池参数、降级开关。这类配置活动期间可能频繁调整,需要审计和监控。 第四类是灰度配置,如指定渠道、销售团队、客户等级使用新策略。这类配置要支持按条件判断,避免全量误放。 服务注册落地时,需要关注实例元数据。比如同一个服务有 zone、version、gray、weight 等信息,调用方可以按元数据做灰度路由或同机房优先。服务下线时要优雅停机,先从注册中心摘除或标记不健康,再等待流量排空,最后关闭进程。 5. 关键配置或伪代码 Spring Cloud Alibaba 配置示例: spring: application: name: opportunity-service cloud: nacos: server-addr: nacos-prod:8848 discovery: namespace: prod group: B2B cluster-name: shanghai-a metadata: version: v1 gray: "false" config: namespace: prod group: B2B file-extension: yaml shared-configs: - data-id: common-db.yaml group: COMMON refresh: false - data-id: sentinel-flow-rules.json group: GOVERNANCE refresh: true 动态配置类: ...