第17章:服务发现与注册
本章目标
理解服务注册/发现概念 + gRPC + Consul 集成
17.1 为什么需要服务发现
传统方式: 服务发现方式:
Client Client
│ │
│ 硬编码IP:端口 │ 问:"UserService在哪?"
▼ ▼
Server(挂了→全跪) ┌──────────┐
│ 注册中心 │ → 返回可用地址列表
└──────────┘
▲ ▲
注册 注册
│ │
Server1 Server217.2 主流注册中心
| 工具 | 特点 | 适用 |
|---|---|---|
| Consul | Go 编写,健康检查强 | 中小型项目 |
| Etcd | Go 编写,一致性强 | K8s 生态 |
| Nacos | 阿里出品,功能全 | 国内流行 |
| DNS | 最简单,无健康检查 | 简单场景 |
17.3 gRPC Name Resolver
gRPC 内置了名称解析器扩展点,可以对接各种注册中心:
go
// 使用 Consul Resolver
import _ "github.com/mbobakov/grpc-consul-resolver"
conn, _ := grpc.Dial(
"consul://localhost:8500/user-service?healthy=true",
grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy":"round_robin"}`),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
// 自动发现 user-service 的所有健康实例,Round Robin 分配17.4 服务注册流程
go
// 启动时注册到 Consul,关闭时注销
func main() {
// 1. 注册到 Consul
reg := consul.NewRegistrar("user-service", "localhost:50051")
reg.Register()
defer reg.Deregister()
// 2. 启动 gRPC Server
s := grpc.NewServer()
s.Serve(lis)
}本章小结
- 服务发现解决"服务在哪里"的问题
- gRPC Name Resolver 对接 Consul/Etcd/Nacos
- Client 通过注册中心查询 + 负载均衡
- DNS 是最简单的服务发现方式
练习题
- 搭建 Consul,注册 gRPC 服务。
- Client 通过 Consul 发现服务并调用。
- 模拟 Server 宕机,观察 Client 是否自动切换。