Nacos 的微服务注册中心实现详解
上一节课关于docker部署的知识点的讲解:Docker的部署使用详解
在微服务架构中,服务数量多、实例动态变化,如果仍然写死IP和地址进行调用,系统会非常脆弱。
注册中心就是为了解决这个问题而存在的基础设施。
📚 目录(点击跳转对应章节)
一、注册中心核心原理
二、常见注册中心对比
三、Docker 部署 Nacos
四、准备 MySQL 数据库
五、准备 Nacos 环境变量文件
六、启动 Nacos 容器
七、访问 Nacos 控制台
八、服务注册实战(item-service)
九、服务发现实战(cart-service)
十、使用 DiscoveryClient 做服务发现
十一、负载均衡策略说明
十二、完整调用链总结
十三、核心理解总结
一、注册中心核心原理
在微服务远程调用中,有两个基本角色:
- 服务提供者:提供接口,例如
item-service - 服务消费者:调用接口,例如
cart-service
当服务变多后,会出现几个问题:
- 服务地址经常变化
- 实例会扩容或宕机
- 调用方难以维护地址列表
因此引入第三个角色:
注册中心
其作用是存储、管理服务实例信息,并实现服务实例的动态发现。
注册中心三方结构
系统中包含三方:
- 服务提供者
- 服务消费者
- 注册中心
服务注册流程
服务启动时会自动向注册中心注册:
- 服务名称
- IP 地址
- 端口号
注册中心保存这些实例信息。
服务发现流程
服务消费者调用流程:
- 向注册中心订阅服务列表
- 获取实例列表
- 本地负载均衡选择实例
- 发起远程调用
健康检查机制
注册中心通过心跳机制维护实例健康:
- 服务定期发送心跳
心跳机制:服务实例定期发送
心跳包(心跳包是一个空的 HTTP 请求,默认5秒发送一次)到注册中心,证明自己正常运行。
- 注册中心超时未收到 → 判定宕机
- 自动剔除实例
- 新实例启动 → 自动注册
- 实例变化 → 推送更新
对于注册中心的简单理解
注册中心 = 动态地址簿 + 健康管理器 + 实例调度中心
动态地址簿:注册中心维护服务实例的地址列表,服务消费者可以从注册中心获取最新的实例地址。
健康管理器:注册中心通过心跳机制监控服务实例的健康状态,及时发现并剔除不健康的实例。
实例调度中心:注册中心根据负载均衡策略,为服务消费者分配可用的服务实例。
注意:
注册中心只提供列表,不做负载均衡
二、常见注册中心对比
| 注册中心 | 出品公司 | 特点 |
|---|---|---|
| Eureka | Netflix | SpringCloud 原生 |
| Nacos | 阿里 | 注册 + 配置中心 |
| Consul | HashiCorp | 多语言支持 |
一般情况下为什么选 Nacos?
原因如下:
- 免费开源
- 中文资料多
- SpringCloud Alibaba 官方支持
- 同时支持配置中心
- 国内使用广泛
三、Docker 部署 Nacos
为了保证环境干净、部署简单、可重复搭建,我们这里采用 Docker 容器方式部署 Nacos 注册中心。相比直接安装方式,Docker 方式具有明显优势:
环境隔离,不污染系统
部署速度快
配置简单
可快速销毁重建
便于团队统一环境
更贴近生产部署方式
3.1 部署结构说明
本次部署包含两个核心容器:
MySQL 容器
用于存储:
- 服务注册信息
- 配置数据
- 命名空间数据
- 集群元数据
Nacos 容器
负责:
- 服务注册
- 服务发现
- 心跳检测
- 实例健康管理
- 服务列表推送
3.2 前置环境要求
在开始之前,请确保环境满足:
必备软件
Docker >= 20.x Docker Compose(可选) MySQL 容器已运行端口占用检查
确保以下端口未被占用:
8848 → Nacos 控制台 9848 → 集群通信端口 9849 → Raft 通信端口检查命令:
netstat-tunlp|grep8848四、准备 MySQL 数据库
创建数据库
CREATEDATABASEnacos_config;导入初始化表结构
下载 Nacos 官方 SQL:
conf/nacos-mysql.sql导入到 MySQL 容器:
dockerexec-it mysql容器名bashmysql -uroot -p use nacos_config;source/路径/nacos-mysql.sql;五、准备 Nacos 环境变量文件
新建文件:
custom.env内容如下:
MODE=standalone SPRING_DATASOURCE_PLATFORM=mysql MYSQL_SERVICE_HOST=你的MySQL容器IP MYSQL_SERVICE_PORT=3306 MYSQL_SERVICE_DB_NAME=nacos_config MYSQL_SERVICE_USER=root MYSQL_SERVICE_PASSWORD=你的密码关键点:
MYSQL_SERVICE_HOST 必须写 MySQL 容器IP
六、启动 Nacos 容器
dockerrun -d\--name nacos\--env-file ./custom.env\-p8848:8848\-p9848:9848\-p9849:9849\--restart=always\nacos/nacos-server:v2.1.0-slim七、访问 Nacos 控制台
浏览器访问:
http://服务器IP:8848/nacos默认账号密码:
nacos / nacos注册中心部署完成。
八、服务注册实战(item-service)
目标:把item-service注册到 Nacos。
1. 添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>说明:
- 同时支持注册 + 发现
- 所有微服务都可以使用
2. 配置 Nacos 地址
spring:application:name:item-servicecloud:nacos:server-addr:192.168.150.101:88483. 启动服务
启动后自动注册到 Nacos。
控制台可见:
item-service4. 多实例测试
修改端口再启动一个实例:
server:port:8082控制台可看到:
item-service ├── 实例1 └── 实例2九、服务发现实战(cart-service)
目标:让 cart-service 调用 item-service。
1. 添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>2. 配置地址
spring:cloud:nacos:server-addr:192.168.150.101:8848十、使用 DiscoveryClient 做服务发现
注入组件
@AutowiredprivateDiscoveryClientdiscoveryClient;获取实例列表
List<ServiceInstance>instances=discoveryClient.getInstances("item-service");随机负载均衡
ServiceInstanceinstance=instances.get(newRandom().nextInt(instances.size()));构造调用地址
Stringurl=instance.getUri()+"/item/"+id;Itemitem=restTemplate.getForObject(url,Item.class);十一、负载均衡策略说明
常见负载均衡算法:
- 随机
- 轮询
- IP Hash
- 最少连接
- 权重调度
后续可以升级为:
SpringCloud LoadBalancer OpenFeign自动负载均衡调用。
十二、完整调用链总结
服务提供者
启动 → 注册 → 心跳 → 健康维护
注册中心
存储 → 检测 → 剔除 → 推送更新
服务消费者
订阅 → 获取列表 → 负载均衡 → 调用
十三、核心理解总结
注册中心解决的不是"调用问题",而是:
- 地址解耦
- 实例动态管理
- 容错与高可用
自此,微服务之间不用再记住彼此地址,而是通过
注册中心找到彼此。