服务发现与配置管理

Dynamic Naming and Configuration Service

构建云原生应用的动态服务发现、配置管理和服务管理平台。


探索 NACOS

概述与定位

Nacos 致力于帮助您发现、配置和管理微服务。提供一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

核心特性

  • 动态服务发现:支持 DNS-based 和 RPC-based (Dubbo/gRPC) 服务发现。
  • 动态配置管理:以中心化、外部化和动态化的方式管理所有环境的应用配置。
  • 动态 DNS 服务:支持权重路由,更容易地实现中间层负载均衡。
  • 服务及元数据管理:管理 Micro Service、Kubernetes Service 等元数据。
图:Nacos 在微服务体系中的核心位置
NACOS Kubernetes Spring Cloud Dubbo

核心功能详解

服务注册与发现

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用原生 SDK、OpenAPI 或独立 Agent 注册 Service 后,服务消费者可以使用 DNS 或 HTTP API 查找和发现服务。

  • Provider: 启动时向 Nacos 注册自身信息(IP, Port)。
  • Consumer: 定时拉取或订阅服务列表缓存到本地。
  • Nacos Server: 维护服务实例列表,支持集群高可用。
图:服务注册与发现流程
Nacos Server Provider Consumer Register Subscribe/Pull Invoke (Direct)

动态配置管理

动态配置服务让您以中心化、脚本化的方式管理当前所有环境的应用配置和服务配置。

  • 实时推送: 配置修改后,毫秒级推送到客户端。
  • 版本管理: 支持配置回滚,历史版本追踪。
  • 环境隔离: Namespace (租户) > Group (业务) > DataId (配置集) 三级模型。
图:配置管理数据流
Console Config Center App A App B App C Publish Push/Long Poll

服务健康监测

Nacos 提供对服务的实时健康检查,阻止向不健康的主机或服务实例发送请求。

  • 临时实例: 采用 Client 主动上报心跳(Heartbeat)模式,超过 15s 未上报标记不健康,30s 剔除。
  • 持久实例: Nacos Server 主动探测(TCP/HTTP),数据持久化存储。
  • 保护阈值: 防止雪崩,保留一定比例实例即使不健康。
图:健康检查机制
Nacos Healthy Heartbeat (5s) Unhealthy Timed Out (>15s) Starting...

架构与组件

图:Nacos 整体架构
OpenAPI / Console / SDK (Java, Go, C++, ...) Naming Service Registry Health Check Config Config Mgmt Pub/Sub Core Consistency Distro/Raft Data Storage (Plug-in) MySQL Embedded Derby

逻辑架构

  • Naming Service: 处理服务的注册与发现,支持 AP (Distro协议) 和 CP (Raft协议) 模式。
  • Config Service: 处理配置的 CRUD、版本管理、监听推送。
  • Consistency Protocol: 使用 Raft 协议保证集群数据一致性(CP),使用 Distro 协议保证非持久化服务数据的高可用(AP)。
  • Storage: 配置数据默认存储在内置 Derby 数据库,生产环境推荐 MySQL。

部署与使用

Nacos 支持单机模式(Standalone)用于测试开发,以及集群模式(Cluster)用于生产环境。

部署模式

  • 单机模式: `sh startup.sh -m standalone`,使用内置 Derby 数据库。
  • 集群模式: 需配置 `cluster.conf` 指向所有节点 IP,并配置外置 MySQL 数据库以实现数据共享。建议至少 3 节点以满足 Raft 选举要求。

集成生态

无缝集成 Spring Cloud Alibaba, Dubbo, Kubernetes, Istio 等主流云原生框架。

bash
# 1. 下载 Nacos wget https://github.com/alibaba/nacos/releases/download/2.x.x/nacos-server.tar.gz # 2. 解压 tar -xvf nacos-server.tar.gz cd nacos/bin # 3. 启动 (Linux/Unix/Mac) sh startup.sh -m standalone # 4. 访问控制台 http://localhost:8848/nacos # 默认账号密码: nacos/nacos

优势对比

