跳到主要内容

Nacos 教程

欢迎学习 Nacos!本教程将带你从零基础开始,全面掌握 Nacos 服务发现与配置管理的核心知识和实战技能。

什么是 Nacos?

Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的动态服务发现、配置管理和服务管理平台。它致力于帮助你发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助你快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 名称由来

Nacos 是 "Dynamic Naming and Configuration Service" 的首字母缩写,发音为 /nɑ:kəʊs/。从名称可以看出,Nacos 的核心能力就是命名服务(Naming Service)和配置服务(Configuration Service)。

核心定位

在微服务架构中,Nacos 扮演着"服务注册中心"和"配置中心"的双重角色:

┌─────────────────────────────────────────────────────────────────┐
│ Nacos 核心能力 │
│ │
│ ┌────────────────────────┐ ┌────────────────────────┐ │
│ │ 服务发现 │ │ 配置管理 │ │
│ │ • 服务注册 │ │ • 动态配置 │ │
│ │ • 服务发现 │ │ • 配置热更新 │ │
│ │ • 健康检查 │ │ • 配置版本管理 │ │
│ │ • 负载均衡 │ │ • 灰度发布 │ │
│ └────────────────────────┘ └────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ 服务治理与元数据管理 │ │
│ │ • 服务描述 • 生命周期管理 • 健康状态 • 流量管理 │ │
│ └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

Nacos 核心特性

1. 服务发现与健康检查

Nacos 支持 DNS 和 RPC 两种模式的服务发现。服务提供者注册服务后,消费者可以通过 DNS 或 HTTP 接口发现服务。

健康检查机制是 Nacos 保证服务可用性的关键:

  • 临时实例:客户端主动向 Nacos Server 发送心跳,默认每 5 秒一次。如果超过 15 秒没有收到心跳,实例会被标记为不健康;超过 30 秒则会被剔除。
  • 持久实例:由 Nacos Server 主动探测,支持 TCP、HTTP、MySQL 等多种探测方式。

2. 动态配置管理

动态配置服务让你可以在所有环境中以集中化、外部化和动态化的方式管理所有应用的配置。配置更新后无需重新部署应用,Nacos 会实时推送最新配置到客户端。

配置管理的核心能力包括:

  • 配置版本追踪:记录每次配置变更
  • 灰度发布:支持配置的灰度推送
  • 配置回滚:一键回滚到历史版本
  • 客户端状态追踪:监控配置推送状态

3. 动态 DNS 服务

动态 DNS 服务支持权重路由,让你更容易实现中间层负载均衡、灵活的路由策略、流量控制和简单的 DNS 解析服务。

4. 服务治理与元数据管理

Nacos 允许你从微服务平台构建者的角度管理所有服务和元数据,包括服务描述、生命周期、服务静态依赖分析、服务健康状态、服务流量管理、路由和安全规则、服务 SLA 等。

为什么选择 Nacos?

与其他方案的对比

Nacos vs Eureka

特性NacosEureka
配置中心支持不支持,需要 Spring Cloud Config
健康检查TCP/HTTP/MySQL/自定义仅心跳
负载均衡权重配置Ribbon 支持
服务发现DNS + RPC仅 RPC
跨注册中心同步支持不支持
维护状态活跃已停止维护(2.x)

Nacos vs Consul

特性NacosConsul
配置管理支持支持(KV 存储)
服务发现支持支持
一致性协议Raft(持久实例)/ Distro(临时实例)Raft
多语言支持Java/Go/Python/Node.js/C#多语言 SDK
控制台功能丰富基础功能

Nacos vs Apollo

特性NacosApollo
服务发现支持不支持
配置管理支持支持(功能更丰富)
配置格式Properties/YAML/JSON/TextProperties/YAML/JSON/Text/XML
灰度发布支持支持(更完善)
权限管理基础支持完善

Nacos 的优势

  1. 一站式解决方案:同时提供服务发现和配置管理,无需引入多个组件
  2. 简单易用:开箱即用,提供直观的控制台界面
  3. 高性能:支持十万级服务实例,百万级配置
  4. 生态完善:与 Spring Cloud、Dubbo、Kubernetes 等无缝集成
  5. 生产验证:阿里巴巴大规模生产环境验证

Nacos 应用场景

1. 微服务注册与发现

这是 Nacos 最核心的应用场景。在微服务架构中,服务实例动态变化,需要一个可靠的注册中心来管理服务地址。

┌──────────────┐     注册      ┌──────────────┐
│ 服务提供者 │ ───────────> │ │
│ Provider │ │ Nacos │
└──────────────┘ │ Server │
│ │
┌──────────────┐ 发现 │ │
│ 服务消费者 │ <─────────── │ │
│ Consumer │ └──────────────┘
└──────────────┘

2. 动态配置中心

