香港服务器搭建API网关:Kong Gateway + 限流 + JWT认证 + 多后端路由完整配置

香港服务器搭建API网关:Kong Gateway + 限流 + JWT认证 + 多后端路由完整配置

当业务系统拆分为多个微服务后,如何统一管理 API 的认证、限流、路由、日志?Kong Gateway 是目前最流行的开源 API 网关,通过插件体系可以在不修改业务代码的情况下为所有 API 添加认证、限流、监控等能力。本文在香港服务器上完成 Kong 的完整部署和配置。


一、Kong 架构

<code">
客户端请求
    │  HTTPS :443
    ▼
Kong Gateway(API 网关层)
    ├── 认证插件(JWT / Key-Auth / OAuth2)
    ├── 限流插件(Rate Limiting)
    ├── 日志插件(HTTP Log / File Log)
    └── 路由规则
         ├──→ 用户服务 :8001
         ├──→ 商品服务 :8002
         └──→ 订单服务 :8003

Kong Admin API :8444(管理接口,内网访问)
Konga(Web 管理控制台)

二、Docker Compose 部署 Kong

<code"># /opt/kong/docker-compose.yml
version: '3.8'

services:
  kong-db:
    image: postgres:15-alpine
    container_name: kong-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: kong
      POSTGRES_PASSWORD: kong_db_pass
      POSTGRES_DB: kong
    volumes:
      - kong_db_data:/var/lib/postgresql/data

  kong-migration:
    image: kong:3.6
    command: kong migrations bootstrap
    depends_on:
      - kong-db
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-db
      KONG_PG_USER: kong
      KONG_PG_PASSWORD: kong_db_pass
      KONG_PG_DATABASE: kong

  kong:
    image: kong:3.6
    container_name: kong
    restart: unless-stopped
    depends_on:
      - kong-db
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-db
      KONG_PG_USER: kong
      KONG_PG_PASSWORD: kong_db_pass
      KONG_PG_DATABASE: kong
      KONG_PROXY_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_PROXY_ERROR_LOG: /dev/stderr
      KONG_ADMIN_ERROR_LOG: /dev/stderr
      KONG_ADMIN_LISTEN: "127.0.0.1:8001, 127.0.0.1:8444 ssl"
      KONG_PROXY_LISTEN: "0.0.0.0:8000, 0.0.0.0:8443 ssl"
    ports:
      - "80:8000"
      - "443:8443"
      - "127.0.0.1:8001:8001"
      - "127.0.0.1:8444:8444"
    volumes:
      - kong_data:/usr/local/kong

  konga:
    image: pantsel/konga:latest
    container_name: konga
    restart: unless-stopped
    environment:
      NODE_ENV: production
      DB_ADAPTER: postgres
      DB_HOST: kong-db
      DB_USER: kong
      DB_PASSWORD: kong_db_pass
      DB_DATABASE: konga
    ports:
      - "127.0.0.1:1337:1337"
    depends_on:
      - kong-db

volumes:
  kong_db_data:
  kong_data:
<code"># 初始化并启动
cd /opt/kong
docker compose up -d kong-db kong-migration
sleep 10   # 等待数据库迁移完成
docker compose up -d kong konga

# 验证 Kong 启动
curl http://localhost:8001/   # 返回 Kong 版本信息

三、创建 Service 和 Route

<code"># 通过 Kong Admin API 配置(或在 Konga 界面操作)

# 1. 创建上游服务(用户服务)
curl -X POST http://localhost:8001/services \
  -d name=user-service \
  -d url=http://user-backend:8001

# 2. 为该服务创建路由
curl -X POST http://localhost:8001/services/user-service/routes \
  -d "paths[]=/api/v1/users" \
  -d "methods[]=GET" \
  -d "methods[]=POST" \
  -d strip_path=false

# 3. 创建商品服务和路由
curl -X POST http://localhost:8001/services \
  -d name=product-service \
  -d url=http://product-backend:8002

curl -X POST http://localhost:8001/services/product-service/routes \
  -d "paths[]=/api/v1/products" \
  -d "methods[]=GET" \
  -d "methods[]=POST" \
  -d "methods[]=PUT" \
  -d "methods[]=DELETE"

四、JWT 认证插件

<code"># 为用户服务启用 JWT 认证
curl -X POST http://localhost:8001/services/user-service/plugins \
  -d name=jwt \
  -d "config.claims_to_verify[]=exp" \
  -d "config.key_claim_name=iss"

# 创建 JWT Consumer 和密钥
curl -X POST http://localhost:8001/consumers \
  -d username=api-client-1

curl -X POST http://localhost:8001/consumers/api-client-1/jwt \
  -d algorithm=HS256 \
  -d key=my-jwt-issuer \
  -d secret=my-jwt-secret-key
<code"># Python 生成 JWT Token(客户端使用)
import jwt, time

payload = {
    'iss': 'my-jwt-issuer',        # 必须与 Kong 配置的 key 一致
    'exp': int(time.time()) + 3600, # 1小时过期
    'sub': 'user-123',
    'roles': ['admin']
}

token = jwt.encode(payload, 'my-jwt-secret-key', algorithm='HS256')
print(f"Authorization: Bearer {token}")

# 使用 Token 调用 API
import requests
headers = {'Authorization': f'Bearer {token}'}
r = requests.get('https://yourdomain.com/api/v1/users', headers=headers)
print(r.json())

五、限流插件(Rate Limiting)

<code"># 全局限流(对所有 API 生效)
curl -X POST http://localhost:8001/plugins \
  -d name=rate-limiting \
  -d "config.minute=100" \     # 每分钟最多100次
  -d "config.hour=1000" \      # 每小时最多1000次
  -d "config.policy=redis" \   # 使用 Redis 存储计数(支持多实例)
  -d "config.redis_host=redis" \
  -d "config.redis_port=6379"

# 针对特定 Consumer 设置更高限额(VIP 用户)
curl -X POST http://localhost:8001/consumers/vip-client/plugins \
  -d name=rate-limiting \
  -d "config.minute=1000" \
  -d "config.hour=10000" \
  -d "config.policy=redis" \
  -d "config.redis_host=redis"

六、日志插件配置

<code"># HTTP Log 插件(将请求日志发送到日志收集服务)
curl -X POST http://localhost:8001/plugins \
  -d name=http-log \
  -d "config.http_endpoint=http://你的日志收集服务:9000/kong-logs" \
  -d "config.method=POST" \
  -d "config.timeout=10000" \
  -d "config.keepalive=60000"

# File Log 插件(写入本地文件)
curl -X POST http://localhost:8001/plugins \
  -d name=file-log \
  -d "config.path=/var/log/kong/access.log"

七、总结

Kong Gateway 为微服务架构提供了统一的 API 管理层,将认证、限流、日志等横切关注点从业务代码中抽离,显著降低了各服务的开发复杂度。香港服务器的稳定性确保了 API 网关这一关键基础设施的高可用,建议搭配第二阶段文章5的 Prometheus 监控方案对 Kong 的 QPS、延迟和错误率进行实时监控。



Telegram