Mark Ku's Blog

Kong 是什麼?

Kong 是一套基於 Nginx 和 OpenResty 的高效能 API Gateway,核心以 Lua 編寫,具備反向代理、API 管理與套件管理及擴充的應用,同時也繼承了Nginx 優點及特性,Kong 主要採用的資料是PostgreSQL 來儲存相關設定,也支援無資料庫(DB-less)模式,本身就提供Restful api 管理,非常適合 API 單一入口及API訂閱的場景。

Kong 可以做什麼?

  • 負載平衡(反向代理)
  • 統一 API 進入點(API Gateway)
  • 支援多環境與版本部署
  • API 使用統計與計費
  • 安全驗證(API Key、JWT、OAuth2 等)

核心特性

  • 管理與部署 RESTful API 變得簡單高效
  • 支援 API 版本控管與權限驗證
  • 可依使用者等級設定請求限制(Rate Limiting)
  • 變更設定時,基於 Nginx 架構無須重啟服務
  • 強大的插件機制,可擴充功能或自訂開發

官方文件

https://docs.konghq.com/gateway/latest/


類似工具

  • Apache APISIX
  • Tyk
  • NGINX Plus(商用)

佈署 Kong Api Gateway(Docker with db 版)

version: '3.8'

services:
  kong-database:
    image: postgres:13
    container_name: kong-database
    environment:
      POSTGRES_USER: kong
      POSTGRES_DB: kong
      POSTGRES_PASSWORD: kong
    ports:
      - "5432:5432"

  kong-migrations:
    image: kong:3.6.0
    command: kong migrations bootstrap
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-database
      KONG_PG_PASSWORD: kong
    depends_on:
      - kong-database

  kong:
    image: kong:3.6.0
    container_name: kong
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-database
      KONG_PG_PASSWORD: kong
      KONG_ADMIN_LISTEN: 0.0.0.0:8001
      KONG_ADMIN_GUI_URL: http://localhost:8002
      KONG_ADMIN_GUI_API_URL: http://localhost:8001
    ports:
      - "8000:8000"   # Proxy
      - "8443:8443"   # Proxy SSL
      - "8001:8001"   # Admin API
      - "8002:8002"   # Kong Dashboard
    depends_on:
      - kong-database
      - kong-migrations

啟動指令:

docker-compose up -d

開啟 Dashboard: http://localhost:8002 Dashboard

預設就安裝了很多方便套件,不夠時也能自己做擴充 Plugins


常用 Port 說明

Port用途協定描述
8000Proxy (HTTP)HTTP外部 API 請求入口
8443Proxy (HTTPS)HTTPS加密請求入口
8001Admin APIHTTP管理路由、服務、插件等
8002Kong DashboardHTTP圖形化管理介面

快速測試 - 建立反向代理

建立服務:

POST http://localhost:8001/services
Content-Type: application/json

{
  "name": "my-service",
  "url": "https://blog.markkulab.net/"
}

建立路由:

POST http://localhost:8001/services/my-service/routes
Content-Type: application/json

{
  "paths": ["/blog"]
}

測試結果:

http://localhost:8000/blog -> https://blog.markkulab.net/

負載平衡策略

策略名稱說明開源支援
Round-robin輪詢分配請求✅
Weighted round-robin按權重分配請求✅
Least-connections連線數最少優先❌(需企業版)

補充:

  • 支援健康檢查,自動排除故障節點
  • 支援 DNS 動態發現 target

進階補充:

  • 健康檢查:Kong 內建健康檢查機制,能自動偵測後端服務狀態,異常時自動排除,恢復後自動加入。
  • 動態目標發現:支援 DNS 動態解析,後端服務 IP 變動時無需重啟 Kong。
  • 多目標(Targets)管理:可針對同一服務設定多個目標,並動態調整權重。

請求速率限制(Rate Limiting)

透過 Consumer 與 Key Auth 搭配 Rate Limiting 插件,可根據用戶等級設定頻率。

等級限制
基礎會員每分鐘 5 次
銅級每秒 5 次
銀級每秒 10 次
金級每秒 30 次
白金級/專案每秒 50 次

基本流程:

  1. 建立 Consumer
  2. 建立 key-auth 憑證
  3. 套用 rate-limiting 插件

範例:

curl -i -X POST http://localhost:8001/consumers \
  --data "username=gold"

curl -i -X POST http://localhost:8001/consumers/gold/key-auth

POST /consumers/gold/plugins
{
  "name": "rate-limiting",
  "config": {
    "second": 30,
    "policy": "local"
  }
}
...

API 請求時帶上 key:

GET /your-api
apikey: <your-key>

進階補充:

  • 多種策略:支援 local(本地)、cluster(叢集)、redis(外部 Redis)等多種儲存策略,適合不同規模需求。
  • 自訂回應:可自訂超出限制時的回應訊息與 HTTP 狀態碼。
  • 搭配身份驗證:建議與 key-auth、JWT 等插件搭配,針對不同用戶群組設不同限制。

性能與壓力測試

官方實測:單台 8 vCPU 機器,QPS 可達 10~20 萬,延遲低於 10ms。

詳細報告:Kong Gateway Performance Benchmark

更大流量場景建議考慮硬體設備(如 F5)。


高可用架構(HA)

       ┌──────────────┐
     │ LoadBalancer │
     └─────┬────────┘
      ┌────┴───────┐
 ┌────▼────┐   ┌────▼────┐
 │ Kong #1 │...│ Kong #N │
 └────┬────┘   └────┬────┘
      └────┬────┬───┘
           │    │
       ┌─────────────┐
       │ PostgreSQL  │
       └─────────────┘

進階補充:

  • 資料庫高可用:PostgreSQL 建議採用主從複寫或叢集方案,避免單點故障。
  • 多 Kong 節點:可橫向擴展 Kong 節點,配合 Load Balancer 實現高可用與彈性擴充。
  • 設定同步:Kong 節點間設定自動同步,確保 API 管理一致性。

壓測工具:K6

安裝:

npm install -g k6

測試腳本:

import http from 'k6/http';
import { sleep } from 'k6';

export default function () {
  http.get('http://localhost:8000/v1/users');
  sleep(1);
}

執行:

k6 run script.js

導入遇到的問題

1.一個(路由) 只能有一個設定,但可以透過 route prefix 繞開 2.合併計算流的部份子系統的域名後面拿到不同,就得拆一個流量計算

延伸閱讀與資源

作者

Mark Ku

10 年以上的軟體工程師,做過北美電商與 AI SaaS 訂閱收費系統。閱讀更多

覺得這篇有幫助?

作者做的免費工具、每日 Podcast 與電子報,都在這裡。

Mark Ku · 本文採用 CC BY 4.0 授權,轉載請註明作者並附上原文連結。

留言

訂閱電子報

訂閱後即時收到新文章通知,不錯過任何技術分享。

提交即表示同意接收電子報,隨時可。

站長的公司

Vibe Coding 架構規劃與陪跑

團隊已經用 AI 做出小工具,卻怕壞了沒人修、需求一變就不敢改?226 Network 幫你把程式放進 Git、密碼另外保管、排程搬上固定主機,再補上交接文件與測試。

熱門文章

View all
Mark Ku
··631

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案
Mark Ku
··471

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南
Mark Ku
··265

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略
Mark Ku
··216

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1
Mark Ku
··208

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取
Mark Ku
··207

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調