将应用配置从代码中分离出来,集中管理,支持动态更新:

  • 数据库连接信息
  • 功能开关配置
  • 限流阈值配置
  • 业务规则参数

3. 多环境配置隔离

通过命名空间(Namespace)实现不同环境的配置隔离:

  • 开发环境(dev)
  • 测试环境(test)
  • 预发布环境(staging)
  • 生产环境(prod)

4. 服务流量管理

通过权重配置实现灰度发布和流量控制:

  • 新版本灰度发布
  • 故障实例流量摘除
  • 按权重分配流量

Nacos 核心概念

命名空间(Namespace)

命名空间用于实现多环境、多租户的配置隔离。不同命名空间中可以存在相同 Group 或 Data ID 的配置。最常见的使用场景是区分不同环境的配置,如开发环境、测试环境和生产环境。

分组(Group)

分组是 Nacos 中组织配置的维度之一。通过有意义的字符串(如 BuyTrade)对配置进行分组,用于区分相同 Data ID 的不同配置。默认分组为 DEFAULT_GROUP

配置集(Configuration Set)

一组相关或不相关配置项的集合。在系统中,一个配置文件通常就是一个配置集,包含了系统的所有配置,如数据源、线程池、日志级别等配置项。

Data ID

配置集在 Nacos 中的唯一标识。Data ID 通常采用类似 Java 包名的命名规则(如 com.example.app.properties)来确保全局唯一性。

在 Spring Cloud 中,Data ID 的格式为:

${prefix}-${spring.profiles.active}.${file-extension}

其中 prefix 默认为 spring.application.namefile-extension 支持 propertiesyaml

服务(Service)

服务是通过网络向客户端提供预定义接口的软件功能。一个服务可以有多个实例。

实例(Instance)

实例是提供服务的进程,具有可访问的网络地址(IP:Port)。

健康检查(Health Check)

以指定方式检查服务下实例的健康状态,确保实例能正常工作。根据检查结果判断实例是否健康,不健康的实例在服务发现时不会被返回。

保护阈值(Protect Threshold)

保护阈值是一个 0 到 1 之间的浮点数。当健康实例占总实例的比例小于此值时,无论实例是否健康都会返回给客户端,防止因部分实例不健康导致流量全部涌向健康实例,引发雪崩效应。

Nacos 架构

逻辑架构

┌─────────────────────────────────────────────────────────────────┐
│ 服务提供者 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 服务 A │ │ 服务 B │ │ 服务 C │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ │ │
│ 注册/心跳 │ 注册/心跳 │ 注册/心跳
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ Nacos Server │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 核心模块 │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ 服务管理 │ │ 配置管理 │ │ 元数据管理 │ │ │
│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 一致性协议 │ │
│ │ Raft(持久实例) / Distro(临时实例) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 存储层 │ │
│ │ 内置存储 / MySQL / PostgreSQL │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ │ │
│ 发现/订阅 │ 获取配置 │ 订阅配置
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ 服务消费者 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 应用 A │ │ 应用 B │ │ 应用 C │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘

数据模型

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

Namespace(命名空间) + Group(分组) + Data ID(配置集ID)

这种设计类似于 Maven 的 GAV 坐标,用于精确定位一个配置或服务。

端口说明

Nacos 默认使用以下端口:

端口用途
8848主端口,客户端、控制台、OpenAPI 使用
9848gRPC 客户端请求端口(8848 + 1000)
9849gRPC 服务端请求端口(8848 + 1001)
7848Raft 协议端口(8848 - 100)

教程目录

本教程涵盖从入门到进阶的完整内容:

基础入门

服务发现

配置管理

集群部署

速查表

  • 速查表 - Nacos 常用配置和命令速查

学习建议

1. 前置知识

学习 Nacos 前建议掌握:

  • Java 基础:面向对象、集合、注解
  • Spring Boot:自动配置、配置文件、起步依赖
  • 微服务概念:了解微服务架构的基本概念
  • 分布式基础:CAP 理论、一致性协议

2. 学习路径

基础阶段          核心阶段          进阶阶段          实战阶段
│ │ │ │
▼ ▼ ▼ ▼
环境搭建 → 服务注册发现 → 集群部署 → 项目实战
配置管理 → 配置热更新 → 安全配置 → 性能调优
控制台操作 → 健康检查 → 多环境管理 → 运维监控

3. 实践建议

  • 动手实践:本地搭建 Nacos 环境,亲自操作每个功能
  • 阅读源码:理解 Nacos 的设计思想和实现原理
  • 结合框架:与 Spring Cloud Alibaba 结合学习
  • 关注版本:Nacos 迭代较快,注意版本兼容性

参考资源

官方资源

相关项目

准备好了吗?

准备好开始学习 Nacos 了吗?本教程将带你深入了解服务发现与配置管理的核心概念和实践技巧。点击下一章开始你的 Nacos 学习之旅!