Nacos 的微服务注册中心实现详解

上一节课关于docker部署的知识点的讲解:Docker的部署使用详解

在微服务架构中,服务数量多、实例动态变化,如果仍然写死IP和地址进行调用,系统会非常脆弱。
注册中心就是为了解决这个问题而存在的基础设施。


📚 目录(点击跳转对应章节)

一、注册中心核心原理
二、常见注册中心对比
三、Docker 部署 Nacos
四、准备 MySQL 数据库
五、准备 Nacos 环境变量文件
六、启动 Nacos 容器
七、访问 Nacos 控制台
八、服务注册实战(item-service)
九、服务发现实战(cart-service)
十、使用 DiscoveryClient 做服务发现
十一、负载均衡策略说明
十二、完整调用链总结
十三、核心理解总结


一、注册中心核心原理

在微服务远程调用中,有两个基本角色:

  • 服务提供者:提供接口,例如 item-service
  • 服务消费者:调用接口,例如 cart-service

当服务变多后,会出现几个问题:

  • 服务地址经常变化
  • 实例会扩容或宕机
  • 调用方难以维护地址列表

因此引入第三个角色:

注册中心
其作用是存储、管理服务实例信息,并实现服务实例的动态发现。


注册中心三方结构

系统中包含三方:

  • 服务提供者
  • 服务消费者
  • 注册中心

服务注册流程

服务启动时会自动向注册中心注册:

  • 服务名称
  • IP 地址
  • 端口号

注册中心保存这些实例信息。


服务发现流程

服务消费者调用流程:

  1. 向注册中心订阅服务列表
  2. 获取实例列表
  3. 本地负载均衡选择实例
  4. 发起远程调用

健康检查机制

注册中心通过心跳机制维护实例健康:

  • 服务定期发送心跳

心跳机制:服务实例定期发送 心跳包 (心跳包是一个空的 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 | grep 8848

四、准备 MySQL 数据库

创建数据库

CREATE DATABASE nacos_config;

导入初始化表结构

下载 Nacos 官方 SQL:

conf/nacos-mysql.sql

导入到 MySQL 容器:

docker exec -it mysql容器名 bash
mysql -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 容器

docker run -d \
--name nacos \
--env-file ./custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849: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-service

  cloud:
    nacos:
      server-addr: 192.168.150.101:8848

3. 启动服务

启动后自动注册到 Nacos。

控制台可见:

item-service

4. 多实例测试

修改端口再启动一个实例:

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 做服务发现


注入组件

@Autowired
private DiscoveryClient discoveryClient;

获取实例列表

List<ServiceInstance> instances =
    discoveryClient.getInstances("item-service");

随机负载均衡

ServiceInstance instance =
    instances.get(new Random().nextInt(instances.size()));

构造调用地址

String url = instance.getUri() + "/item/" + id;
Item item = restTemplate.getForObject(url, Item.class);

十一、负载均衡策略说明

常见负载均衡算法:

  • 随机
  • 轮询
  • IP Hash
  • 最少连接
  • 权重调度

后续可以升级为:

SpringCloud LoadBalancer
OpenFeign

自动负载均衡调用。


十二、完整调用链总结


服务提供者

启动 → 注册 → 心跳 → 健康维护


注册中心

存储 → 检测 → 剔除 → 推送更新


服务消费者

订阅 → 获取列表 → 负载均衡 → 调用


十三、核心理解总结

注册中心解决的不是"调用问题",而是:

  • 地址解耦
  • 实例动态管理
  • 容错与高可用

自此,微服务之间不用再记住彼此地址,而是通过 注册中心 找到彼此。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