--- tags: [microservice, api-gateway, kong, apisix, spring-cloud-gateway] create time: 2026-05-05 --- # API 网关 ## 概述 API Gateway 是所有外部请求的统一入口,承担以下职责: ```mermaid graph LR Client["客户端 App / Web"] --> GW["API Gateway"] GW --> Auth["鉴权 & 限流"] GW --> Route["路由转发"] GW --> Transform["协议转换"] GW --> Log["日志 & 监控"] GW -.-> CB[(配置中心)] ``` 常见实现:**Kong、APISIX、Spring Cloud Gateway、Nginx + Lua**。 ## 网关应该做什么? > [!summary] 网关职责清单 | ✅ 适合放 | ❌ 不应该放 | |---------|-----------| | 鉴权与认证 | 业务逻辑(如订单创建) | | 限流熔断 | 复杂的数据聚合查询 | | HTTPS 终结 | 大量 CPU 密集型计算 | | 请求/响应转换 | 涉及数据库写操作 | | 路由分发 | 跨服务事务管理 | | 日志 & 监控 | 邮件/短信发送等异步任务 | > [!tip] 核心原则 > **网关保持瘦**——它是 traffic cop(交通警察),不是 warehouse manager(仓库管理员)。重逻辑应下沉到业务服务。 ### 分层鉴权模型 > [!question] 权衡题 > 有人说:"鉴权放到网关统一做,避免每个服务重复写。"但如果某个内部服务不需要鉴权呢?或者不同团队要求不同的鉴权方式呢? **分层鉴权架构**: ```mermaid graph TB External["外部用户"] --> GW["API Gateway
JWT 校验 + OAuth2"] GW --> S1[公开接口
无需额外鉴权] GW --> S2[内部接口
Service Token] S1 --> UserSvc[[User Service]] S2 --> OrderSvc[[Order Service]] S2 --> PaySvc[[Payment Service]] OrderSvc -->|"mTLS + JWT"| DB[(DB)] PaySvc -->|"mTLS + JWT"| DB ``` - **第一层(网关)**:校验外部用户的 JWT/OAuth Token,拦截非法请求 - **第二层(服务间)**:通过 Service Token 或 mTLS 保证调用方身份可信 - **第三层(数据层)**:RBAC / ABAC 细粒度权限控制 ## 路由策略 ### 基础路由规则 ```yaml # APISIX 路由示例 routes: - uri: /api/orders/* upstream: nodes: "order-service:8080": 1 type: roundrobin - uri: /api/payments/* upstream: nodes: "payment-service:8080": 1 type: roundrobin ``` ### 高级路由策略 | 策略 | 场景 | 示例 | |------|------|------| | **路径匹配** | 按 URL 前缀路由 | `/api/v1/*` → v1 版本服务 | | **Header 匹配** | A/B 测试、灰度发布 | `x-canary: true` → 新版本 | | **权重路由** | 金丝雀发布 | 90% 流量 → v1, 10% → v2 | | **正则匹配** | 复杂 URL 模式 | `/api/user/(?P\d+)/*` | ## 网关插件体系 网关的核心价值在于 **可插拔的中间件链**,类似 Express/Koa 的 middleware 概念。 ```mermaid graph LR Req["Request"] -->|Plugin 1| RateLimiter["限流"] RateLimiter -->|Plugin 2| Auth["鉴权"] Auth -->|Plugin 3| CBR["熔断"] CBR -->|Plugin 4| Transform["协议转换"] Transform -->|Plugin 5| Logger["日志"] Logger --> Backend["Backend Service"] ``` ### 常用插件列表 | 插件 | 作用 | 推荐算法 | |------|------|---------| | **Rate Limiting** | 防刷限流 | 令牌桶 / 漏桶 | | **CORS** | 跨域处理 | 预检缓存 | | **IP 黑白名单** | 访问控制 | Redis Bloom Filter | | **Response Rewrite** | 修改响应体 | JSON Patch | | **Request Transformation** | Header/Body 改写 | Map-based | | **Prometheus Exporter** | 指标采集 | 自动埋点 | | **Fault Injection** | 混沌测试注入延迟/错误 | 按比例注入 | ## 网关的高可用设计 ```mermaid graph TB DNS["DNS / CLB"] --> GW1["Gateway Node 1"] DNS --> GW2["Gateway Node 2"] subgraph GW_Cluster["网关集群"] GW1 GW2 end GW1 --> B1["backend-pool-v1"] GW2 --> B2["backend-pool-v1"] B1 --> Svc1[[order-service]] B1 --> Svc2[[user-service]] B2 --> Svc1 B2 --> Svc2 GW1 -.-> Config["配置中心 (同步)"] GW2 -.-> Config ``` **关键点**: - 网关无状态设计,可横向扩展 - 配置通过注册中心实时同步,无需重启 - 多节点前接负载均衡器(CLB/Nginx) ## 关联笔记 - [[02-服务治理/服务发现/README]] — 网关需要订阅服务实例列表 - [[02-服务治理/流量治理/README]] — 高级路由和灰度发布的延伸 - [[hzh/MS/API 设计原则]] — API Gateway 的设计与 REST/gRPC 选型