主题
Day 6 — 负载均衡与服务发现(Discovery)
学习目标
实现客户端侧的服务发现与负载均衡机制,支持多节点 RPC 调用和请求广播。
核心概念
Discovery 接口
go
type Discovery interface {
Refresh() error // 从注册中心刷新服务列表
Update(servers []string) error // 手动更新服务列表
Get(mode SelectMode) (string, error) // 按策略选择一个服务器
GetAll() ([]string, error) // 获取所有服务器
}当前实现了 MultiServerDiscovery(手动维护服务器列表),可以扩展为从 etcd/consul 等注册中心自动发现。
负载均衡策略
- RandomSelect:随机选择一个服务器,适合无状态场景
- RoundRobinSelect:轮询选择,请求均匀分布到各节点
XClient
XClient 是支持服务发现的增强客户端:
- 内部维护一个
clients map,缓存已建立的连接 Call()根据负载均衡策略选择节点并调用Broadcast()向所有节点广播请求
Broadcast 语义
- 向所有节点并发发送相同请求
- 任一节点返回错误 → 立即取消其余请求,返回错误
- 全部成功 → 返回最后一个成功的 reply
关键代码
| 文件 | 说明 |
|---|---|
xclient/discovery.go | Discovery 接口、MultiServerDiscovery |
xclient/xclient.go | XClient、Call、Broadcast |
xclient/discovery_test.go | 负载均衡策略测试 |
运行
bash
go run ./day6-discovery/example/
go test -v ./xclient/