跳转至

负载均衡与代理

学习目标

学完本章后,学习者应该能够:

  1. 区分四层负载均衡和七层负载均衡。
  2. 理解反向代理、Nginx、LVS、云负载均衡和 API Gateway 的职责。
  3. 理解一致性哈希在负载分配中的作用。
  4. 能解释代理层如何影响真实 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 服务的转发链路:

  1. Gateway 负责 TLS 终止。
  2. Gateway 注入 X-Request-ID
  3. Gateway 传递真实 IP。
  4. Go 服务提供 readiness 接口。
  5. 说明 502、503、504 可能分别代表什么。
参考答案

链路可以是 Client -> Gateway -> Go Service。Gateway 终止 TLS 后转发 HTTP 到后端,并设置 X-Request-IDX-Forwarded-ForX-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 是业务入口的一部分,设计时要关注稳定性和安全边界。