Nacos

  • 功能: 注册中心 + 配置中心
  • CAP: 支持 AP 和 CP 切换
  • 协议: HTTP/2, gRPC, UDP
  • 生态: 阿里系,Spring Cloud 深度集成
  • 上手: 极其简单,中文文档完善

Eureka

  • 功能: 仅注册中心
  • CAP: 仅 AP
  • 状态: 停止维护 (2.x)

Consul

  • 功能: 注册 + 配置 (KV)
  • CAP: CP (强一致性)
  • 运维: 较复杂,多数据中心支持

实践示例

Spring Cloud 应用接入 Nacos Config 示例

pom.xml
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
bootstrap.yml
spring: application: name: nacos-config-example cloud: nacos: server-addr: 127.0.0.1:8848 config: file-extension: yaml
// Java Code Example
@RestController
@RefreshScope  // 支持动态刷新
public class ConfigController {
    
    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @GetMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
}
            

最佳实践建议

生产环境配置

  • 集群部署:至少 3 节点,保证高可用性和选举机制正常运行。
  • 数据库选型:生产环境必须使用外置 MySQL(8.0+),避免使用内嵌 Derby。
  • JVM 参数优化:根据实例规模调整堆内存,建议 -Xms4g -Xmx4g -XX:MetaspaceSize=128m。
  • 网络规划:Nacos 集群节点间网络延迟应低于 10ms。

配置管理规范

  • 命名空间隔离:按环境(dev/test/prod)划分 Namespace,避免配置污染。
  • 配置分组:使用 Group 区分不同业务线或团队。
  • 版本控制:配置变更前务必做好备份,利用 Nacos 历史版本功能快速回滚。
  • 敏感信息加密:数据库密码、密钥等敏感配置使用加密插件或外部密钥管理系统。

监控与运维

  • 接入监控系统:通过 Prometheus + Grafana 监控 Nacos 关键指标(QPS、RT、连接数)。
  • 日志管理:配置日志轮转策略,定期清理过期日志文件。
  • 容量规划:根据服务实例数和配置数量预估资源需求,单节点建议不超过 5000 服务实例。
  • 灰度发布:配置变更时使用标签路由或分批推送,降低故障影响面。

常见问题 FAQ

Q1: Nacos 如何选择 AP 模式还是 CP 模式?

A: 临时实例(Ephemeral)默认使用 AP 模式(Distro 协议),适合服务快速上下线场景;持久实例(Persistent)使用 CP 模式(Raft 协议),保证数据强一致性。可通过 `spring.cloud.nacos.discovery.ephemeral=false` 切换为持久实例。

Q2: 配置更新后客户端没有及时刷新怎么办?

A: 检查以下几点:
1. 确认类或方法上是否添加了 `@RefreshScope` 注解;
2. 检查 Nacos 控制台配置是否正确发布;
3. 查看客户端日志是否有监听器异常;
4. 验证 `namespace`、`group`、`dataId` 是否匹配。

Q3: Nacos 集群节点之间无法通信?

A: 常见原因:
1. `cluster.conf` 配置错误,确保填写的是节点内网 IP 而非 127.0.0.1;
2. 防火墙或安全组未开放 8848(HTTP)、9848(gRPC)、9849(Raft)端口;
3. 网络分区或跨机房部署导致延迟过高。

Q4: 如何实现多数据中心(异地多活)部署?

A: Nacos 本身不直接支持跨机房数据同步,推荐方案:
1. 每个数据中心独立部署 Nacos 集群;
2. 使用 Namespace 或数据库复制实现配置数据同步;
3. 结合服务网格(如 Istio)实现跨区域服务发现。

Q5: Nacos 2.x 与 1.x 有哪些不兼容变化?

A: 主要变化包括:
1. 通信协议从 HTTP 升级为 gRPC,性能提升 10 倍;
2. 新增 9848/9849 端口用于 gRPC 和 Raft 通信;
3. 客户端需升级到对应版本(如 spring-cloud-alibaba 2021.x+);
4. 数据库表结构有调整,升级前需执行官方升级脚本。