Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

มาลองเขียน Kong plugin ด้วยภาษา Go กันหน่อย

$
0
0

VDO งาน Kong Summit 2019 ที่ทางนเรศแชร์มาใน facebook
มีหลายอย่างที่น่าสนใจ
เรื่องที่ผมสนใจคือ การเขียน Kong plugin ด้วยภาษา Go
ซึ่งจะมีใน Kong gateway 2.0 นั่นเอง
โดยจะอยู่ใน session Keynote:: Announcing Kong Gateway 2.0
ดังนั้นว่าง ๆ มาลองเล่นดูหน่อย

เริ่มด้วย software ที่ใช้งานเพื่อลองของ

ประกอบไปด้วย

จากบทความข้างต้นนั้น

แนะนำให้ใช้ 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 ขึ้นมา
[gist id="64ef8b72a47e4439275ce5c56fe67208" file="1.txt"]

ขั้นตอนที่ 2 ทำการ start Go plugin server ขึ้นมาใน Kong gateway 

จากที่ลองใช้งาน Docker image ของ Kong  2.0.0rc1-ubuntu นั้น
จะเจอ error เรื่องของการเชื่อมต่อไปยัง Go plugin server ไม่ได้
แสดงดังนี้

[gist id="64ef8b72a47e4439275ce5c56fe67208" file="2.txt"]

ดังนั้นจำเป็นต้องทำการ start Go plugin server เอง
โดยทำการ build binary เองและ start เอง สามารถนำ code มาจาก Kong Go Plugin Server นั่นเอง

[gist id="64ef8b72a47e4439275ce5c56fe67208" file="3.txt"]

เพียงเท่านี้ก็สามารถ start Kong gateway ได้แล้ว
ซึ่งผมทำการ restart นิดหน่อย และใส่ mode debug เข้าไป

ขั้นตอนที่ 3 มาสร้าง plugin ด้วยภาษา Go กันหน่อย

ทาง Kong ได้เตรียมตัวอย่างของ plugin ไว้ที่ Go-plugin
จะประกอบไปด้วย go-hello และ go-log
โดยผมทำการ copy go-hello มาลองเล่นนิดหน่อยดังนี้

[gist id="64ef8b72a47e4439275ce5c56fe67208" file="go-hello.go"]

ถ้าใครสังเกตจะพบว่า code ไม่ตรงกับ code ใน VDO นะ !!

เป็นตัวอย่างของการเพิ่ม Header ใน response ชื่อว่า X-Kong-Go เข้ามาเท่านั้นเอง

ทำการ build เป็น plugin ดังนี้ (Go สนับสนุนอยู่แล้ว)
จะได้ output เป็นไฟล์นามสกุล .so มา ดังนี้

[gist id="64ef8b72a47e4439275ce5c56fe67208" file="4.txt"]

จากนั้นนำไฟล์ 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 ครับ


Viewing all articles
Browse latest Browse all 1997

Trending Articles