หลายๆคน ที่ผ่านมาอ่านบล็อกนี้ ผมคิดว่า น่าจะเคยอ่านบล็อกนี้ "ชีวิตดีเพราะมี Kong ช่วยทำ API Gateway" ซึ่งเขียนไว้ได้ดีมาก เห็นภาพรวม และการใช้งาน Kong ได้อย่างเข้าใจง่าย ผมแนะนำให้อ่านประกอบกับบล็อกนี้ไปด้วย
ในบล็อกนี้ ผมจะมาสรุปสั้นๆ เพื่อให้เห็นภาพว่า Kong คืออะไร ทำอะไรได้บ้าง และจะใช้มันทำอะไร
จากภาพบน (ด้านซ้าย) แสดงให้เห็นว่า การทำ API แบบเก่าเวลาที่ API เริ่มเยอะขึ้น ฟังก์ชั่นหรือฟีเจอร์ที่ใช้ จะมีซ้ำๆกัน เช่น การ Authentication ก่อนการเรียกใช้ API, การ Limit Request สำหรับการเรียกใช้ API และอื่นๆ ซึ่งแต่ละ API อาจจะมาจากคนละทีมที่เขียนมา แล้วใช้ Reverse Proxy ในการ Route Request ไปยัง API ต่างๆด้านหลัง
ภาพด้านขวาคือ Kong API Gateway จะแสดงให้เห็นว่าจะยุบรวมฟีเจอร์หรือฟังก์ชั่น ที่มีการเรียกใช้งานร่วมกันของ API ต่างๆ ไปอยู่ที่ตัว Kong ทำให้ API ที่เขียนขึ้นมา ไม่ต้องเขียนฟังก์ชั่นเหล่านั้นเอง เช่น Authentication, Rate Limit, ACL และอื่นๆ
สิ่งที่ทำให้ Kong เป็น API Gateway ที่ได้รับความนิยมมากคือ
- ใช้ง่ายผ่าน RESTful API
- Open Source
- Scale ได้ง่าย
- ประสิทธิภาพสูง
- มี Plugin ให้ใช้
Deploy Kong ในเวลาน้อยกว่า 2 นาที!
ถ้าในเครื่องมี Docker, Docker Compose แล้วนะ :D
git clone https://github.com/narate/kong-docker.git
git checkout pg
time ./start.sh
จากคำสั่งด้านบน จะได้ Kong API Gateway ที่พร้อมใช้งาน แต่ก่อนจะเริ่มใช้งาน Kong มาทำความเข้าใจพื้นฐานของ Kong ก่อน
หลังจากที่ Deploy Kong ไปแล้วจะได้ 2 Port ที่เปิดเพิ่มมา
- Kong Admin Port 8001
- Kong Proxy Port 8000 (แต่ใน docker-compose map port ออกมาเป็น 80 ที่เครื่องโฮสต์)
Kong Admin Port 8001
Kong Admin Port ใช้สำหรับคอนฟิก Kong
Kong Proxy Port 8000
Kong Proxy Port ใช้สำหรับเป็นทางเข้า หรือให้เรียกไปยัง Service ด้านหลัง Kong
Object พื้นฐาน ที่ต้องใช้ใน Kong
- Services
- Routes
Kong Services
Kong Services คือ การประกาศไว้ว่า API หรือ Microservice ของเราอยู่ที่ไหน
Kong Routes
Kong Routes คือ ทางเข้าไปยัง Services ที่ประกาศไว้
สร้าง Service แรก
ใช้ cURL
ในการสร้าง Service ชื่อ httpbin
โดยมี url ของ service เป็น http://httpbin/org
curl 127.0.0.1:8001/services -d 'name=httpbin' -d 'url=http://httpbin.org'
หลังจากรันคำสั่ง จะได้ Respose เป็น JSON กลับมา
{
"host": "httpbin.org",
"created_at": 1560595421,
"connect_timeout": 60000,
"id": "02fd187e-7976-44ce-88a6-604a707cdc9a",
"protocol": "http",
"name": "httpbin",
"read_timeout": 60000,
"port": 80,
"path": null,
"updated_at": 1560595421,
"retries": 5,
"write_timeout": 60000,
"tags": null
}
หลังจากที่สร้าง Service แล้ว จะยังเข้าถึง Service ไม่ได้ เพราะยังไม่มี Routes หรือทางเข้าไปยัง Services ถ้าเข้าไปยัง Proxy Port http://127.0.0.1/
curl 127.0.0.1
จะได้ error
{
"message": "no Route matched with those values"
}
สร้าง Routes เพื่อให้เรียกหา Service ได้
curl 127.0.0.1:8001/services/httpbin/routes -d 'paths[]=/'
จะได้ JSON Response
{
"id": "4eaef1d0-b0e1-49d6-a160-81f9456933e7",
"tags": null,
"paths": [
"/"
],
"destinations": null,
"protocols": [
"http",
"https"
],
"created_at": 1560595643,
"snis": null,
"hosts": null,
"name": null,
"preserve_host": false,
"regex_priority": 0,
"strip_path": true,
"sources": null,
"updated_at": 1560595643,
"https_redirect_status_code": 426,
"service": {
"id": "02fd187e-7976-44ce-88a6-604a707cdc9a"
},
"methods": null
}
ถ้าเรียกหน้าเว็บ http://127.0.0.1 จะได้หน้าเว็บเดียวกับ http://httpbin.org
หรือว่าทดลองเรียกใช้ด้วย cURL
เพื่อเช็ค IP ของเครื่องเรา
curl 127.0.0.1/ip
จะได้ IP ของเครื่องเรา
{
"origin": "192.168.32.99, 184.22.153.99, 192.168.32.99"
}
จะเห็นว่า เราสามารถสร้าง API Gateway ได้ใน 2 คำสั่ง ซึ่งใช้เวลาในไม่กี่นาที เราก็ได้ API Gateway ที่เรียกไปยัง Microservice ข้างหลังได้ ถ้าจะเพิ่ม Services, Routes ใหม่ ก็จะเพิ่มได้ในไม่กี่นาที
Konga Kong Admin GUI Dashboard
Kong ไม่ได้ให้ระบบ Admin GUI Dashboard มาให้ในเวอร์ชั่น CE หรือ Community Edition แต่ก็มีคนสร้าง Admin GUI Dashboard เวอร์ชั่น Open source มาให้ใช้ https://github.com/pantsel/konga
ในไฟล์ docker-compose ที่ clone ลงมา จะมี service ให้อยู่แล้ว แต่ยังไม่ได้รันขึ้นมา ต้องรันขึ้นมาก่อน โดยต้องรัน 2 service คือ mongo, konga
docker-compose up -d mongo konga
หลังจาก run เสร็จแล้ว konga จะรันอยู่ที่ Port 1337 การเข้าใช้งานครั้งแรก จะต้องสร้าง username/password ก่อนเข้าใช้งาน
หลังจากที่สร้าง username/password แล้ว และ Login เข้าไปในระบบของ Konga จะได้หน้าให้ config admin url
- Name ตั้งชื่ออะไรก็ได้
- Kong Admin URL ให้ใช้
http://kong:8001/
เพราะรันอยู่ใน docker-compose สามารถเรียกด้วยชื่อ service ใน docker-compose ได้
จะได้หน้า Admin GUI
Kong Plugin
สิ่งที่ทำให้ Kong มีความยืดหยุ่นคือ มีระบบ Plugin (แต่ ยังไม่มี plugin market) ตัวอย่าง คือ จะเพิ่มระบบ Authentication ให้กับ API ที่สร้างขึ้นมา โดยจะใช้ Basic Auth ที่ต้องใส่ username/password ก่อน ถึงจะสามารถเรียก API ได้
เมนู Service
ในเมนู Service จะเห็นว่า มี Service ที่เราสร้างไว้ก่อนหน้านี้ผ่าน command line
กดเข้าไปใน httpbin จะเห็นรายละเอียดของ Service ที่สร้างไว้
จากนั้นให้ไปที่เมนู Plugins
กด Add Plugin ให้เลือก Basic Auth ไม่ต้องใส่ค่าอะไร
หลังจากที่เพิ่ม Plugin ไปแล้ว เวลาเรียกใช้ API จะต้องใส่ username/password
แต่ เรายังไม่มี username/password
สร้าง Kong Consumer
Consumer คือ คนที่จะมาเรียกใช้ API เวลาเรา Enable Plugin ที่เกี่ยวกับการ Authentication แล้ว จำเป็นที่จะต้องสร้าง Consumer ก่อน
ไปที่เมนู Consumers และสร้าง Consumer
จากนั้นสร้าง Credentials Basic Auth ให้กับ Consumer
หลังจากสร้าง Credentials แล้ว จะเข้าใช้เว็บหรือ API ได้
จบ
เดี๋ยวๆๆ ลืมขายของ
ที่เขียนมาทั้งหมด สามารถหาอ่านได้จากที่อื่นๆได้ ไม่ได้เป็นเรื่องยากมากสำหรับ Dev/Sys Admin เท่าไหร่ แต่ สิ่งที่ Kong มีความยืดหยุ่นมากกว่านี้คือ เราสามารถที่จะเขียน Plugin ขึ้นมาได้เอง โดยใช้ภาษา Lua ที่เขียนอยู่บน OpenResty สำหรับบริษัทที่สนใจ อยากใช้ Kong ซึ่ง Kong มี 2 เวอร์ชั่นคือ EE (Enterprise Edition) และ CE (Community Edition) ทางบริษัท DomeCloud เป็น Partner กับ Kong Inc. ในการขาย Kong EE และนอกจากนี้ DomeCloud ยังรับ Implement Kong CE Plugin ด้วยติดต่อได้ทาง Fcebook page DomeCloud