Nacos简介

大家好,我是joker,希望你快乐。

在微服务架构中,服务实例动态创建、销毁、扩缩容,如何让服务之间相互发现?如何在不重启服务的情况下动态修改配置?Nacos 就是阿里巴巴给出的答案——一个集注册中心与配置中心于一体的微服务基础设施。

Nacos是什么

Nacos 是 Dynamic Naming and Configuration Service 的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

用一句话概括:Nacos = 注册中心 + 配置中心

Nacos 支持几乎所有主流类型的"服务"的发现、配置和管理:

  • Kubernetes Service
  • gRPC & Dubbo RPC Service
  • Spring Cloud RESTful Service

核心功能

服务注册与发现

微服务架构下,服务实例的地址是动态变化的,硬编码 IP 地址显然行不通。Nacos 提供了一个"电话簿"的角色:

  1. 服务注册:服务启动时主动向 Nacos 上报自己的信息(服务名、IP、端口、元数据等)
  2. 健康检查:Nacos 通过心跳机制持续监控实例健康状态,不健康的实例会被剔除
  3. 服务发现:消费者向 Nacos 查询可用服务列表,结合负载均衡策略选择实例调用

Nacos 1.x 中临时实例通过客户端心跳保活,默认每 5 秒发送一次心跳,超过 15 秒标记为不健康,超过 30 秒剔除。Nacos 2.x 中升级为 gRPC 长连接,服务端可以更快感知实例上下线。

动态配置服务

传统方式修改配置需要重启应用,Nacos 提供了中心化、外部化、动态化的配置管理:

  • 配置变更后实时推送到客户端,无需重启
  • 支持配置版本跟踪、灰度发布、一键回滚
  • 提供简洁的 Web 控制台管理所有配置

Nacos 2.x 基于 gRPC 长连接推送配置变更,相比 1.x 的长轮询机制,延迟更低,P99 < 300ms。

动态DNS服务

Nacos 支持基于 DNS 协议的服务发现,提供权重路由能力,方便实现中间层负载均衡和灵活的路由策略。

核心概念

Nacos 数据模型由三元组唯一确定:

概念 说明 示例
Namespace 命名空间,用于环境隔离 dev、test、prod
Group 分组,用于逻辑隔离 DEFAULT_GROUP、TRADE_GROUP
Data ID 配置文件名 / 服务名 application-dev.yml、user-service

对于配置管理,定位一份配置需要 Namespace + Group + Data ID 三个维度。

对于服务发现,定位一个服务需要 Namespace + Group + Service Name 三个维度。

临时实例与持久实例

类型 注册方式 健康检查 数据存储
临时实例(ephemeral) 客户端主动注册 客户端心跳 / gRPC 连接 仅内存
持久实例(persistent) 服务端注册或 API 注册 服务端主动探测 持久化存储

大多数微服务场景使用临时实例,数据库、缓存等基础设施适合使用持久实例。

Nacos架构

整体架构

image-2026-05-09-14-16-56

一致性协议

Nacos 区分临时实例和持久实例,分别采用不同的一致性协议:

  • Distro 协议:临时实例使用,AP 模式,保证高可用,各节点对等,异步复制
  • Raft 协议:持久实例使用,CP 模式,保证强一致性,通过选举 Leader 写入

Nacos 1.x vs 2.x

维度 1.x 2.x
通信方式 HTTP 短连接 + 心跳 gRPC 长连接 + 双向流
配置推送 长轮询 gRPC 主动推送
服务感知 心跳超时感知(秒级) 连接断开感知(毫秒级)
资源消耗 连接数多,CPU 开销大 连接复用,资源消耗低
端口 8848 8848(HTTP)+ 9848(gRPC)

Nacos 2.x 端口说明

Nacos 2.x 引入 gRPC 通信后,除了主端口外还新增了三个端口,均基于主端口自动偏移计算:

端口 计算规则 协议 用途
8848 主端口(默认) HTTP 控制台、OpenAPI、客户端 HTTP 通信
9848 主端口 +1000 gRPC 客户端向服务端发起连接和请求
9849 主端口 +1001 gRPC 服务端之间同步数据(集群内部通信)
7848 主端口 -1000 JRaft 服务端之间 Raft 选举和一致性请求

部署时需要注意:

  • 单机模式:开放 8848 和 9848 即可
  • 集群模式:四个端口都需要开放,其中 9849 和 7848 仅用于服务端内部通信,不要暴露到外部网络
  • 修改主端口后,其他端口会自动按偏移量计算,主端口值必须大于 1000
  • 使用 Nginx 反向代理时,9848 端口需要配置 TCP 转发(不是 HTTP 转发),否则 gRPC 连接会被断开

Spring Cloud Alibaba集成实战

服务注册与发现

  1. 引入依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 配置文件 application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: dev
  1. 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}
  1. 使用 OpenFeign 调用服务
@FeignClient(name = "user-service")
public interface UserFeignClient {
    @GetMapping("/api/user/{userId}")
    String getUserInfo(@PathVariable("userId") Long userId);
}

通过 @FeignClient(name = "user-service") 直接使用服务名调用,Nacos 负责服务发现,无需硬编码 IP 地址。

配置中心

  1. 引入依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 配置文件 bootstrap.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        namespace: dev
        group: DEFAULT_GROUP
  1. 动态刷新配置
@RestController
@RefreshScope
public class OrderController {

    @Value("${order.max-amount:1000}")
    private Integer maxAmount;

    @GetMapping("/max-amount")
    public Integer getMaxAmount() {
        return maxAmount;
    }
}

在 Nacos 控制台修改 order.max-amount 的值,客户端会实时收到推送并刷新,无需重启服务。

Nacos与其他组件对比

功能 Nacos Eureka Consul Apollo
服务注册发现 支持 支持 支持 不支持
配置管理 支持 不支持
动态推送 gRPC 推送 不支持 不支持 支持
多环境隔离 Namespace 不支持 不支持 Namespace
持久化存储 支持 内存 支持 支持
健康检查 支持 支持 支持 不支持
CAP 模型 AP / CP AP CP -
集群模式 支持 2.x 才有 支持 支持

Nacos 的核心优势在于注册中心 + 配置中心一体化,不需要分别部署 Eureka 和 Apollo,降低了运维复杂度。

Nacos安装与启动

# 下载
wget https://github.com/alibaba/nacos/releases/download/2.3.2/nacos-server-2.3.2.tar.gz

# 解压
tar -zxvf nacos-server-2.3.2.tar.gz -C /usr/local/

# 单机模式启动
sh /usr/local/nacos/bin/startup.sh -m standalone

# Windows
cmd /usr/local/nacos/bin/startup.cmd -m standalone

启动后访问 http://localhost:8848/nacos ,默认用户名密码:nacos / nacos

生产环境建议配置 MySQL 持久化,修改 conf/application.properties

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

集群部署时,在 conf/cluster.conf 中配置所有节点:

192.168.1.101:8848
192.168.1.102:8848
192.168.1.103:8848

参考文档

Nacos 官方文档

Nacos GitHub

Spring Cloud Alibaba 官方文档

posted @ 2026-05-11 08:24  Crazy_Joker  阅读(21)  评论(0)    收藏  举报