服务发现:微服务是怎么找到彼此的
·
概述
你已经学会了用 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 地址 = 自找麻烦!
我们需要一种机制:让服务能自动找到对方,不管它在哪、有几个、是否变化。
这就是服务发现的使命。
什么是服务发现?
服务发现是一种机制,让微服务能够:
- 注册自己:“我上线了,我是用户服务,我在 X.X.X.X:3000”
- 发现别人:“我要找订单服务,它在哪?”
整个过程自动化,无需手动配置 IP
两种模式:客户端发现 vs 服务端发现
1. 客户端发现(Client-Side Discovery)
- 每个服务启动时,向注册中心注册自己的地址
- 调用方先问注册中心:“订单服务在哪?”
- 注册中心返回可用实例列表
- 调用方自己选择一个(如轮询)发起请求
常见工具:Eureka(Netflix)、Consul(HashiCorp)
[订单服务] → 向注册中心注册
↓
[用户服务] → 问注册中心 → 得到地址 → 直接调用订单服务
2. 服务端发现(Server-Side Discovery)
- 服务依然向注册中心注册
- 但调用方不直接找服务,而是通过负载均衡器或网关转发
- 负载均衡器去查注册中心,再转发请求
常见场景:Kubernetes + Service / Ingress
[用户服务] → 发请求给网关
↓
[网关] → 问注册中心 → 找到订单服务 → 转发请求
现代云原生架构(如 K8s)多用服务端发现,更安全、易管理。
核心组件:注册中心(Registry)
注册中心是服务发现的“大脑”,常见选择:
| 工具 | 特点 |
|---|---|
| Consul | 功能全面,支持健康检查、KV 存储 |
| etcd | 高性能,Kubernetes 的默认存储 |
| ZooKeeper | 老牌分布式协调工具 |
| Eureka | Netflix 开源,简单易用 |
它们都提供:
- 服务注册 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 的依赖,实现动态、弹性、高可用的通信。
记住三句话:
- 服务启动 → 自动注册
- 服务调用 → 先查注册中心
- 服务下线 → 自动从列表移除
有了它,你的微服务才能真正“活”起来,自由伸缩,灵活协作。
更多推荐
所有评论(0)