概述

你已经学会了用 API 网关统一入口,也把系统拆成了多个微服务。
但还有一个关键问题:

“订单服务怎么知道用户服务在哪?IP 地址变了怎么办?”

在传统单体应用里,所有功能都在一个进程内,调用就像“自己人说话”。
但在微服务中,每个服务都运行在独立的容器甚至不同服务器上,它们之间如何“打招呼”?

这就需要一个“通讯录”——它就是:服务发现(Service Discovery)

问题来了:IP 地址会变

想象一下,你在代码里这样调用用户服务:

// 订单服务代码
const user = await axios.get('http://172.18.0.5:3000/api/users/123');

看起来没问题,但现实很残酷:

  • 容器重启后,IP 可能变成 172.18.0.6
  • 服务扩容了,有 3 个用户服务实例,该连哪一个?
  • 某个实例挂了,你还一直往它发请求?

👉 硬编码 IP 地址 = 自找麻烦!

我们需要一种机制:让服务能自动找到对方,不管它在哪、有几个、是否变化

这就是服务发现的使命。

什么是服务发现?

服务发现是一种机制,让微服务能够:

  1. 注册自己:“我上线了,我是用户服务,我在 X.X.X.X:3000”
  2. 发现别人:“我要找订单服务,它在哪?”

整个过程自动化,无需手动配置 IP

两种模式:客户端发现 vs 服务端发现

1. 客户端发现(Client-Side Discovery)

  • 每个服务启动时,向注册中心注册自己的地址
  • 调用方先问注册中心:“订单服务在哪?”
  • 注册中心返回可用实例列表
  • 调用方自己选择一个(如轮询)发起请求

常见工具:Eureka(Netflix)、Consul(HashiCorp)

[订单服务] → 向注册中心注册
    ↓
[用户服务] → 问注册中心 → 得到地址 → 直接调用订单服务

2. 服务端发现(Server-Side Discovery)

  • 服务依然向注册中心注册
  • 但调用方不直接找服务,而是通过负载均衡器或网关转发
  • 负载均衡器去查注册中心,再转发请求

常见场景:Kubernetes + Service / Ingress

[用户服务] → 发请求给网关
    ↓
[网关] → 问注册中心 → 找到订单服务 → 转发请求

现代云原生架构(如 K8s)多用服务端发现,更安全、易管理。

核心组件:注册中心(Registry)

注册中心是服务发现的“大脑”,常见选择:

工具特点
Consul功能全面,支持健康检查、KV 存储
etcd高性能,Kubernetes 的默认存储
ZooKeeper老牌分布式协调工具
EurekaNetflix 开源,简单易用

它们都提供:

  • 服务注册 API
  • 服务查询 API
  • 健康检查机制(自动剔除宕机实例)

实战:用 Docker + Consul 演示服务发现

我们用最简单的例子演示流程。

步骤 1:启动 Consul 注册中心

docker run -d --name consul \
  -p 8500:8500 \
  consul agent -server -ui -bootstrap -client=0.0.0.0

访问 http://localhost:8500,打开 Web 控制台。

步骤 2:模拟服务注册

你可以用 HTTP 手动注册一个服务(实际由服务框架自动完成):

curl -X PUT -d '{
  "ID": "user-service-1",
  "Name": "user-service",
  "Address": "172.17.0.10",
  "Port": 3000,
  "Check": {
    "HTTP": "http://172.17.0.10:3000/health",
    "Interval": "10s"
  }
}' http://localhost:8500/v1/agent/service/register

刷新 Consul 页面,你会看到 user-service 已注册!

步骤 3:查询服务

其他服务可以查询:

curl http://localhost:8500/v1/health/service/user-service

返回所有健康的 user-service 实例列表。

服务发现解决的问题

问题解决方案
IP 地址会变通过名称查找,不依赖固定 IP
服务扩容自动发现新实例
实例宕机健康检查自动剔除
负载均衡调用方可从多个实例中选择
配置集中化不用手动维护服务地址列表

总结

服务发现 = 微服务的“通讯录 + 导航仪”
它让服务之间摆脱对 IP 的依赖,实现动态、弹性、高可用的通信。

记住三句话:

  1. 服务启动 → 自动注册
  2. 服务调用 → 先查注册中心
  3. 服务下线 → 自动从列表移除

有了它,你的微服务才能真正“活”起来,自由伸缩,灵活协作。

更多推荐