微服務架構下,服務拆分後會面臨一堆麻煩:每個服務都要處理認證、限流、日誌,客户端要記一堆服務地址,跨服務調用還容易出現兼容性問題。直到引入 Kong 網關,這些問題才迎刃而解——它就像微服務的“統一入口”,所有請求先經過 Kong,再轉發到對應服務,集中處理認證、限流、監控等通用功能,讓業務服務專注於核心邏輯。Kong 基於 Nginx 開發,性能強悍,配置靈活,是微服務架構中 API 網關的首選方案之一。

一、核心認知:Kong 是什麼?

Kong 是一款基於 Nginx 和 OpenResty 的開源 API 網關,核心定位是“流量入口的統一管控”。它的核心價值的體現在三個方面:

  1. 路由轉發:根據請求路徑、域名等規則,將請求轉發到對應的微服務;
  2. 通用功能集成:通過插件機制,一鍵啓用認證、限流、日誌、監控等功能,無需業務服務編碼;
  3. 高可用與高性能:基於 Nginx 內核,支持高併發,可集羣部署,穩定性強。

簡單説,Kong 就像微服務集羣的“保安兼管家”:所有外部請求必須先經過它,由它負責“身份驗證”(認證)、“流量控制”(限流)、“記錄來訪”(日誌),再把合法請求“引導”到對應的服務,同時還能監控整個流量情況。

二、快速上手:Kong 安裝與基礎配置

Kong 支持 Docker 部署,快速體驗門檻極低,以下是單機部署與基礎路由配置。

1. Docker 部署 Kong(含 PostgreSQL)

Kong 需要數據庫存儲配置(支持 PostgreSQL 或 Cassandra),用 Docker Compose 一鍵部署:

# docker-compose.yml
version: '3'
services:
  # PostgreSQL 數據庫(存儲 Kong 配置)
  postgres:
    image: postgres:14-alpine
    environment:
      POSTGRES_USER: kong
      POSTGRES_PASSWORD: kong
      POSTGRES_DB: kong
    volumes:
      - postgres-data:/var/lib/postgresql/data
    restart: always

  # Kong 網關
  kong:
    image: kong:3.6-alpine
    depends_on:
      - postgres
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: postgres
      KONG_PG_USER: kong
      KONG_PG_PASSWORD: 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: 0.0.0.0:8001  # 管理 API 端口
      KONG_ADMIN_GUI_URL: http://localhost:8002  # 管理界面端口
    ports:
      - "8000:8000"  # 代理端口(接收客户端請求)
      - "8443:8443"  # HTTPS 代理端口
      - "8001:8001"  # 管理 API 端口
      - "8002:8002"  # 管理界面端口
    restart: always

volumes:
  postgres-data:

啓動服務:

docker-compose up -d

驗證部署成功:

# 訪問管理 API,返回 Kong 信息
curl http://localhost:8001/

2. 基礎路由配置(轉發請求)

假設已有一個用户服務(user-service)運行在 http://192.168.1.10:8080,通過 Kong 配置路由,讓客户端通過 http://localhost:8000/user 訪問該服務。

(1)添加服務(Service)

Service 是 Kong 中對後端微服務的抽象,先定義服務地址:

# 添加 user-service 服務
curl -X POST http://localhost:8001/services \
  --data "name=user-service" \
  --data "url=http://192.168.1.10:8080"
(2)添加路由(Route)

Route 定義請求匹配規則,將符合規則的請求轉發到對應的 Service:

# 為 user-service 添加路由:/user 路徑開頭的請求轉發到該服務
curl -X POST http://localhost:8001/services/user-service/routes \
  --data "name=user-route" \
  --data "paths[]=/user" \
  --data "methods[]=GET" \
  --data "methods[]=POST"  # 只允許 GET/POST 請求
(3)測試路由轉發

客户端訪問 Kong 代理端口,驗證是否轉發成功:

# 訪問 user-service 的 /user/info 接口(通過 Kong 轉發)
curl http://localhost:8000/user/info?userId=123
# 成功返回 user-service 的響應結果

三、核心功能配置:插件的使用

