08. API 网关设计与实践

API 网关核心功能、Kong vs APISIX vs Spring Cloud Gateway 对比、限流/路由/认证/插件化架构

API 网关是微服务架构的"门面",统一管理入口流量,提供路由、认证、限流、日志等功能。本文对比主流网关方案并给出实践指南。

1. 核心功能

功能说明
路由根据 URL/Header/参数转发到不同服务
负载均衡轮询、权重、一致性哈希
认证鉴权JWT/OAuth2/API Key 验证
限流熔断防止后端被压垮
协议转换HTTP ↔ gRPC、REST ↔ GraphQL
日志监控请求日志、链路追踪
灰度发布按权重/用户/IP 分流

2. 方案对比

特性KongAPISIXSpring Cloud GatewayNginx
架构OpenResty (Lua)OpenResty (Lua)Java (Reactor)C
性能极高极高
插件生态丰富极丰富Spring 生态模块
动态配置支持无需重启需重启需 reload
K8s 集成支持原生 Ingress一般需适配
控制面板Kong ManagerDashboard无原生
多语言插件Lua/GoLua/Go/Python/WASMJavaC/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. 网关设计要点

  1. 无状态化:网关本身无状态,方便水平扩展
  2. 异步非阻塞:使用 Netty/Reactor 处理高并发
  3. 插件化:核心精简,功能通过插件扩展
  4. 热更新:配置变更无需重启
  5. 熔断降级:保护后端服务
  6. 日志脱敏:敏感信息不记录

总结

场景推荐
K8s 原生高可用网关APISIX
企业级 API 管理Kong Enterprise
Spring Cloud 生态Spring Cloud Gateway
超高性能静态/反向代理Nginx/OpenResty
ServerlessAWS API Gateway / 阿里云 APIG

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「distributed-systems」更多文章

  1. 分布式高可用架构模式:多活、容灾、降级与 K8s 编排高可用
  2. 分布式链路追踪实战:OpenTelemetry、Jaeger 与 W3C Trace Context
  3. 分布式缓存深度策略:Redis Cluster、一致性哈希与多级缓存架构