VDO งาน Kong Summit 2019 ที่ทางนเรศแชร์มาใน facebook
มีหลายอย่างที่น่าสนใจ
เรื่องที่ผมสนใจคือ การเขียน Kong plugin ด้วยภาษา Go
ซึ่งจะมีใน Kong gateway 2.0 นั่นเอง
โดยจะอยู่ใน session Keynote:: Announcing Kong Gateway 2.0
ดังนั้นว่าง ๆ มาลองเล่นดูหน่อย
เริ่มด้วย software ที่ใช้งานเพื่อลองของ
ประกอบไปด้วย
- Docker
- Kong Image จาก Docker Hub version 2.0.0rc1-ubuntu
- Kong :: Go plugin server
- Kong :: Go PDK (Plugin Development Kit)
จากบทความข้างต้นนั้น
แนะนำให้ใช้ Kong Preview Version (Alpha)
แต่จากที่ลอง run แล้วมันเดี้ยง ๆ เลยไปใช้ version 2.0.0rc1 แทน
ซึ่งทั้งสอง version นี้แตกต่างกันเรื่อง config ของ DBless
โดยใน Kong Preview Version นั้นต้องกำหนด environment variable
ชื่อว่า KONG_STORAGE: memory
แต่ใน version 2.0.0rc1 นั้นต้องใช้ KONG_DATABASE: off เช่นเดิม
มาเริ่มต้นกัน
จากที่เริ่มแกะ ๆ เล่นดู เจอ error เพียบเพราะว่าไม่รู้อะไรเลย !!
แต่ก็มั่ว ๆ ไปจากการดูใน VDO นั่นเอง
run ตามรูป
ใน VDO ดูง่ายนะ แต่พอมาลองทำเองไม่ง่ายเลย
เพราะว่าเอกสารยังไม่มี ต้องมั่วเองไปก่อน !! มามั่วกัน
นั่งมั่วไปมั่วมา ได้โครงสร้างการทำงานดังนี้
- Kong gateway โดยจะมีทำการ connect ไปยัง Go plugin server จากไฟล์ kong/db/dao/plugins/go.lua อยู่ใน branch release/2.0.0
- Go plugin server จะ run socket ทิ้งไว้
- เขียน plugin ด้วยภาษา Go ซึ่งทาง Kong เตรียม Go-pdk ไว้ให้ แน่นอนทำการเชื่อมต่อผ่าน Go plugin server ด้วย Go channel นั่นเอง
- โดย plugin นั้นก็ต้องประกาศใน Kong gateway ด้วยทั้ง เช่น directory ของ plugin เพื่อทำการติดตั้งและ load plugin มาใช้งาน
ดังนั้นรูปการทำงานน่าจะประมาณนี้
ขั้นตอนการใช้งานเป็นดังนี้
ขั้นตอนที่ 1 ทำการ config Kong gateway เพื่อใช้งาน plugin ที่เขียนด้วยภาษา Go
ทำการ config ค่าของ environment variable ดังนี้
- KONG_GO_PLUGINS_DIR กำหนด directory สำหรับเก็บ plugin ที่เขียนด้วยภาษา Go เป็นไฟล์นามสกุล .so
- KONG_PLUGINS กำหนด plugin ที่จะใช้งาน ซึ่งจะทำการ load และ ติดตั้งตอน start Kong gateway ขึ้นมา
ขั้นตอนที่ 2 ทำการ start Go plugin server ขึ้นมาใน Kong gateway
จากที่ลองใช้งาน Docker image ของ Kong 2.0.0rc1-ubuntu นั้น
จะเจอ error เรื่องของการเชื่อมต่อไปยัง Go plugin server ไม่ได้
แสดงดังนี้
ดังนั้นจำเป็นต้องทำการ start Go plugin server เอง
โดยทำการ build binary เองและ start เอง สามารถนำ code มาจาก Kong Go Plugin Server นั่นเอง
เพียงเท่านี้ก็สามารถ start Kong gateway ได้แล้ว
ซึ่งผมทำการ restart นิดหน่อย และใส่ mode debug เข้าไป
ขั้นตอนที่ 3 มาสร้าง plugin ด้วยภาษา Go กันหน่อย
ทาง Kong ได้เตรียมตัวอย่างของ plugin ไว้ที่ Go-plugin
จะประกอบไปด้วย go-hello และ go-log
โดยผมทำการ copy go-hello มาลองเล่นนิดหน่อยดังนี้
ถ้าใครสังเกตจะพบว่า code ไม่ตรงกับ code ใน VDO นะ !!
เป็นตัวอย่างของการเพิ่ม Header ใน response ชื่อว่า X-Kong-Go เข้ามาเท่านั้นเอง
ทำการ build เป็น plugin ดังนี้ (Go สนับสนุนอยู่แล้ว)
จะได้ output เป็นไฟล์นามสกุล .so มา ดังนี้
จากนั้นนำไฟล์ go-hello.so ไปไว้ใน directory ที่กำหนดไว้ใน KONG_GO_PLUGINS_DIR
ขั้นตอนที่ 4 เมื่อทุกอย่างพร้อม ก็ run ละครับ รออะไร !!
ได้ผลการทำงานดังนี้
[gist id="64ef8b72a47e4439275ce5c56fe67208" file="5.txt"]เพียงเท่านี้ก็พอถู ๆ ไถ ๆ ไปได้นะ !!
หลังจากที่ run แล้วก็มีคำถามเพียบ
ยกตัวอย่างเช่น
ข้อที่ 1 ทำไมต้องเขียน code แบบนี้ด้วยละ ทำไมต้องมี function Access หรือ Log มีอย่างอื่นอีกไหม ?
พอไปนั่งอ่าน code ดู ก็ถึงบางอ้อ
โดย code ที่น่าสนใจอยู่ที่ Go plugin server (instance.go)
จะทำการกำหนดไว้ว่าจะประกาศ function อะไร อย่างไร ?
- Certificate
- Rewrite
- Access
- Preread
- Log
มาดู code กัน
ข้อที่ 2 ภาษา Go จะเข้ามาแทนภาษา Lua หรือไม่ ?
คำถามนี้ก็มีใน repository ที่ Github เช่นกัน
ซึ่งทาง Kong ตอบไว้ว่า ไม่ได้เอามาแทน
แต่เอามาเพื่อเพิ่มความหลากหลาย
ซึ่งจะมีข้อจำกัดอย่างแน่นอน
ว่าง ๆ มาลองเล่นดูกันครับ
แต่รอเอกสารจาก official ดีกว่านะ
ขอให้สนุกกับการ coding ครับ