Go语言net/rpc需自行实现负载均衡:轮询适用于静态节点,加权随机适配异构节点,一致性哈希减少扩缩容抖动,结合服务发现与健康探测提升生产可靠性。
Go 语言原生 net/rpc 不内置负载均衡能力,需在客户端或中间层自行实现。核心思路是:将多个 RPC 服务节点抽象为可选后端池,根据策略选择目标节点发起调用。关键在于解耦服务发现、健康检查与路由逻辑,避免单点瓶颈和请求倾斜。
最简单且无依赖的方案:客户端维护一个服务地址列表,每次调用时按顺序选取下一个节点。适合服务节点静态、数量较少、不频繁变更的场景。
sync/atomic 管理递增索引,保证并发安全当后端节点 CPU、内存或网络带宽差异较大时,单纯轮询会导致强节点闲置、弱节点过载。可为每个节点配置权重(如 1–10),按权重比例决定被选中的概率。
适用于需保持“相同请求打到同一节点”的场景(如带本地缓存或会话状态的 RPC 服务)。新增/下线节点时,仅少量 key 重新映射,避免全量抖动。
用 github.com/hashicorp/go-memdb 或轻量库 github.com/bradfitz/gomemcache/memcache 中的一致性哈希逻辑复用真实生产环境节点常动态扩缩容,硬编码地址不可靠。应对接 Consul、etcd 或 Nacos,实现自动注册与剔除。
sony/gobreaker)联动:某节点错误率 > 50%,自动开启熔断,暂停分配新请求