主题
Day 6 技术设计文档 — 服务发现与负载均衡
Discovery 接口层次
XClient 架构
负载均衡策略对比
| 策略 | 实现 | 适用场景 | 复杂度 |
|---|---|---|---|
| Random | rand.Intn(n) | 无状态服务、节点性能均匀 | O(1) |
| RoundRobin | index++ % n | 请求耗时均匀的场景 | O(1) |
| WeightedRR | 加权轮询 | 节点性能不均(可扩展) | O(n) |
| ConsistentHash | 一致性哈希 | 有状态、缓存亲和(可扩展) | O(log n) |
Broadcast 并发实现
go
func (xc *XClient) Broadcast(ctx context.Context, ...) error {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
for _, addr := range servers {
go func(addr string) {
err := xc.call(addr, ctx, ...)
mu.Lock()
if err != nil && e == nil {
e = err
cancel() // 快速失败:取消其余请求
}
mu.Unlock()
}(addr)
}
wg.Wait()
return e
}关键点:
- 使用
context.WithCancel实现快速失败 sync.Mutex保护共享的 error 变量- reply 使用
reflect.New克隆,避免并发写入同一对象
连接池设计
XClient 的 clients map[string]*Client 实现了简单的连接缓存:
- 首次调用某地址时创建新连接并缓存
- 后续调用复用已有连接
- 连接不可用时自动重建