3. 网关架构模式:反向代理、中间件链、插件化设计、网关与微服务的关系

API 网关是微服务架构的流量入口与策略执行点。在《Go权限审计网关事务边界》课程中,理解网关的架构模式是设计可审计、可扩展、高可用的权限网关的前提。本章从反向代理、中间件链、插件化设计三个核心模式出发,厘清网关与微服务之间的职责边界。

3.1 反向代理:网关的流量转发基石

反向代理是网关最基础的职能。与正向代理(代理客户端)不同,反向代理代理的是服务端,客户端无需感知后端服务的真实地址。在 Go 中,net/http/httputil.ReverseProxy 提供了开箱即用的反向代理实现。

核心职责: 协议转换(HTTP/HTTPS/gRPC)、负载均衡、请求/响应改写、连接池管理。

反向代理在网关中的典型工作流程如下:

  1. 客户端向网关的公共端点发起请求。
  2. 网关根据路由规则匹配目标上游服务。
  3. 网关执行前置过滤(鉴权、限流、审计日志记录)。
  4. 网关将请求转发至上游服务,并等待响应。
  5. 网关执行后置过滤(响应改写、审计日志补全)。
  6. 网关将响应返回给客户端。
反向代理请求流转 客户端 API 网关 服务 A 服务 B 服务 C 请求 路由 响应 响应 关键点 客户端只知网关 网关隐藏后端拓扑 支持协议转换

3.2 中间件链:可组合的请求处理管道

中间件链是网关实现横切关注点(鉴权、审计、限流、日志)的核心模式。每个中间件是一个独立的处理单元,通过链式调用形成请求处理管道。Go 的 http.Handler 接口天然适合构建中间件链。

设计原则: 每个中间件只关注一个职责。例如:AuthMiddleware 只做身份验证,AuditMiddleware 只记录审计日志,RateLimitMiddleware 只做限流。通过组合而非继承实现功能扩展。

典型的中间件链执行顺序:

顺序 中间件 职责 失败处理
1 RecoveryMiddleware 捕获 panic,返回 500 返回错误响应,中断链
2 RequestIDMiddleware 注入全局请求 ID 生成新 ID,继续执行
3 AuthMiddleware JWT/OAuth2 鉴权 返回 401,中断链
4 AuditMiddleware 记录请求/响应审计日志 记录失败,继续执行
5 RateLimitMiddleware 令牌桶/滑动窗口限流 返回 429,中断链
6 ProxyMiddleware 反向代理转发 返回 502/503

Go 中中间件链的典型实现模式:

// Middleware 定义
type Middleware func(http.Handler) http.Handler

// Chain 组合多个中间件
func Chain(handler http.Handler, middlewares ...Middleware) http.Handler {
    for i := len(middlewares) - 1; i >= 0; i-- {
        handler = middlewares[i](handler)
    }
    return handler
}

// 使用示例
handler := Chain(
    proxyHandler,
    RecoveryMiddleware,
    RequestIDMiddleware,
    AuthMiddleware,
    AuditMiddleware,
    RateLimitMiddleware,
)

3.3 插件化设计:动态扩展网关能力

插件化设计允许在不修改网关核心代码的情况下,动态加载和卸载功能模块。在 Go 中,插件化可以通过 plugin 包(Go 1.8+)、gRPC 流式调用、或 WASM 运行时实现。

安全注意: 插件运行在网关进程内,必须严格限制插件的系统调用、文件访问和网络权限。建议使用沙箱或独立的 gRPC 进程运行高风险插件。

插件化网关的架构层次:

  • 核心层: 路由引擎、反向代理、中间件链调度器、配置热加载。
  • 扩展层: 插件注册中心、插件生命周期管理(加载/卸载/升级)、插件通信接口。
  • 插件层: 鉴权插件、审计插件、限流插件、协议转换插件、自定义业务插件。
插件化网关架构层次 插件层(Plugin Layer) 鉴权插件 审计插件 限流插件 协议转换 自定义插件 扩展层(Extension Layer) 插件注册中心 | 生命周期管理 | 通信接口(gRPC/WASM/Plugin) 核心层(Core Layer) 路由引擎 | 反向代理 | 中间件链调度器 | 配置热加载 插件通过扩展层接口与核心层交互,核心层不感知具体插件实现

3.4 网关与微服务的关系

网关不是微服务的替代品,而是微服务架构的补充组件。理解两者的职责边界,是设计可审计网关的前提。

维度 API 网关 微服务
职责 流量入口、安全策略、协议转换、聚合 业务逻辑、数据持久化、领域服务
状态 无状态(推荐),便于水平扩展 可有状态(数据库、缓存)
审计粒度 请求级审计(谁、何时、什么 API) 业务级审计(数据变更、操作结果)
事务边界 不处理分布式事务,仅做请求转发 处理本地事务,参与 Saga/TCC
扩展方式 中间件链 + 插件化 服务拆分 + 独立部署
故障影响 全局性(网关不可用则所有服务不可达) 局部性(单个服务故障不影响其他服务)
架构原则: 网关只做“跨服务”的横切关注点(鉴权、审计、限流、路由),不做“业务内”的逻辑处理。业务逻辑下沉到微服务,网关保持薄层。这保证了审计日志的清晰边界:网关记录“谁请求了什么”,微服务记录“操作了什么结果”。