API 网关是微服务架构的"门面",统一管理入口流量,提供路由、认证、限流、日志等功能。本文对比主流网关方案并给出实践指南。
1. 核心功能
| 功能 | 说明 |
|---|---|
| 路由 | 根据 URL/Header/参数转发到不同服务 |
| 负载均衡 | 轮询、权重、一致性哈希 |
| 认证鉴权 | JWT/OAuth2/API Key 验证 |
| 限流熔断 | 防止后端被压垮 |
| 协议转换 | HTTP ↔ gRPC、REST ↔ GraphQL |
| 日志监控 | 请求日志、链路追踪 |
| 灰度发布 | 按权重/用户/IP 分流 |
2. 方案对比
| 特性 | Kong | APISIX | Spring Cloud Gateway | Nginx |
|---|---|---|---|---|
| 架构 | OpenResty (Lua) | OpenResty (Lua) | Java (Reactor) | C |
| 性能 | 高 | 极高 | 中 | 极高 |
| 插件生态 | 丰富 | 极丰富 | Spring 生态 | 模块 |
| 动态配置 | 支持 | 无需重启 | 需重启 | 需 reload |
| K8s 集成 | 支持 | 原生 Ingress | 一般 | 需适配 |
| 控制面板 | Kong Manager | Dashboard | 无原生 | 无 |
| 多语言插件 | Lua/Go | Lua/Go/Python/WASM | Java | C/Lua |
3. APISIX 实践
3.1 路由配置
# 路由:匹配 /api/users/* 转发到 user-service
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: user-route
spec:
http:
- name: user-api
match:
hosts:
- api.example.com
paths:
- /api/users/*
backends:
- serviceName: user-service
servicePort: 8080
plugins:
- name: limit-count
enable: true
config:
count: 1000
time_window: 60
rejected_code: 429
- name: jwt-auth
enable: true
3.2 限流插件
# 令牌桶限流
curl http://apisix-admin:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/api/*",
"plugins": {
"limit-req": {
"rate": 100,
"burst": 50,
"rejected_code": 429
},
"limit-count": {
"count": 1000,
"time_window": 60,
"key": "consumer_name"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"10.0.0.1:8080": 1,
"10.0.0.2:8080": 1
}
}
}'
3.3 灰度发布
# 按流量比例灰度
curl http://apisix-admin:9180/apisix/admin/routes/2 -X PUT -d '
{
"uri": "/app/*",
"plugins": {
"traffic-split": {
"rules": [
{
"weighted_upstreams": [
{"upstream": {"name": "upstream_v1", "nodes": {"10.0.0.1:8080": 1}}, "weight": 90},
{"upstream": {"name": "upstream_v2", "nodes": {"10.0.0.2:8080": 1}}, "weight": 10}
]
}
]
}
}
}'
4. Spring Cloud Gateway 实践
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("user-service", r -> r
.path("/api/users/**")
.filters(f -> f
.stripPrefix(2)
.circuitBreaker(config -> config
.setName("userCircuitBreaker")
.setFallbackUri("forward:/fallback/user"))
.requestRateLimiter(rate -> rate
.setRateLimiter(redisRateLimiter())
.setKeyResolver(userKeyResolver())))
.uri("lb://user-service"))
.route("order-service", r -> r
.path("/api/orders/**")
.filters(f -> f.stripPrefix(2))
.uri("lb://order-service"))
.build();
}
@Bean
public KeyResolver userKeyResolver() {
return exchange -> Mono.just(
exchange.getRequest().getHeaders().getFirst("X-User-Id")
);
}
}
// 全局过滤器:认证
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null || !jwtUtil.validate(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override public int getOrder() { return -100; }
}
5. 网关设计要点
- 无状态化:网关本身无状态,方便水平扩展
- 异步非阻塞:使用 Netty/Reactor 处理高并发
- 插件化:核心精简,功能通过插件扩展
- 热更新:配置变更无需重启
- 熔断降级:保护后端服务
- 日志脱敏:敏感信息不记录
总结
| 场景 | 推荐 |
|---|---|
| K8s 原生高可用网关 | APISIX |
| 企业级 API 管理 | Kong Enterprise |
| Spring Cloud 生态 | Spring Cloud Gateway |
| 超高性能静态/反向代理 | Nginx/OpenResty |
| Serverless | AWS API Gateway / 阿里云 APIG |
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。