Skip to content

第17章:服务发现与注册 ​

本章目标 ​

理解服务注册/发现概念 + gRPC + Consul 集成


17.1 为什么需要服务发现 ​

传统方式:         服务发现方式:
Client              Client
  │                    │
  │ 硬编码IP:端口       │ 问:"UserService在哪?"
  ▼                    ▼
Server(挂了→全跪)    ┌──────────┐
                     │ 注册中心   │ → 返回可用地址列表
                     └──────────┘
                       ▲     ▲
                     注册   注册
                     │     │
                  Server1 Server2

17.2 主流注册中心 ​

工具特点适用
ConsulGo 编写,健康检查强中小型项目
EtcdGo 编写,一致性强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 是最简单的服务发现方式

练习题 ​

  1. 搭建 Consul,注册 gRPC 服务。
  2. Client 通过 Consul 发现服务并调用。
  3. 模拟 Server 宕机,观察 Client 是否自动切换。

把零散知识,整理成可以反复走的路。