一、注册中心:微服务世界的 “通讯录”

想象一下,你去一个大型公司找人,要是没有前台或通讯录,你可能得一层一层瞎转悠。微服务也是如此 —— 当系统拆分成几十个甚至上百个服务时,它们之间要互相调用,总不能让开发者手动记每个服务的 IP 和端口吧?这时候,注册中心就成了微服务世界的 “智能通讯录”。

1. 核心角色与流程

微服务远程调用中有三个关键角色,它们的互动就像外卖平台的运作:

  • 服务提供者:像餐馆,提供菜品(接口)
  • 服务消费者:像顾客,下单(调用接口)
  • 注册中心:像外卖平台,记录所有餐馆信息,帮顾客找到合适的店

具体流程可以拆解为:

  1. 餐馆入驻:服务启动时,主动把自己的信息(服务名、IP、端口)报到注册中心(就像餐馆在美团上注册)
  2. 顾客查店:消费者从注册中心查询需要的服务列表(比如顾客搜 “川菜”,得到一堆川菜馆)
  3. 选择下单:消费者自己做决定(负载均衡)选一个实例(比如选评分最高的那家)
  4. 送餐上门:消费者直接向选中的实例发起调用(顾客直接打电话给餐馆下单)

2. 动态更新机制:通讯录会 “自动刷新”

现实中餐馆可能关门、新开张,注册中心也得应对这种变化:

  • 心跳检测:服务提供者定期给注册中心发 “我还活着” 的信号(就像餐馆每天向平台报平安)
  • 下线剔除:如果注册中心很久没收到心跳,就把这个实例从列表中移除(餐馆倒闭,平台下架它)
  • 上线新增:新服务启动时主动注册,注册中心更新列表(新开的餐馆入驻平台)
  • 主动通知:服务列表变化时,注册中心会 “推消息” 给消费者更新本地列表(平台给用户推送 “新店开业” 通知)

二、Nacos:国产注册中心 “优等生”

市面上的注册中心有很多,但 Nacos 凭借 “本土化优势” 在国内备受青睐,就像微信在社交领域的地位 —— 功能全、接地气。

1. 主流注册中心对比

名称 厂商 特点 适用场景
Eureka Netflix 老牌选手,SpringCloud 标配 纯 Java 微服务
Nacos 阿里巴巴 中文文档丰富,兼具配置管理 国内 Java 项目首选
Consul HashiCorp 跨语言支持,功能全面 多语言混合开发

Nacos 的优势在于:

  • 中文文档友好,国内开发者上手快
  • 同时支持服务注册发现和配置管理(一站式解决方案)
  • 性能稳定,阿里内部经过大规模验证

2. Docker 部署 Nacos:三步搞定

步骤 1:准备 MySQL 数据库

Nacos 需要数据库存储服务信息,就像通讯录需要个笔记本。

  • 把课前资料的 SQL 文件导入 Docker 中的 MySQL
  • 这些表会记录服务名、实例 IP、健康状态等信息

步骤 2:配置 Nacos 环境

  • 找到 nacos/custom.env 文件,修改 MYSQL_SERVICE_HOST 为你的虚拟机 IP(告诉 Nacos 笔记本放哪了)
  • 把 nacos 目录上传到虚拟机的 /root 目录

步骤 3:启动 Nacos 容器

执行 Docker 命令:

1
2
3
4
5
6
7
8
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

启动后访问 http://你的虚拟机IP:8848/nacos,用账号密码 nacos 登录,就能看到 Nacos 的控制台了。

三、服务注册:让 Nacos 认识你的服务

item-service(商品服务)为例,把它注册到 Nacos,就像让餐馆在平台上注册。

1. 引入依赖

pom.xml 中添加 Nacos 客户端依赖,相当于给服务装个 “Nacos 通讯器”:

1
2
3
4
5
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2. 配置 Nacos 地址

application.yml 中告诉服务 Nacos 在哪里:

1
2
3
4
5
6
spring:
application:
name: item-service # 服务名称(就像餐馆名)
cloud:
nacos:
server-addr: 192.168.150.101:8848 # nacos地址(平台地址)

3. 启动多实例

实际项目中服务通常多实例部署(就像连锁餐馆),可以通过修改端口启动多个 item-service

  • 实例 1:端口 8081
  • 实例 2:端口 8082

启动后在 Nacos 控制台的 “服务列表” 中,就能看到 item-service 有两个实例了,点击详情可以查看每个实例的 IP 和端口。

四、服务发现:让消费者找到服务

cart-service(购物车服务)为例,它需要调用 item-service,这时候就需要 “服务发现” 功能。

1. 引入依赖

消费者同样需要 Nacos 依赖,还要加个负载均衡器(选餐馆时的 “筛选工具”):

1
2
3
4
5
6
7
8
9
10
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2. 配置 Nacos 地址

和服务提供者一样,在 application.yml 中配置 Nacos 地址:

1
2
3
4
spring:
cloud:
nacos:
server-addr: 192.168.150.101:8848 # 同样的平台地址

3. 实现服务调用

步骤 1:注入 DiscoveryClient

SpringCloud 提供的 DiscoveryClient 就像个 “服务查询器”,能从 Nacos 获取服务列表:

1
2
@Autowired
private DiscoveryClient discoveryClient;

步骤 2:获取服务实例并调用

1
2
3
4
5
6
7
8
9
// 1. 查询item-service的所有实例
List<ServiceInstance> instances = discoveryClient.getInstances("item-service");
// 2. 负载均衡:随机选一个实例(简单算法)
int index = new Random().nextInt(instances.size());
ServiceInstance instance = instances.get(index);
// 3. 拼接请求地址
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/item/" + id;
// 4. 发起远程调用
String result = restTemplate.getForObject(url, String.class);

这个过程就像:

  1. 顾客打开外卖 APP 搜 “item-service 餐馆”
  2. APP 返回所有分店(实例列表)
  3. 顾客随机选一家(负载均衡)
  4. 打电话给选中的分店下单(远程调用)

五、总结:注册中心的核心价值

注册中心解决了微服务架构中的服务定位问题,让服务之间的调用从 “硬编码 IP 端口” 变成 “动态发现”,就像从 “记住每个朋友的手机号” 变成 “用通讯录查找”。

Nacos 作为优秀的注册中心,不仅能管理服务列表,还能动态感知服务上下线,让整个微服务系统更灵活、更稳定。下一章我们会学习 Nacos 的另一个强大功能 —— 配置管理,它能帮我们集中管理所有服务的配置信息。