[特殊字符] 基于Docker部署Nacos注册中心及微服务注册发现详解(含MySQL持久化配置)
📚 目录
-
项目背景与准备
-
Docker部署Nacos并配置MySQL持久化
-
微服务注册到Nacos(item-service示例)
-
微服务服务发现与调用(cart-service示例)
-
小结
1. 项目背景与准备
在微服务架构中,服务注册与发现是基础能力,能帮助我们动态管理服务节点,实现高可用、动态扩展。
Nacos 是阿里巴巴开源的一款集注册中心和配置中心功能于一体的中间件。
为了快速搭建环境,本项目采用 Docker 来部署 Nacos,并通过外部 MySQL 实现数据持久化。
准备工作:
-
已安装 Docker、Docker Compose
-
已部署好 MySQL 容器
-
准备好 nacos 初始化SQL文件(资料中提供)
2. Docker部署Nacos并配置MySQL持久化
2.1 初始化MySQL数据库
首先,需要在 MySQL 中创建 nacos
专用数据库,并导入官方提供的SQL脚本,初始化表结构。
操作示例(进入MySQL容器或主机执行):
mysql -u root -p
CREATE DATABASE nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE nacos;
SOURCE /path/to/nacos-mysql.sql;
✅ 成功后,nacos数据库中将包含多个用于注册和配置管理的表。
2.2 配置custom.env环境变量
为了让 Nacos 连接到我们的 MySQL,需要准备好 custom.env
文件,内容如下:
# 启动模式
MODE=standalone# 优先使用hostname进行服务注册
PREFER_HOST_MODE=hostname# 数据源配置
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=192.168.100.100
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123456
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
注意事项:
-
MYSQL_SERVICE_HOST
需要填写你的 宿主机IP地址(示例用 192.168.100.100)。 -
保证你的 MySQL 可以被外部容器访问,且 nacos库已初始化完成。
2.3 上传nacos目录至虚拟机
将资料中的 nacos/
文件夹(含 custom.env)上传到你的虚拟机 /root/
目录:
scp -r nacos/ root@192.168.100.100:/root/
2.4 通过Docker运行Nacos
进入 /root
目录,执行Docker命令启动Nacos容器:
docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
nacos/nacos-server:v2.1.0-slim
参数说明:
-
--env-file
:加载环境变量配置文件。 -
-p
:端口映射,8848是控制台端口。 -
--restart=always
:容器异常自动重启。
2.5 验证Nacos部署
浏览器访问:
http://192.168.100.100:8848/nacos/
首次访问会跳转到登录界面:
-
账号:
nacos
-
密码:
nacos
✅ 登录成功后,进入Nacos控制台!
3. 微服务注册到Nacos(item-service示例)
以 item-service
微服务为例,演示如何注册到Nacos。
3.1 引入Nacos Discovery依赖
在 pom.xml
添加依赖:
<!-- Nacos 服务注册与发现 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.2 配置application.yml
spring:application:name: item-servicecloud:nacos:server-addr: 192.168.100.100:8848
server:port: 8081
3.3 启动多个实例模拟负载均衡
分别启动 item-service 的两个实例,可以分别配置端口为 8081 和 8082。
启动后,在 Nacos 控制台可以看到 item-service
服务的两个实例注册成功。
4. 微服务服务发现与调用(cart-service示例)
演示 cart-service 如何通过 Nacos 发现并调用 item-service。
4.1 引入依赖
在 cart-service
的 pom.xml
中添加:
<!-- Nacos 服务注册与发现 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.2 配置application.yml
spring:cloud:nacos:server-addr: 192.168.100.100:8848
server:port: 8085
4.3 使用DiscoveryClient进行服务发现
在 cart-service 中注入 DiscoveryClient
:
@Autowired
private DiscoveryClient discoveryClient;
实现基于服务名的动态调用:
List<ServiceInstance> instances = discoveryClient.getInstances("item-service");
ServiceInstance instance = instances.get(new Random().nextInt(instances.size()));
String url = instance.getUri() + "/items";
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(url, String.class);
✅ 这样每次调用可以随机访问 item-service 的不同实例,实现简单的负载均衡。
4.4 测试服务调用
使用 Postman 或 Swagger 发起请求,可以观察到负载均衡正常生效,分别路由到不同的 item-service 实例。
5. 小结
本文完整介绍了:
-
如何使用 Docker 部署 Nacos 并连接外部 MySQL。
-
如何让微服务注册到 Nacos。
-
如何通过 DiscoveryClient 发现服务并实现简单负载均衡调用。
✅ 通过本教程,可以初步搭建起基于 Nacos 的微服务注册与发现体系!