3. 网关架构模式:反向代理、中间件链、插件化设计、网关与微服务的关系
API 网关是微服务架构的流量入口与策略执行点。在《Go权限审计网关事务边界》课程中,理解网关的架构模式是设计可审计、可扩展、高可用的权限网关的前提。本章从反向代理、中间件链、插件化设计三个核心模式出发,厘清网关与微服务之间的职责边界。
3.1 反向代理:网关的流量转发基石
反向代理是网关最基础的职能。与正向代理(代理客户端)不同,反向代理代理的是服务端,客户端无需感知后端服务的真实地址。在 Go 中,net/http/httputil.ReverseProxy 提供了开箱即用的反向代理实现。
核心职责: 协议转换(HTTP/HTTPS/gRPC)、负载均衡、请求/响应改写、连接池管理。
反向代理在网关中的典型工作流程如下:
- 客户端向网关的公共端点发起请求。
- 网关根据路由规则匹配目标上游服务。
- 网关执行前置过滤(鉴权、限流、审计日志记录)。
- 网关将请求转发至上游服务,并等待响应。
- 网关执行后置过滤(响应改写、审计日志补全)。
- 网关将响应返回给客户端。
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 进程运行高风险插件。
插件化网关的架构层次:
- 核心层: 路由引擎、反向代理、中间件链调度器、配置热加载。
- 扩展层: 插件注册中心、插件生命周期管理(加载/卸载/升级)、插件通信接口。
- 插件层: 鉴权插件、审计插件、限流插件、协议转换插件、自定义业务插件。
3.4 网关与微服务的关系
网关不是微服务的替代品,而是微服务架构的补充组件。理解两者的职责边界,是设计可审计网关的前提。
| 维度 | API 网关 | 微服务 |
|---|---|---|
| 职责 | 流量入口、安全策略、协议转换、聚合 | 业务逻辑、数据持久化、领域服务 |
| 状态 | 无状态(推荐),便于水平扩展 | 可有状态(数据库、缓存) |
| 审计粒度 | 请求级审计(谁、何时、什么 API) | 业务级审计(数据变更、操作结果) |
| 事务边界 | 不处理分布式事务,仅做请求转发 | 处理本地事务,参与 Saga/TCC |
| 扩展方式 | 中间件链 + 插件化 | 服务拆分 + 独立部署 |
| 故障影响 | 全局性(网关不可用则所有服务不可达) | 局部性(单个服务故障不影响其他服务) |
架构原则: 网关只做“跨服务”的横切关注点(鉴权、审计、限流、路由),不做“业务内”的逻辑处理。业务逻辑下沉到微服务,网关保持薄层。这保证了审计日志的清晰边界:网关记录“谁请求了什么”,微服务记录“操作了什么结果”。