Go实现负载均衡的核心是用net/http和httputil.ReverseProxy构建反向代理,支持轮询、加权轮询、最少连接、一致性哈希策略,集成服务发现、健康检查及TLS终止与请求改写。

用 Go 实现负载均衡,核心是拦截客户端请求,按策略分发到后端微服务实例。不依赖外部组件(如 Nginx、Envoy),可嵌入网关或独立运行,适合轻量级服务网格或内部代理场景。
选择合适的负载均衡策略
Go 标准库 net/http 足以构建反向代理,关键在请求分发逻辑。常用策略有:
- 轮询(Round Robin):最简单,依次将请求分给每个健康节点;适合后端实例性能相近的场景。
- 加权轮询(Weighted Round Robin):为不同实例设置权重(如 CPU/内存差异),高配机器处理更多请求。
- 最少连接(Least Connections):选当前活跃连接数最少的后端,适合长连接或响应时间波动大的服务。
- 一致性哈希(Consistent Hashing):对请求特征(如 user_id、path)哈希,保证相同特征始终落到同一实例,利于缓存和会话保持。
用 http.ReverseProxy 快速搭建基础代理
Go 的 http.ReverseProxy 是实现反向代理的基石。它自动处理请求转发、Header 透传、响应回写,只需替换 Director 函数来控制目标地址:
director := func(req *http.Request) {
// 从实例列表中按策略选一个
target := selectBackend()
req.URL.Scheme = "http"
req.URL.Host = target.Addr // 如 "10.0.1.10:8080"
}
proxy := &httputil.ReverseProxy{Director: director}
http.Handle("/", proxy)
注意:需自行维护后端实例列表(如从 etcd、Consul 或配置文件读取),并定期探测健康状态(如主动 HTTP 健康检查 + 熔断标记)。
立即学习“go语言免费学习笔记(深入)”;
集成服务发现与健康检查
硬编码 IP 不可扩展。推荐结合轻量服务发现机制:
- 启动时拉取一次注册中心(如 Nacos、Eureka)的服务列表,并监听变更事件动态更新本地缓存。
- 为每个后端启动 goroutine 定期发起健康探针(HEAD /health),连续失败 n 次则标记为不可用,恢复后自动剔除熔断状态。
- 使用 sync.Map 或 RWMutex 保护实例列表读写,避免高并发下竞争。
支持 TLS 终止与请求改写
生产环境常需 HTTPS 入口 + HTTP 后端(TLS 终止)。ReverseProxy 默认透传原始协议,需手动修正:










