第 2 章 · Nacos 注册发现与配置中心
本章目标:在 svc-spring-demo 中集成 Nacos 实现服务注册与发现;将 application.yml 配置迁移至 Nacos Config 并支持动态刷新;理解命名空间、分组、Data ID 规则;掌握健康检查与多实例负载雏形;使用虚构域名 nacos.example.com(本地 127.0.0.1:8848)与 api.example.com 网关前置关系。
学时建议:5~6 小时(含 2 小时 Docker 启动 Nacos 与三服务联调)
前置:spring-cloud-web ch01;spring-boot-web ch01~ch12;本机可运行 Docker 或下载 Nacos Server 压缩包。
2.1 Nacos 在架构中的位置
┌──────────────┐ 注册/心跳 ┌─────────────────────┐
│ user-svc │──────────────────►│ nacos.example.com │
│ product-svc │──────────────────►│ :8848 │
│ order-svc │──────────────────►│ 注册中心 + 配置中心 │
└──────────────┘ └─────────────────────┘
▲ │
│ 订阅配置 / 拉取服务列表 │
└──────────────────────────────────────┘
| 能力 | 作用 | svc-spring-demo 中的例子 |
|---|---|---|
| 服务发现 | 实例注册、健康剔除、供 LoadBalancer 选实例 | product-svc 两个实例 8082/8092 |
| 配置管理 | 集中 YAML、按环境隔离、动态刷新 | product-svc-dev.yaml |
| 元数据 | 版本、权重、自定义 label | 灰度发布(概念) |
教学环境统一使用nacos.example.com作文档占位;hosts 或/etc/hosts可指向127.0.0.1。严禁写入真实生产 Nacos 地址或密钥。
2.2 安装与启动 Nacos Server
2.2.1 Docker Compose(推荐)
在 svc-spring-demo/docs/docker-compose.dev.yml:
services:
nacos:
image: nacos/nacos-server:v2.3.2
container_name: nacos-standalone
environment:
MODE: standalone
NACOS_AUTH_ENABLE: "true"
NACOS_AUTH_TOKEN: "SecretKeyForTeachingOnlyReplaceInProd123456789012345678901234567890"
NACOS_AUTH_IDENTITY_KEY: serverIdentity
NACOS_AUTH_IDENTITY_VALUE: security
ports:
- "8848:8848"
- "9848:9848"
volumes:
- nacos_data:/home/nacos/data
volumes:
nacos_data:
cd svc-spring-demo/docs
docker compose -f docker-compose.dev.yml up -d
# 控制台:http://127.0.0.1:8848/nacos 默认用户 nacos / nacos(仅本地)
2.2.2 控制台初识
| 菜单 | 用途 |
|---|---|
| 服务管理 → 服务列表 | 查看 user-svc、product-svc 实例 IP:端口 |
| 配置管理 → 配置列表 | 编辑各服务 Data ID |
| 命名空间 | 隔离 dev / test / prod |
| 集群管理 | 多节点部署(生产);本章 standalone 即可 |
2.3 服务注册发现:依赖与配置
2.3.1 Maven 依赖(以 svc-product 为例)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.3.2 application.yml(本地引导)
spring:
application:
name: product-svc
cloud:
nacos:
discovery:
server-addr: ${NACOS_ADDR:127.0.0.1:8848}
namespace: ${NACOS_NAMESPACE:dev}
group: SVC_SPRING_DEMO
username: ${NACOS_USER:nacos}
password: ${NACOS_PASSWORD:nacos}
metadata:
version: "1.0.0"
region: "local"
server:
port: ${SERVER_PORT:8082}
management:
endpoints:
web:
exposure:
include: health,info
endpoint:
health:
show-details: when_authorized
spring.application.name 即 Nacos 上的服务名,Gateway 与 Feign 通过此名称发现实例(ch03/ch04)。
2.3.3 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ProductSvcApplication {
public static void main(String[] args) {
SpringApplication.run(ProductSvcApplication.class, args);
}
}
Spring Cloud 2023 中 @EnableDiscoveryClient 有时可省略(自动装配),显式标注便于教学阅读。
2.4 验证注册:多实例与元数据
启动两个 product-svc 实例:
# 终端 1
SERVER_PORT=8082 ./mvnw -pl svc-product spring-boot:run
# 终端 2
SERVER_PORT=8092 ./mvnw -pl svc-product spring-boot:run
在 Nacos 控制台应看到 product-svc 下 2 个健康实例。临时下线:停止其中一个进程,约 15~30 秒后实例标记不健康。
| 概念 | 说明 |
|---|---|
| 心跳 | 客户端定期上报;超时剔除 |
| 临时实例 | 进程挂掉自动注销(默认) |
| 权重 | 负载比例,默认 1 |
| 保护阈值 | 防止雪崩时误删全部实例 |
2.5 配置中心:Nacos Config
2.5.1 依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
Spring Cloud 2023 仍常用 bootstrap.yml(或 spring.config.import 方式,二选一,本课程用 bootstrap 保持清晰)。
2.5.2 bootstrap.yml
spring:
application:
name: product-svc
cloud:
nacos:
config:
server-addr: ${NACOS_ADDR:127.0.0.1:8848}
namespace: ${NACOS_NAMESPACE:dev}
group: SVC_SPRING_DEMO
file-extension: yaml
username: ${NACOS_USER:nacos}
password: ${NACOS_PASSWORD:nacos}