Kong 的強大之處在於插件機制,無需修改業務代碼,通過配置插件就能實現通用功能。以下是最常用的 3 個插件配置。

1. 認證插件:Key Auth(API 密鑰認證)

防止服務被非法訪問,只有攜帶合法 API 密鑰的請求才能通過。

(1)啓用 Key Auth 插件(全局或服務級)

為 user-service 啓用 Key Auth 插件:

curl -X POST http://localhost:8001/services/user-service/plugins \
  --data "name=key-auth" \
  --data "config.key_names[]=api-key"  # 自定義密鑰參數名(默認是 apikey)
(2)創建消費者(Consumer)並分配 API 密鑰

每個客户端對應一個 Consumer,分配獨立的 API 密鑰:

# 1. 創建消費者(比如名為 client-app)
curl -X POST http://localhost:8001/consumers \
  --data "username=client-app"

# 2. 為消費者分配 API 密鑰
curl -X POST http://localhost:8001/consumers/client-app/key-auth \
  --data "key=abc123xyz"  # 自定義密鑰(客户端需攜帶該值)
(3)測試認證效果
  • 未攜帶密鑰的請求(被拒絕):
curl http://localhost:8000/user/info?userId=123
# 響應:{"message":"No API key found in request"}
  • 攜帶合法密鑰的請求(通過):
curl http://localhost:8000/user/info?userId=123 -H "api-key: abc123xyz"
# 成功返回響應

2. 限流插件:Rate Limiting(接口限流)

限制客户端單位時間內的請求次數,避免服務被流量壓垮。

為 user-service 啓用限流插件:

curl -X POST http://localhost:8001/services/user-service/plugins \
  --data "name=rate-limiting" \
  --data "config.minute=60"  # 每分鐘最多 60 次請求 \
  --data "config.policy=local"  # 單機限流(集羣用 redis 策略) \
  --data "config.key=consumer"  # 按消費者限流(也可按 IP、API 等)

測試限流效果(1 分鐘內發送 61 次請求):

# 第 61 次請求會被拒絕
curl http://localhost:8000/user/info?userId=123 -H "api-key: abc123xyz"
# 響應:{"message":"API rate limit exceeded"}

3. 日誌插件:File Log(日誌記錄)

將請求日誌記錄到文件,便於排查問題。

為 user-service 啓用文件日誌插件:

curl -X POST http://localhost:8001/services/user-service/plugins \
  --data "name=file-log" \
  --data "config.path=/var/log/kong/user-service.log"  # 日誌文件路徑

查看日誌(進入 Kong 容器):

# 進入 Kong 容器
docker exec -it <kong-container-id> sh

# 查看日誌文件
tail -f /var/log/kong/user-service.log

日誌包含請求路徑、方法、響應時間、狀態碼等信息,便於問題排查。

四、性能優化:讓 Kong 跑得更快

Kong 基於 Nginx ,本身性能優異,但通過合理配置可進一步提升併發能力和響應速度,以下是生產環境必備的優化項。

1. 調整 Nginx 核心參數

Kong 的底層是 Nginx,修改 Nginx 配置文件(kong.conf)優化性能:

# 進入 Kong 容器,編輯配置文件
vi /etc/kong/kong.conf

關鍵優化參數:

# 工作進程數(建議等於 CPU 核心數)
worker_processes auto;

# 每個工作進程的最大連接數
worker_connections 16384;

# 啓用 epoll 事件模型(Linux 環境最優)
use epoll;

# 連接超時時間(避免長時間佔用連接)
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;

# 禁用緩衝(減少延遲,適合 API 場景)
proxy_buffering off;

# 啓用 TCP 快速打開(減少握手延遲)
tcp_nopush on;
tcp_nodelay on;

重啓 Kong 生效:

docker-compose restart kong

2. 啓用緩存與連接複用

(1)啓用響應緩存(Plugin: Response Cache)

對高頻訪問、變化少的接口啓用緩存,減少後端服務壓力:

curl -X POST http://localhost:8001/services/user-service/plugins \
  --data "name=response-cache" \
  --data "config.ttl=60"  # 緩存有效期 60 秒 \
  --data "config.cache_key=request_uri"  # 按請求 URI 緩存
