Skip to content

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.goDiscovery 接口、MultiServerDiscovery
xclient/xclient.goXClient、Call、Broadcast
xclient/discovery_test.go负载均衡策略测试

运行

bash
go run ./day6-discovery/example/
go test -v ./xclient/