grpc客户端必须显式启用round_robin才生效,因v1.27+默认禁用负载均衡,仅配置grpc.withdefaultserviceconfig({"loadbalancingpolicy":"round_robin"})并配合dns:///目标及resolver导入才能触发轮询;直连多地址需手动指定balancer,否则panic。

gRPC 客户端必须显式启用 round_robin 才生效
gRPC-Go v1.27+ 默认禁用客户端负载均衡,即使你传入多个地址,grpc.Dial 也会只连第一个——这不是 bug,是设计行为。不配置就等于“pick_first”。
- 必须传入
grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy":"round_robin"}`),字符串格式不能错,key 是loadBalancingPolicy(不是lb_policy或其他变体) - 若目标是 DNS 地址(如
dns:///user-svc.default.svc.cluster.local),需提前导入 resolver:_ "google.golang.org/grpc/resolver/dns",否则解析失败且无明确错误提示 - 若用
passthrough:///10.0.1.1:8080,10.0.1.2:8080这类直连格式,必须手动指定 balancer,否则运行时 panic,错误信息为:"no load balancing policy configured"
HTTP 客户端轮询容易踩连接复用和故障剔除的坑
手写 http.RoundTripper 做轮询看似简单,但实际高并发下极易出问题:连接没复用、故障节点持续被选中、超时中断不触发剔除。
-
http.Client必须复用,且设置Transport.MaxIdleConnsPerHost = 100(默认是 2),否则新建连接风暴会压垮服务端 - 轮询索引不能放在
RoundTrip内加锁更新,要用atomic.AddUint64(&idx, 1)+ 取模,避免锁竞争拖慢吞吐 - 遇到
connection refused或 HTTP 5xx,得把该 endpoint 标记为“退避”,存入sync.Map,键为地址,值为time.Now().Add(30 * time.Second) -
context.DeadlineExceeded不会自动触发剔除,必须在RoundTrip的 error 分支里显式判断并加入退避逻辑
最少连接策略需小心并发读写和连接泄漏
最少连接(Least Connections)在 Go 中要自己维护每个后端的活跃连接数,看似合理,实则容易因统计不准导致流量倾斜或资源耗尽。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 不能只靠
http.Transport的MaxIdleConnsPerHost推算连接数——它只管空闲连接;真正活跃连接需在RoundTrip开始时 +1、结束时 -1,且必须用sync.RWMutex或sync.Map保护 - 如果请求因 context cancel 或 timeout 提前退出,务必确保连接计数器能被正确减掉,否则连接数虚高,新请求永远绕不开“假忙”节点
- 建议搭配健康探测:每 5 秒对每个 endpoint 发一个 HEAD 请求,失败则临时踢出,避免把流量导给已僵死但连接未关闭的实例
一致性哈希不适合所有场景,尤其别用于无状态计算服务
一致性哈希常被误认为“高级负载均衡”,但它本质是为缓存亲和性设计的,用在普通 RPC 或 HTTP 调用上反而增加复杂度和风险。
- 只有当业务强依赖 key → 实例绑定(比如用户 session 数据本地缓存、分片数据库路由),才值得引入
github.com/cespare/xxhash/v2+ 环结构 - 节点增减时仍会有部分 key 迁移,若服务无状态且无共享缓存,这种迁移毫无收益,纯属徒增延迟
- 实现环结构时,虚拟节点数别设太高(如 1000),否则每次
Next()都要遍历大量 hash 值,CPU 消耗陡增;200–400 是较稳的平衡点
真实生产环境里,最易被忽略的是“健康状态与连接数的耦合”——节点可能 TCP 可连、HTTP 返回 200,但实际 goroutine 已卡死。这时候光靠最少连接或轮询都救不了,必须叠加主动探测 + 指标反馈闭环。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










