จัดการกับ Kong แบบง่ายๆด้วย Konga
Konga คือ Open-source software ที่เราสามารถจัดการกับ Configuration ของ Kong ผ่านทาง GUI(graphical user interface)
จริงๆถ้าเราไม่มี Konga เราก็สามารถจัดการกับ Kong ผ่านทาง Admin API ได้อยู่แล้ว(โดย default จะผ่าน port 8001 และ 8444) แต่จะทำงานได้ยากมากๆ ตัว Admin API จะเหมาะสำหรับการทำงานแบบอัตโนมติเท่านั้น
และถ้าใครใช้ Kong Enterprise ก็ไม่จำเป็นต้องใช้ Konga เพราะคุณจะมี Kong Manager ให้ใช้งานอยู่แล้ว แต่ถ้าใครยังไม่มี license ของ Kong Enterprise คุณก็ต้องใช้ Konga ในการทำงาน
เริ่มต้นใช้งาน Konga ด้วย Docker Compose
ก่อนอื่นเราต้องสร้าง Kong และ Konga ขึ้นมาก่อนด้วย docker-compose.yml
|
|
คุณสามารถดูตัวอย่างไฟล์ทั้งหมดได้ที่ https://github.com/irobust/MicroservicesDemo/tree/main/04-API-Gateway
หลังจากนั้นคุณจะสามารถเข้าไปดู Konga ได้ที่ http://localhost:1337
เริ่มต้นสร้าง Connection
เริ่มต้นการใช้งานคุณต้องทำการสร้าง Admin Account เพื่อสำหรับ Sign in เข้าใช้งานก่อน หลังจากสร้าง accout สำหรับเข้าใช้งาน Konga เรียบร้อยแล้วเราก็ Login เข้า Kong ดังรูป
หลังจากที่เรา Login เข้าไปหน้า Home ของ Konga จะยังไม่มีเมนูสำหรับจัดการกับ Kong อยู่เลยเนื่องจาก Konga ยังไม่ได้เชื่อมต่อกับ Kong ดังนั้นในขั้นตอนนี้เราจึงต้องสร้าง Connection โดยระบุ URL ของ Kong Admin API
ถ้าเราสามารถ Connect กับ Kong ได้เราก็จะเห็นหน้า Dashboard ที่จะแสดงจำนวน Connections ดังรูป
เนื่องจาก Konga เป็น Client Application ที่ีสามารถเชื่อมต่อกับ Kong Server ที่ไหนก็ได้ ไม่จำเป็นต้องอยู่ในเครื่องเดียวกับ Konga และนอกจากนี้เรายังสามารถเพิ่ม Connection เข้าไปได้เรื่อยๆ แต่ Connection ที่เราได้สร้างไว้จะเก็บไว้ใน localDisk เท่านั้น แต่ถ้าเราต้องการเก็บ Connection ไว้ใน Database เราสามารถเลือกให้ Konga เชื่อมกับ Database ที่ konga supported ดังนี้
- PostgreSQL(ตัวนี้น่าจะใช้เยอะสุดเพราะ ใช้กับ Kong ได้ด้วย)
- MongoDb
- MySQL
Kong จะเชื่อมต่อกับ Database ได้โดยการกำหนดตัวแปรต่างๆเหล่านี้ ในไฟล์ .env
- DB_ADAPTER
- DB_URL
- DB_PORT
- DB_DATABASE
- DB_USER
- DB_PASSWORD
สร้าง Route เข้าสู่ Service ผ่านทาง Gateway
ขั้นตอนแรกของการทำงานกับ Kong คือต้องสร้าง route เข้าไปยัง upstream service โดยในตัวอย่างนี้เราจะสร้าง Route เข้าสู่ Service โดย Service ที่นำมาใช้ในตัวอย่างนี้จะ Mock ด้วย Jason server ชื่อว่า Product Service ซึ่งผมได้ใส่ไว้ใน docker compose แล้ว
หลังจาก run docker compose แล้วให้ลองเข้าไปทดสอบ api จำลองที่ได้สร้างขึ้น โดยเข้าไปดูที่ http://localhost:3000/products
หลังจากนั้นให้สร้าง Service เพื่อระบุว่าจะให้ Kong พาไปที่ไหน โดยเข้าไปที่เมนู Service > Add New Service แล้วก็ระบุค่าต่างๆ ดังนี้
- Name = “product-service”
- Url = “http://product-service:3000/products” หลังจากนั้นกด Summit
เมื่อสร้างเรียบร้อยแล้ว Kong ก็จพสร้าง product-service ขึ้นมาโดยมีรายละเอียด ดังรูป
ต่อมาเราจะทำการสร้าง Route เข้าไปยัง product-service โดยเข้าไปที่เมนู Route > Add Route
เราจะทำการระบุข้อมูลต่างๆ ดังนี้
- Name = “product-route”
- Hosts = “localhost” (สามารถระบุตามที่เราต้องการได้ว่าจะเป็น localhost หรือ IP Address)
- Paths = “/products, /api/v1/products” (สามารถระบุชื่อ Path อะไรก็ได้ตามที่เราต้องการ)
หลังจากนั้นกด Summit เพื่อสร้าง route
ข้อควระวัง คือ parameter ตัวไหนที่เป็นพหูพจน์ เช่น hosts และ paths เราต้องกด enter หลังจากกรอกข้อมูลไปแล้ว เพราะเราสามารถใส่ input ได้หลายตัว(array)
ทดสอบลองเข้าผ่าน Url ที่เราสร้างไว้ตามข้างต้น ได้ผลลัพธ์ ดังรูป จะเห็นว่าเราสามารถเข้าถึง Product Service ได้จากทุก Paths Url ที่เราสร้างไว้
ทดลองใช้ Plugins ใน Kong Gateway
Plugins เป็นหนึ่งในเหตุผลที่เราเลือกใช้ Kogn เพราะมีให้เลือกเยอะมากและครอบคลุมทุกฟังก์ชันการทำงาน นอกจากนี้เรายังสามารถขยายการใช้งานของ Kong ด้วยการเขียนโปรแกรมภาษา Lua เข้าไปใน OpenResty ที่เป็น Opensource สำหรับการเพิ่ม Module เข้าไปใน Nginx Core ซึ่งจะช่วยให้คุณสามารถเพิ่มความสามารถใหม่ๆ ให้กับ Kong Server ของคุณได้
โดยในบทความนี้เราจะลองนำ Plugin ง่ายๆ มาติดตั้งใช้งานให้ดูเป็นตัวอย่าง เริ่มต้นจากเข้าไปที่เมนู Plugins > Add Plugin
Plugin ที่เราเลือกมา Demo คือ Rate Limit ซึ่งอยู่ในหัวข้อ Traffic Control
Rate Limit คือ การจำกัดจำนวนครั้งในการเข้าถึง API ในช่วงเวลาที่เรากำหนด เช่น เราสามารถเข้าใช้งาน API ได่้สูงสุด 10 requests ใน 1 นาที หรือ 3 requests ใน 1 วินาทีเป็นต้น โดยหน่วยของเวลาสามารถกำหนดเป็น วินาที(second), นาที(minute), ชั่วโมง(hour), วัน(day), เดือน(month), ปี(year)
พวก rate limit ตาม วัน, เดือน และปี จะใช้กับ Subscription Plan(ปริมาณการใช้งานขึ้นอยู่กับราคาที่จ่าย)
ในตัวอย่างนี้เราจะกำหนด
- Minute = 10
ซึ่งหมายความว่า การเข้าถึง API ทุกๆตัวได้่ไม่เกิน 10 ครั้ง ต่อหนึ่งนาที ที่มีผลกับ API ทุกตัวเนื่องจากเราสร้าง Plugins จาก เมนู plugins ด้านนอกซึ่งจะถือว่าเป็น global plugins ที่มีผลกับ API ทุกตัวที่อยู่หลัง Kong Gatewat ตัวนี้
จากนั้นทำการทดสอบลองเข้าใช้งาน API ผ่านทาง Route ที่เราสร้างไว้ในขั้นตอนก่อนหน้านี้ และทำการ Reload page เกิน 10 ครั้ง จะได้ผลลัพธ์เป็น Error รหัส 429 ดังรูป
เมื่อเราส่ง request เข้าไปเกิน limit Kong จะ return HTTP status เป็น 429 ซึ่งหมายถึงคุณส่ง requests มากเกินไปแล้ว(Too many requests)
นอกจากการใช้งาน plugins โดยสร้างเป็น global plugins ตามตัวอย่างด้านบนแล้วเรายังสามารถเลือกสร้าง plugins ตาม scope ที่กำหนด ซึ่ง scope ของ plugins ทีดังนี้
- Global plugins plugins จะมีผลกับทุกๆ request ที่เข้ามาใน API gateway
- Route plugins plugins จะมีผลเมื่อวิ่งผ่านเฉพาะ route ที่ add plugins เข้ามาเท่านั้น
- Service plugins plugins จะมีผลเฉพาะ service ที่ได้ add plugins เข้ามาเท่านั้น
- Consumer plugins plugins จะมีผลเฉพาะ consumer หรือ user บางคนที่ได้ add plugins เข้ามาในระบบเท่านั้น
เราจะสามารถ add plugins เข้าไปใน scope ไหนบ้างขึ้นอยู่กับการทำงานของ plugins แต่ละตัวซึ่งก่อนใช้งานเราต้องเข้าไปอ่านใน document เพื่อตรวจสอบว่าเราสามารใช้ plugins ในจุดที่เราต้องการได้หรือไม่