# Nacos 服务注册与发现中心 本文档说明 ERP 微服务架构中 Nacos 的配置与使用方法。 ## 📁 目录结构 ``` nacos/ ├── README.md # 本文档 ├── docker-compose.standalone.yml # 单机模式 Docker Compose ├── docker-compose.cluster.yml # 集群模式 Docker Compose (3节点) ├── init/ │ └── mysql-schema.sql # Nacos MySQL 持久化 Schema ├── cluster/ │ └── nginx.conf # Nacos 集群 Nginx 负载均衡配置 ├── examples/ │ ├── nacos-api-usage.md # Nacos REST API 使用示例 │ ├── ServiceRegistrationExample.java # 服务注册示例代码 │ ├── HealthCheckConfig.java # 健康检查配置示例 │ └── client-config/ │ ├── nacos-client.properties # 通用 Nacos 客户端配置 │ ├── bootstrap.yml # Spring Cloud bootstrap 配置模板 │ └── user-service-nacos.yml # user-service 完整配置示例 └── scripts/ └── startup.sh # Nacos 启动脚本 ``` ## 🚀 快速开始 ### 1. 启动 Nacos(单机模式) ```bash cd /root/.openclaw/workspace/erp-java-backend/nacos # 方式一:使用脚本 chmod +x scripts/startup.sh ./scripts/startup.sh --mode standalone # 方式二:直接使用 Docker Compose docker compose -f docker-compose.standalone.yml up -d # 方式三:使用 docker-compose 命令 docker-compose -f docker-compose.standalone.yml up -d ``` ### 2. 访问 Nacos 控制台 - **地址**: http://localhost:8848/nacos - **用户名**: `nacos` - **密码**: `nacos123456` ### 3. 验证服务注册 访问控制台 → **服务管理** → **服务列表**,应能看到已注册的服务。 --- ## 🏗 架构说明 ### 单机模式 (Standalone) ``` ┌─────────────────┐ │ Microservices │ │ (Spring Boot) │ └───────┬─────────┘ │ HTTP/gRPC ▼ ┌─────────────────┐ │ Nacos Server │ ◄── 单节点 │ (v2.2.3) │ └───────┬─────────┘ │ ▼ ┌─────────────────┐ │ MySQL │ ◄── 持久化存储 │ (8.0) │ └─────────────────┘ ``` ### 集群模式 (Cluster) ``` ┌─────────────────┐ │ Nginx (LB) │ │ :8848, :9848 │ └───────┬─────────┘ │ ┌───────────────────────┼───────────────────────┐ ▼ ▼ ▼ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ Nacos Node 1 │ │ Nacos Node 2 │ │ Nacos Node 3 │ │ :8848 │◄────►│ :8848 │◄────►│ :8848 │ │ :9848 │ │ :9848 │ │ :9848 │ │ :9849 │ │ :9849 │ │ :9849 │ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ │ │ │ └───────────────────────┼───────────────────────┘ │ ▼ ┌───────────────┐ │ MySQL │ │ (8.0) │ └───────────────┘ ``` --- ## ⚙️ 配置说明 ### 环境变量 | 变量名 | 说明 | 默认值 | |--------|------|--------| | `NACOS_SERVER_ADDR` | Nacos 服务器地址 | `127.0.0.1:8848` | | `NACOS_NAMESPACE` | 命名空间 ID | `public` | | `NACOS_GROUP` | 分组名称 | `DEFAULT_GROUP` | | `NACOS_USERNAME` | Nacos 用户名 | `nacos` | | `NACOS_PASSWORD` | Nacos 密码 | `nacos123456` | | `SPRING_PROFILES_ACTIVE` | Spring 环境 | `dev` | ### 微服务配置 #### 方式一:修改 application.yml 在各微服务的 `application.yml` 中添加: ```yaml spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: public group: DEFAULT_GROUP prefer-ip-address: true cluster-name: DEFAULT config: server-addr: ${spring.cloud.nacos.discovery.server-addr} file-extension: yaml shared-configs: - data-id: common-config.yaml group: DEFAULT_GROUP refresh: true ``` #### 方式二:使用 bootstrap.yml(推荐) 将 `examples/client-config/bootstrap.yml` 复制到微服务 `src/main/resources/`,并根据需要修改。 #### 方式三:环境变量覆盖 ```bash java -jar app.jar \ -DNACOS_SERVER_ADDR=127.0.0.1:8848 \ -DNACOS_NAMESPACE=public \ -DNACOS_GROUP=DEFAULT_GROUP ``` --- ## 📋 微服务列表与配置 | 服务名 | 端口 | Context Path | 说明 | |--------|------|--------------|------| | `api-gateway` | 8080 | `/` | API网关 | | `user-service` | 8082 | `/user` | 用户服务 | | `tenant-service` | 8083 | `/tenant` | 租户服务 | | `product-service` | 8084 | `/product` | 产品服务 | | `order-service` | 8085 | `/order` | 订单服务 | | `inventory-service` | 8086 | `/inventory` | 库存服务 | | `finance-service` | 8087 | `/finance` | 财务服务 | | `notification-service` | 8088 | `/notification` | 通知服务 | | `file-service` | 8089 | `/file` | 文件服务 | | `admin-service` | 8090 | `/admin` | 管理服务 | --- ## 🏥 健康检查配置 ### 默认健康检查 Nacos 默认通过 **TCP 端口检测** 判断实例健康状态。 ### 自定义健康检查(推荐) 使用 Spring Boot Actuator: ```yaml management: endpoints: web: exposure: include: health,info,metrics endpoint: health: show-details: always health: nacos: enabled: true ``` ### 健康检查流程 ``` 1. 客户端每 5秒 向 Nacos 发送心跳 2. Nacos 15秒 未收到心跳,标记为不健康 3. Nacos 30秒 未收到心跳,删除实例 4. 服务恢复后,自动重新注册 ``` --- ## 🌐 Nacos API 调用 详细 API 调用示例见 [nacos-api-usage.md](examples/nacos-api-usage.md) ### 服务注册 ```bash curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance' \ -d 'serverIp=127.0.0.1' \ -d 'serverPort=8082' \ -d 'serviceName=user-service' ``` ### 服务发现 ```bash curl -s 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=user-service' ``` ### 配置管理 ```bash # 发布配置 curl -X POST 'http://127.0.0.1:8848/nacos/v1/cs/configs' \ -d 'dataId=user-service.yaml' \ -d 'group=DEFAULT_GROUP' \ -d 'content=spring: datasource: url: jdbc:mysql://localhost:3307' # 查询配置 curl -s 'http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=user-service.yaml&group=DEFAULT_GROUP' ``` --- ## 🔐 安全配置 ### 生产环境必改项 1. **修改默认密码** ```yaml NACOS_AUTH_ENABLE: "true" NACOS_AUTH_TOKEN: "YourNewSecretKeyHere..." ``` 2. **启用认证** ```yaml spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=YourNewPassword ``` 3. **网络隔离** - 使用内网 IP,不暴露公网 - 配置防火墙规则 - 使用 VIP/Nginx 做负载均衡 --- ## 🚢 部署到 Kubernetes 集群模式配置见 [docker-compose.cluster.yml](docker-compose.cluster.yml) ### 关键配置 - **3节点部署**: 推荐奇数节点,保证 Raft 共识算法正常 - **MySQL 外部化**: 生产环境使用主从 MySQL - **Nginx 负载均衡**: 统一入口,分发到 3 个 Nacos 节点 - **持久化**: 使用 PVC 挂载日志和数据目录 --- ## ❓ 常见问题 ### 1. 微服务无法注册到 Nacos - 检查 Nacos 是否启动:`curl http://localhost:8848/nacos/v1/console/health/readiness` - 检查网络连通性:`telnet localhost 8848` - 检查防火墙:`firewall-cmd --list-ports` ### 2. 控制台登录失败 - 默认用户名/密码:`nacos` / `nacos123456` - 检查认证是否启用:`NACOS_AUTH_ENABLE=true` ### 3. gRPC 端口无法连接 - Nacos 2.x 使用 9848/9849 端口进行 gRPC 通信 - 确保这些端口已开放 ### 4. 配置不生效 - 检查 `refresh-enabled: true` 是否设置 - 使用 `@RefreshScope` 注解刷新配置 - 检查命名空间和分组是否匹配 --- ## 📚 相关文档 - [Nacos 官方文档](https://nacos.io/zh-cn/docs/what-is-nacos.html) - [Spring Cloud Alibaba Nacos Discovery](https://spring-cloud-alibaba-group.github.io/github-pages/2023.0.1.0/zh-cn/documentation/spring-cloud-alibaba-nacos-discovery.html) - [Spring Cloud Alibaba Nacos Config](https://spring-cloud-alibaba-group.github.io/github-pages/2023.0.1.0/zh-cn/documentation/spring-cloud-alibaba-nacos-config.html)