(2)啓用 Keepalive 連接複用

Kong 與後端服務保持長連接,減少 TCP 握手開銷:

# 修改 Kong 配置,啓用 Keepalive
echo 'proxy_http_version 1.1; proxy_set_header Connection "";' >> /etc/kong/nginx-kong.conf

3. 集羣部署與負載均衡

單機性能有限,生產環境需部署 Kong 集羣,配合負載均衡(如 Nginx、雲廠商 LB)分發流量。

(1)Kong 集羣配置

多台 Kong 服務器連接同一個 PostgreSQL 數據庫(配置同步),每台 Kong 配置:

# docker-compose.yml 新增配置
environment:
  KONG_CLUSTER_ADVERTISE: 192.168.1.20:7946  # 本機 IP:集羣通信端口
  KONG_CLUSTER_LISTEN: 0.0.0.0:7946
(2)前端負載均衡(Nginx 示例)

用 Nginx 作為 Kong 集羣的負載均衡器:

http {
  upstream kong_cluster {
    server 192.168.1.20:8000;  # Kong 節點 1
    server 192.168.1.21:8000;  # Kong 節點 2
    server 192.168.1.22:8000;  # Kong 節點 3
    least_conn;  # 按最少連接數分發
  }

  server {
    listen 80;
    server_name api.example.com;

    location / {
      proxy_pass http://kong_cluster;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}

4. 禁用不必要的插件

插件會增加性能開銷,生產環境只啓用必需的插件(如認證、限流),禁用無用插件:

# 查看已啓用的插件
curl http://localhost:8001/plugins

# 刪除無用插件(替換為插件 ID)
curl -X DELETE http://localhost:8001/plugins/<plugin-id>

五、避坑指南

1. 路由匹配優先級問題

多個路由規則可能衝突,Kong 按“最長路徑匹配”和“創建時間”排序,最長路徑優先。解決:

  • 為精確路徑配置更長的路由(如 /user/info 優先於 /user);
  • 通過 config.priority 參數手動設置優先級(值越大優先級越高)。

2. 數據庫性能瓶頸

Kong 所有配置存儲在數據庫,高併發下數據庫可能成為瓶頸。解決:

  • 生產環境使用 PostgreSQL 主從複製,提高讀性能;
  • 啓用 Kong 配置緩存(kong.confdatabase_cache_expiration 設置緩存時間)。

3. 後端服務健康檢查缺失

Kong 默認不檢查後端服務狀態,服務故障時仍會轉發請求。解決: 啓用健康檢查插件:

curl -X POST http://localhost:8001/services/user-service/plugins \
  --data "name=health-check" \
  --data "config.active.http_path=/actuator/health" \
  --data "config.active.interval=10"  # 每 10 秒檢查一次

4. 未啓用 HTTPS 導致安全風險

生產環境必須啓用 HTTPS,避免請求被劫持。解決:

  • 上傳 SSL 證書到 Kong:
curl -X POST http://localhost:8001/certificates \
  --form "cert=@/path/to/cert.pem" \
  --form "key=@/path/to/key.pem" \
  --form "snis=api.example.com"
  • 路由強制跳轉 HTTPS(啓用 Redirect HTTPS 插件)。

總結

Kong 作為微服務 API 網關,核心優勢是“高性能+高靈活度”,通過 Service+Route+Plugin 的架構,實現了請求轉發、認證、限流等通用功能的集中管控,讓業務服務聚焦核心邏輯。

實戰部署建議:

  1. 單機測試用 Docker 快速部署,生產環境採用“Kong 集羣+PostgreSQL 主從+前端 LB”架構;
  2. 插件按需啓用,優先使用官方插件,避免自定義插件影響性能;
  3. 性能優化重點關注 Nginx 核心參數、連接複用和緩存配置;
  4. 生產環境必須啓用 HTTPS、健康檢查和日誌記錄,保障安全性和可觀測性。

掌握 Kong 的配置與優化後,微服務的流量管理會變得井然有序,無論是接口認證、流量控制還是問題排查,都能高效應對。它是微服務架構中“降本增效”的關鍵組件,也是後端架構師必備的技術工具。