微服務架構下,服務拆分後會面臨一堆麻煩:每個服務都要處理認證、限流、日誌,客户端要記一堆服務地址,跨服務調用還容易出現兼容性問題。直到引入 Kong 網關,這些問題才迎刃而解——它就像微服務的“統一入口”,所有請求先經過 Kong,再轉發到對應服務,集中處理認證、限流、監控等通用功能,讓業務服務專注於核心邏輯。Kong 基於 Nginx 開發,性能強悍,配置靈活,是微服務架構中 API 網關的首選方案之一。
一、核心認知:Kong 是什麼?
Kong 是一款基於 Nginx 和 OpenResty 的開源 API 網關,核心定位是“流量入口的統一管控”。它的核心價值的體現在三個方面:
- 路由轉發:根據請求路徑、域名等規則,將請求轉發到對應的微服務;
- 通用功能集成:通過插件機制,一鍵啓用認證、限流、日誌、監控等功能,無需業務服務編碼;
- 高可用與高性能:基於 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.conf中database_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 的架構,實現了請求轉發、認證、限流等通用功能的集中管控,讓業務服務聚焦核心邏輯。
實戰部署建議:
- 單機測試用 Docker 快速部署,生產環境採用“Kong 集羣+PostgreSQL 主從+前端 LB”架構;
- 插件按需啓用,優先使用官方插件,避免自定義插件影響性能;
- 性能優化重點關注 Nginx 核心參數、連接複用和緩存配置;
- 生產環境必須啓用 HTTPS、健康檢查和日誌記錄,保障安全性和可觀測性。
掌握 Kong 的配置與優化後,微服務的流量管理會變得井然有序,無論是接口認證、流量控制還是問題排查,都能高效應對。它是微服務架構中“降本增效”的關鍵組件,也是後端架構師必備的技術工具。