490 words
2 minutes
如何设计一套 API Gateway 网关系统
API Gateway 是微服务架构的入口,设计好网关至关重要
核心功能
┌─────────────────────────────────────────────┐│ API Gateway │├─────────────────────────────────────────────┤│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ││ │路由转发 │ │认证授权 │ │限流熔断 │ ││ └─────────┘ └─────────┘ └─────────┘ ││ ┌─────────┐ ┌─────────┐ ┌─────────┐ ││ │日志监控 │ │协议转换 │ │负载均衡 │ ││ └─────────┘ └─────────┘ └─────────┘ │└─────────────────────────────────────────────┘1. 请求路由
routes: - path: /api/user/** service: user-service timeout: 5000
- path: /api/order/** service: order-service timeout: 10000
- path: /api/payment/** service: payment-service rewrite: /api/payment/(.*) -> /$12. 认证授权
@Componentpublic class AuthFilter implements GlobalFilter {
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String token = exchange.getRequest() .getHeaders().getFirst("Authorization");
// 验证 JWT if (!jwtUtil.verify(token)) { return unauthorized(exchange); }
// 解析用户信息,传递给下游 UserInfo user = jwtUtil.parse(token); exchange.getAttributes().put("user", user);
return chain.filter(exchange); }}3. 限流熔断
// 使用 Sentinel 实现限流@SentinelResource(value = "orderApi", blockHandler = "blockHandler")public Mono<Order> getOrder(String id) { return webClient.get() .uri("/orders/" + id) .retrieve() .bodyToMono(Order.class);}
// 配置限流规则@Configurationpublic class SentinelConfig { @PostConstruct public void init() { FlowRuleManager.loadRules( Arrays.asList( new FlowRule("orderApi") .setCount(100) .setGrade(RuleConstant.FLOW_GRADE_QPS) ) ); }}4. 日志与监控
// 请求日志@Componentpublic class LoggingFilter implements GlobalFilter {
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { long start = System.currentTimeMillis();
return chain.filter(exchange) .then(Mono.fromRunnable(() -> { long duration = System.currentTimeMillis() - start; log.info("{} {} - {}ms - {}", exchange.getRequest().getMethod(), exchange.getRequest().getURI(), duration, exchange.getResponse().getStatusCode());
// 发送指标到 Prometheus metrics.record( "api_request_duration", duration, "path", exchange.getRequest().getPath(), "status", exchange.getResponse().getStatusCode() ); })); }}整体架构图
┌─────────────┐ │ DNS/LB │ └──────┬──────┘ │ ┌──────▼──────┐ │ Nginx │ └──────┬──────┘ │ ┌────────────┼────────────┐ │ │ │ ┌─────▼─────┐ ┌────▼────┐ ┌─────▼─────┐ │ Gateway 1 │ │Gateway 2│ │Gateway 3 │ └─────┬─────┘ └────┬────┘ └─────┬─────┘ │ │ │ └────────────┼────────────┘ │ ┌──────────────────┼──────────────────┐ │ │ │ ┌────▼────┐ ┌─────▼─────┐ ┌─────▼────┐ │ User │ │ Order │ │ Payment │ │ Service │ │ Service │ │ Service │ └─────────┘ └───────────┘ └─────────┘常用网关方案
| 方案 | 优点 | 缺点 |
|---|---|---|
| Spring Cloud Gateway | Spring 生态集成简单 | 性能一般 |
| Kong | 性能高,插件丰富 | 需要额外学习 Lua |
| APISIX | 高性能,云原生 | 社区较小 |
| Nginx | 高性能,稳定 | 动态配置弱 |
总结
设计 API Gateway 的核心要点:
- 高性能 - 网关是入口,延迟影响全局
- 高可用 - 多实例部署,熔断降级
- 可扩展 - 插件化设计,灵活插拔
- 可观测 - 完整日志、指标、追踪