490 words
2 minutes
如何设计一套 API Gateway 网关系统

API Gateway 是微服务架构的入口,设计好网关至关重要

核心功能#

┌─────────────────────────────────────────────┐
│ API Gateway │
├─────────────────────────────────────────────┤
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │路由转发 │ │认证授权 │ │限流熔断 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │日志监控 │ │协议转换 │ │负载均衡 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────┘

1. 请求路由#

routes.yaml
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/(.*) -> /$1

2. 认证授权#

@Component
public 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);
}
// 配置限流规则
@Configuration
public class SentinelConfig {
@PostConstruct
public void init() {
FlowRuleManager.loadRules(
Arrays.asList(
new FlowRule("orderApi")
.setCount(100)
.setGrade(RuleConstant.FLOW_GRADE_QPS)
)
);
}
}

4. 日志与监控#

// 请求日志
@Component
public 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 GatewaySpring 生态集成简单性能一般
Kong性能高,插件丰富需要额外学习 Lua
APISIX高性能,云原生社区较小
Nginx高性能,稳定动态配置弱

总结#

设计 API Gateway 的核心要点:

  1. 高性能 - 网关是入口,延迟影响全局
  2. 高可用 - 多实例部署,熔断降级
  3. 可扩展 - 插件化设计,灵活插拔
  4. 可观测 - 完整日志、指标、追踪