- บทนำ
- วัตถุประสงค์
- 1. API Gateway คืออะไร
- 2. หน้าที่สำคัญของ API Gateway
- 3. Architecture ของ Workshop
- 4. สิ่งที่ต้องเตรียม
- 5. สร้าง Backend Services
- 6. กำหนด Kong Gateway
- 7. เริ่มต้นระบบ
- 8. ตรวจสอบ Kong Admin API
- 9. ทดสอบ Routing
- 10. ทดสอบ Load Balancing
- 11. เพิ่ม Rate Limiting
- 12. ตรวจสอบ Header
- 13. ทดลองปิด Backend หนึ่งตัว
- 14. แก้ไข Configuration
- 15. เพิ่ม Route ใหม่
- 16. API Gateway กับ Reverse Proxy ต่างกันอย่างไร
- 17. API Gateway ใน Microservices
- 18. Security ที่ควรพิจารณา
- 19. Observability
- 20. Production Checklist
- 21. แบบฝึกหัดเพิ่มเติม
- 22. คำสั่งที่ใช้บ่อย
- 23. สรุป
- แหล่งศึกษาเพิ่มเติม
#บทนำ
ในระบบสมัยใหม่ โดยเฉพาะสถาปัตยกรรมแบบ Microservices เรามักมี Backend API หลายบริการ เช่น User Service, Product Service และ Order Service หาก Client ต้องเชื่อมต่อแต่ละบริการโดยตรง จะทำให้การจัดการ URL, Security, Rate Limiting, Logging และ Load Balancing ซับซ้อนขึ้น
API Gateway ช่วยแก้ปัญหานี้ด้วยการทำหน้าที่เป็น Single Entry Point สำหรับ Client ก่อนส่ง Request ไปยัง Backend Service ที่เหมาะสม
Workshop นี้ใช้ Kong Gateway แบบ DB-less, Docker Compose และ API
จำลองด้วย httpbin เพื่อให้เห็นแนวคิดสำคัญโดยไม่ต้องสร้าง Backend Application ก่อน
#วัตถุประสงค์
เมื่อจบ Workshop ผู้อ่านจะสามารถ
- อธิบายหน้าที่ของ API Gateway ได้
- ติดตั้ง Kong Gateway ด้วย Docker Compose
- กำหนด Service และ Route
- Routing Request จาก Gateway ไป Backend
- ทำ Load Balancing ระหว่าง Backend หลาย Instance
- เพิ่ม Rate Limiting
- ตรวจสอบ Gateway ผ่าน Admin API
- ทดสอบระบบด้วย
curl - เข้าใจแนวทางต่อยอดไปสู่ Authentication, Observability และ Production
#1. API Gateway คืออะไร
API Gateway เป็นชั้นกลางระหว่าง Client และ Backend Services
+------------------+
Web / Mobile ------>| |----> User Service
Frontend ---------->| API Gateway |----> Order Service
External Client --->| |----> Product Service
+------------------+
|
Routing / Security
Rate Limiting
Load Balancing
Logging / Metrics
Client ไม่จำเป็นต้องรู้ว่า Backend จริงทำงานอยู่ที่ Host หรือ Port ใด แต่เรียก API ผ่าน Gateway เช่น
http://localhost:8000/api
Gateway จะรับ Request และเลือก Upstream ที่เหมาะสม
#2. หน้าที่สำคัญของ API Gateway
#Routing
กำหนดว่า URL แต่ละ Path ต้องส่ง Request ไปที่ Service ใด
/users -> User Service
/products -> Product Service
/orders -> Order Service
#Authentication และ Authorization
Gateway สามารถตรวจสอบ Credential ก่อนอนุญาตให้ Request ผ่านไปยัง Backend เช่น
- API Key
- Basic Authentication
- JWT
- OAuth 2.0 / OpenID Connect
#Rate Limiting
จำกัดจำนวน Request ที่ Client สามารถส่งเข้ามาในช่วงเวลาหนึ่ง เพื่อลด Abuse และช่วยป้องกัน Backend จาก Traffic ที่มากเกินไป
#Load Balancing
กระจาย Request ไปยัง Backend หลาย Instance
API Gateway
|
+----> API #1
+----> API #2
+----> API #3
#Observability
Gateway เป็นจุดที่เหมาะสำหรับเก็บข้อมูล เช่น
- Access Log
- Request Count
- Response Time
- HTTP Status Code
- Error Rate
#3. Architecture ของ Workshop
เราจะสร้างระบบดังนี้
http://localhost:8000
|
v
+----------------+
| Kong Gateway |
+----------------+
|
v
+----------------+
| Upstream |
| backend-pool |
+----------------+
| |
v v
+----------+ +----------+
| backend1 | | backend2 |
| httpbin | | httpbin |
+----------+ +----------+
Kong Proxy เปิดที่ Port 8000 และ Kong Admin API เปิดที่ Port 8001
Admin API ใน Workshop เปิดให้เข้าจากเครื่อง Host เพื่อการเรียนรู้เท่านั้น ใน Production ไม่ควรเปิด Admin API สู่ Public Internet โดยตรง
#4. สิ่งที่ต้องเตรียม
ตรวจสอบ Docker
docker --version
ตรวจสอบ Docker Compose
docker compose version
สร้างโฟลเดอร์ Workshop
mkdir api-gateway-workshop
cd api-gateway-workshop
โครงสร้างไฟล์
api-gateway-workshop/
├── docker-compose.yml
└── kong.yml
#5. สร้าง Backend Services
สร้างไฟล์ docker-compose.yml
services:
backend1:
image: kennethreitz/httpbin
networks:
- gateway-network
backend2:
image: kennethreitz/httpbin
networks:
- gateway-network
kong:
image: kong:3
environment:
KONG_DATABASE: "off"
KONG_DECLARATIVE_CONFIG: /kong/declarative/kong.yml
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
volumes:
- ./kong.yml:/kong/declarative/kong.yml:ro
ports:
- "8000:8000"
- "8001:8001"
depends_on:
- backend1
- backend2
networks:
- gateway-network
networks:
gateway-network:
driver: bridge
ใน Workshop นี้ Backend ทั้งสองตัวใช้ httpbin เพื่อให้ทดสอบ HTTP
Request/Response ได้ทันที
#6. กำหนด Kong Gateway
สร้างไฟล์ kong.yml
_format_version: "3.0"
services:
- name: demo-api
host: backend-upstream
port: 80
protocol: http
routes:
- name: demo-route
paths:
- /api
strip_path: true
plugins:
- name: rate-limiting
config:
minute: 10
policy: local
upstreams:
- name: backend-upstream
algorithm: round-robin
targets:
- target: backend1:80
weight: 100
- target: backend2:80
weight: 100
องค์ประกอบสำคัญคือ
Route
|
v
Service
|
v
Upstream
|
+--> Target backend1
|
+--> Target backend2
#7. เริ่มต้นระบบ
รัน
docker compose up -d
ตรวจสอบ Container
docker compose ps
ควรพบ Kong, backend1 และ backend2 ทำงานอยู่
ดู Log
docker compose logs -f kong
กด Ctrl+C เมื่อต้องการออกจากการดู Log
#8. ตรวจสอบ Kong Admin API
ทดสอบ
curl http://localhost:8001
ตรวจสอบ Service
curl http://localhost:8001/services
ตรวจสอบ Route
curl http://localhost:8001/routes
ตรวจสอบ Upstream
curl http://localhost:8001/upstreams
Admin API มีประโยชน์สำหรับการดู Configuration และสถานะของ Kong แต่ควรถูกจำกัดการเข้าถึงอย่างเข้มงวดในระบบจริง
#9. ทดสอบ Routing
เรียก API ผ่าน Gateway
curl http://localhost:8000/api/get
Flow คือ
curl
|
v
localhost:8000
|
v
Kong Route: /api
|
v
Service: demo-api
|
v
Upstream: backend-upstream
|
v
backend1 หรือ backend2
ทดสอบ POST
curl -X POST \
http://localhost:8000/api/post \
-H "Content-Type: application/json" \
-d '{"name":"Kong","type":"API Gateway"}'
#10. ทดสอบ Load Balancing
ใน Configuration เรากำหนด
upstreams:
- name: backend-upstream
algorithm: round-robin
และมี Target สองตัว
targets:
- target: backend1:80
- target: backend2:80
Kong จึงสามารถกระจาย Request ไปยัง Backend Pool ได้
ส่ง Request หลายครั้ง
for i in {1..10}
do
curl -s http://localhost:8000/api/get > /dev/null
echo "Request $i completed"
done
ดู Access Log ของ Backend
docker compose logs backend1
docker compose logs backend2
จะเห็น Request ถูกส่งไปยัง Backend ทั้งสอง Instance
#11. เพิ่ม Rate Limiting
เราได้กำหนด Plugin ไว้ที่ Service
plugins:
- name: rate-limiting
config:
minute: 10
policy: local
หมายความว่า Client จะถูกจำกัด Request ตามนโยบายที่กำหนด
ลองเรียกหลายครั้ง
for i in {1..15}
do
echo "Request $i"
curl -i http://localhost:8000/api/get
done
เมื่อเกิน Limit จะได้รับ HTTP Status ที่บ่งชี้ว่ามี Request มากเกินไป เช่น
HTTP/1.1 429 Too Many Requests
Rate Limiting เป็นกลไกสำคัญสำหรับ Public API และระบบที่ต้องควบคุมการใช้ Resource
#12. ตรวจสอบ Header
ลอง
curl -i http://localhost:8000/api/get
นอกจาก Response จาก Backend แล้ว Gateway/Plugin อาจเพิ่ม Header ที่เกี่ยวข้องกับการประมวลผลและ Rate Limit ซึ่งสามารถใช้ตรวจสอบพฤติกรรมของ Gateway ได้
#13. ทดลองปิด Backend หนึ่งตัว
ตรวจสอบชื่อ Container
docker compose ps
จากนั้นหยุด Backend หนึ่งตัว
docker compose stop backend1
ทดลองเรียก API
curl http://localhost:8000/api/get
การทดลองนี้ช่วยให้เห็นประเด็นสำคัญเรื่อง Availability, Health Checking และ Failure Handling ของระบบที่มีหลาย Backend
เปิด Backend กลับ
docker compose start backend1
ใน Production ควรกำหนด Active/Passive Health Checks และกลยุทธ์ Retry/Timeout ให้เหมาะกับระบบ ไม่ควรสมมติว่า Load Balancer เพียงอย่างเดียวจะแก้ Failure ได้ทุกกรณี
#14. แก้ไข Configuration
หากแก้ kong.yml วิธีที่ง่ายสำหรับ Workshop คือ Restart Kong
docker compose restart kong
ตรวจสอบ Log
docker compose logs kong
หาก Configuration ผิด Kong อาจไม่สามารถเริ่มต้นได้ ดังนั้นควรตรวจสอบ YAML indentation และชื่อ Plugin ให้ถูกต้อง
#15. เพิ่ม Route ใหม่
ตัวอย่างเพิ่ม Route /demo
services:
- name: demo-api
host: backend-upstream
port: 80
protocol: http
routes:
- name: api-route
paths:
- /api
strip_path: true
- name: demo-route
paths:
- /demo
strip_path: true
Restart Kong
docker compose restart kong
ทดสอบ
curl http://localhost:8000/demo/get
ทั้ง /api/get และ /demo/get จะสามารถส่งไปยัง Service เดียวกันได้
#16. API Gateway กับ Reverse Proxy ต่างกันอย่างไร
Reverse Proxy เน้นรับ Request แล้ว Forward ไป Backend ส่วน API Gateway มักเพิ่มความสามารถที่ออกแบบมาสำหรับ API Management โดยตรง
ความสามารถ Reverse Proxy API Gateway
Reverse Proxy ✓ ✓ Routing ✓ ✓ Load Balancing ✓ ✓ TLS Termination ✓ ✓ API Authentication ต้องคอนฟิก/เสริม ✓ Rate Limiting ขึ้นกับผลิตภัณฑ์ ✓ API-specific Plugin จำกัด ✓ Consumer Management ไม่ใช่หน้าที่หลัก ✓ API Analytics จำกัด ✓/ขึ้นกับผลิตภัณฑ์
เส้นแบ่งไม่ตายตัว เพราะผลิตภัณฑ์ Reverse Proxy บางตัวสามารถเพิ่มความสามารถจนทำงานคล้าย API Gateway ได้
#17. API Gateway ใน Microservices
ตัวอย่างระบบจริง
+------------------+
| API Gateway |
+------------------+
/ | \
/ | \
v v v
+---------+ +---------+ +---------+
| User API| |Order API| |Pay API |
+---------+ +---------+ +---------+
| | |
DB DB DB
Client ติดต่อ Gateway เพียงจุดเดียว
/api/users
/api/orders
/api/payments
Gateway จัดการ Routing ไปยัง Microservice ที่เกี่ยวข้อง
#18. Security ที่ควรพิจารณา
API Gateway ไม่ได้ทำให้ระบบปลอดภัยโดยอัตโนมัติ ควรออกแบบ Security หลายชั้น เช่น
Internet
|
v
Firewall / WAF
|
v
API Gateway
|
+-- TLS
+-- Authentication
+-- Authorization
+-- Rate Limiting
+-- Request Validation
|
v
Backend Services
แนวทางสำคัญ ได้แก่
- ใช้ HTTPS/TLS
- ไม่เปิด Admin API สู่ Internet
- ใช้ JWT/OAuth 2.0/OIDC ตาม Use Case
- เก็บ Secret ใน Secret Manager
- จำกัด Network Access ของ Backend
- Validate Input
- ตั้ง Timeout และ Request Size Limit
- เก็บ Audit/Access Logs
- Patch Gateway และ Plugin อย่างสม่ำเสมอ
#19. Observability
ใน Production ควรตรวจสอบอย่างน้อย
Request Rate
Latency
HTTP 4xx
HTTP 5xx
Upstream Latency
Gateway Latency
Rate-limit Rejections
Authentication Failures
Architecture ที่นิยมคือ
Client
|
v
Kong Gateway
|
+------> Backend API
|
+------> Metrics
|
v
Prometheus
|
v
Grafana
นอกจากนี้สามารถส่ง Log ไปยังระบบรวมศูนย์ เช่น OpenSearch/Elasticsearch หรือระบบ Observability อื่นได้
#20. Production Checklist
ก่อนนำ API Gateway ไปใช้งานจริง ควรตรวจสอบ
- [ ] เปิด HTTPS
- [ ] ปิดหรือจำกัด Admin API
- [ ] กำหนด Authentication
- [ ] กำหนด Authorization
- [ ] เปิด Rate Limiting
- [ ] ตั้ง Connection/Read/Write Timeout
- [ ] วาง Health Check Strategy
- [ ] กำหนด Logging
- [ ] เก็บ Metrics
- [ ] ตั้ง Alert
- [ ] จัดการ Secret อย่างปลอดภัย
- [ ] ทดสอบ Failure Scenario
- [ ] ทดสอบ Load/Performance
- [ ] Backup Configuration
- [ ] Version Control Configuration
- [ ] วางแผน Upgrade Gateway
#21. แบบฝึกหัดเพิ่มเติม
#Exercise 1 --- เพิ่ม Service
สร้าง Backend Service ตัวที่สาม แล้วเพิ่มเข้า backend-upstream
#Exercise 2 --- Route แยก Service
สร้าง
/users
/orders
/products
แล้ว Routing ไป Backend คนละตัว
#Exercise 3 --- ปรับ Rate Limit
เปลี่ยน Limit จาก
minute: 10
เป็น
minute: 5
แล้วทดสอบ HTTP 429
#Exercise 4 --- Authentication
เพิ่ม Authentication Plugin เช่น Key Authentication หรือ JWT แล้วเปรียบเทียบ Request ที่มีและไม่มี Credential
#Exercise 5 --- Observability
เชื่อม Kong กับ Prometheus และสร้าง Grafana Dashboard สำหรับ Request Rate, Latency และ Error Rate
#22. คำสั่งที่ใช้บ่อย
เริ่มระบบ
docker compose up -d
ดูสถานะ
docker compose ps
ดู Log
docker compose logs -f
Restart Gateway
docker compose restart kong
หยุดระบบ
docker compose down
ทดสอบ Proxy
curl http://localhost:8000/api/get
ตรวจสอบ Admin API
curl http://localhost:8001/services
#23. สรุป
API Gateway เป็นองค์ประกอบสำคัญของระบบ API และ Microservices เพราะทำให้สามารถรวม Cross-cutting Concerns ไว้ที่จุดกลาง เช่น Routing, Authentication, Rate Limiting, Load Balancing และ Observability
Workshop นี้แสดง Flow หลัก
Client
|
v
API Gateway
|
+-- Routing
+-- Rate Limiting
+-- Load Balancing
|
v
Backend Services
เมื่อเข้าใจพื้นฐานแล้ว สามารถต่อยอดเป็นระบบที่ใกล้ Production มากขึ้นด้วย
Kong Gateway
|
+-- JWT / OAuth 2.0 / OIDC
+-- Rate Limiting
+-- Load Balancing
+-- Health Check
+-- Prometheus
+-- Grafana
+-- Centralized Logging
|
v
Microservices / Kubernetes
หัวข้อ Workshop ถัดไปที่เหมาะสมคือ Kong API Gateway Authentication ด้วย JWT, OAuth 2.0, Prometheus + Grafana และการ Deploy Gateway บน Kubernetes
#แหล่งศึกษาเพิ่มเติม
- Kong Gateway Documentation: https://developer.konghq.com/gateway/
- Kong Gateway: https://konghq.com/products/kong-gateway
- Docker Documentation: https://docs.docker.com/
- httpbin: https://httpbin.org/