负载均衡与代理¶
学习目标¶
学完本章后,学习者应该能够:
- 区分四层负载均衡和七层负载均衡。
- 理解反向代理、Nginx、LVS、云负载均衡和 API Gateway 的职责。
- 理解一致性哈希在负载分配中的作用。
- 能解释代理层如何影响真实 IP、协议、超时和错误码。
四层与七层负载均衡¶
四层负载均衡工作在传输层,主要根据 IP 和端口转发 TCP / UDP 流量。
七层负载均衡工作在应用层,能理解 HTTP Host、Path、Header 等信息。
| 类型 | 关注点 | 常见用途 |
|---|---|---|
| 四层 | IP、端口、连接 | 高性能 TCP 转发 |
| 七层 | HTTP 语义 | 路由、鉴权、灰度、Header 处理 |
反向代理¶
反向代理位于客户端和服务端之间,对客户端表现为服务端,对后端服务表现为客户端。
常见能力:
- TLS 终止。
- 路由转发。
- 压缩。
- 限流。
- 鉴权。
- 日志记录。
- 灰度发布。
Nginx、Envoy、云负载均衡、Ingress Controller 都可能承担类似角色。
API Gateway¶
API Gateway 更靠近业务入口,通常包含:
- 认证授权。
- 限流。
- 路由。
- 协议转换。
- 请求签名。
- 统一日志和指标。
- 多租户隔离。
它不是简单代理,而是 API 治理入口。
一致性哈希¶
一致性哈希用于减少节点变更时的 key 迁移量。负载均衡中可以用它实现会话粘滞、缓存路由或按租户稳定路由。
但它也可能带来负载不均,需要虚拟节点、权重和热点保护。
Go 后端实际应用例子¶
例子一:从可信代理获取真实 IP¶
func ClientIPFromTrustedProxy(r *http.Request, trusted bool) string {
if trusted {
if ip := r.Header.Get("X-Forwarded-For"); ip != "" {
return strings.TrimSpace(strings.Split(ip, ",")[0])
}
}
host, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
return r.RemoteAddr
}
return host
}
只有确认请求来自可信代理时,才应该信任 X-Forwarded-For。
例子二:健康检查接口¶
func readiness(w http.ResponseWriter, r *http.Request) {
if !dependenciesReady() {
http.Error(w, "not ready", http.StatusServiceUnavailable)
return
}
w.WriteHeader(http.StatusNoContent)
}
负载均衡依赖健康检查决定是否转发流量。健康检查写错,会导致流量打到不可用实例,或健康实例被误摘除。
常见误区¶
- 误区一:负载均衡只负责平均分流。
它还涉及健康检查、连接复用、TLS、超时、重试、路由和可观测性。
- 误区二:代理层错误码一定来自后端服务。
502、503、504 可能由代理产生,未必进入后端应用。
- 误区三:真实 IP 一定在 RemoteAddr。
经过代理后,RemoteAddr 通常是上一跳代理地址。真实 IP 需要代理正确传递,并由服务端谨慎信任。
线上问题案例¶
某服务发布后,网关大量 504,但应用日志没有对应请求。排查发现网关到后端连接超时,请求没有进入应用处理逻辑。
修复方式是检查后端 Service、Pod readiness、监听地址、网关 upstream 配置、网络策略和代理超时设置。
实战任务¶
设计一个 API Gateway 到 Go 服务的转发链路:
- Gateway 负责 TLS 终止。
- Gateway 注入
X-Request-ID。 - Gateway 传递真实 IP。
- Go 服务提供 readiness 接口。
- 说明 502、503、504 可能分别代表什么。
参考答案
链路可以是 Client -> Gateway -> Go Service。Gateway 终止 TLS 后转发 HTTP 到后端,并设置 X-Request-ID、X-Forwarded-For、X-Forwarded-Proto。Go 服务只信任来自 Gateway 网段的转发头,并在日志中记录 request id。
502 通常表示网关无法从上游获得有效响应,例如连接被重置、协议错误;503 可能表示上游不可用或无健康实例;504 通常表示网关等待上游响应超时。具体含义要结合网关实现和日志。
面试题¶
1. 四层和七层负载均衡有什么区别?¶
参考答案
四层负载均衡基于 IP、端口和连接转发,通常性能高,适合 TCP / UDP 流量。七层负载均衡理解 HTTP 等应用层协议,可以根据 Host、Path、Header 做路由、鉴权、灰度和限流。
选择哪种取决于协议类型、性能要求和是否需要应用层治理能力。
2. 反向代理会如何影响后端服务?¶
参考答案
反向代理可能改变源 IP、终止 TLS、重写 Header、复用连接、设置超时、生成错误码,并影响请求日志中的远端地址。
后端服务需要理解代理传递的 Header、真实 IP 信任边界、超时配置和健康检查规则。
3. API Gateway 和普通反向代理有什么区别?¶
参考答案
普通反向代理主要负责转发、TLS、路由和基础负载均衡。API Gateway 更强调 API 治理,通常包含认证授权、限流、签名校验、协议转换、审计日志、租户隔离和统一观测。
Gateway 是业务入口的一部分,设计时要关注稳定性和安全边界。