เริ่มจากอันดับแรกเลย มารู้จักก่อนว่า API คืออะไร API ย่อมาจาก “Application Program Interface” ลองดูรูปนี้ก่อน
การทำงานคือ API ทำหน้าที่เป็นส่วนที่ทำงานประมวลผลตามที่ถูกออกแบบมา ก็ลอง จำลอง ภาพด้านบนนี้ว่าคือการที่ Client ส่ง request มาที่ API ==> API ก็จะไปหยิบข้อมูลจาก Database เพื่อมาตอบให้กับ Client ตาม request ที่ได้รับมาและเป็นไปตามการทำงานของ API เอ๊ะ!!! เป็นไปตามการทำงานของ API ทำไมหน่ะเหรอ ก็เพราะว่า API ถูกสร้างมาเพื่อทำงานตามที่โปรแกรมไว้ และมีเงื่อนไขการรับข้อมูล ว่าต้องการอะไรบ้างแล้วถึงจะ reponse ผลลัพธ์กลับไปให้คนที่ request เข้ามา โดยปกติ ก็จะต้องระบุว่าเป็น method อะไร, parameter ต้องส่งอะไรมาบ้าง, format แบบไหน เป็นต้น
ที่นี่มาเจอคนๆ นี้หน่อย KONG The API Gateway!!!!
Kong คืออะไรล่ะ ดียังไง ทำไมต้องใช้ จะดีกว่าไหมถ้าฝั่ง Back-end ไม่ต้องเสียเวลาในการเขียนบ NodeJS เพื่อเรียก Microservice ในการทำ API Gateway ด้วย “KONG” ซึ่งเป็น Open Source ที่ทำหน้าที่บริหารจัดการ API (Application Programming Interface) หรือที่เรียกกันว่า API Gateway ที่สามารถ Scale ได้ง่ายและมีความปลอดภัยสูง KONG ทำงานเป็นตัวกลางในการสื่อสารระหว่าง Clients กับ Microservice ต่างๆ ช่วยบริหารจัดการ Functionality ทั้งหมดเลยไม่ว่าจะเป็น Caching, Monitoring, Authentication หรือแม้กระทั้ง Rate-limiting ซึ่งจะเหมาะและตอบโจทย์ของ Modernise Application และก็สามารถ Scale ได้ทุกครั้งขึ้นอยู่กับการใช้งาน ทำให้ผู้ใช้งานสามารถโฟกัส Product และ Service ใหม่ได้โดยไม่ต้องกังวลเรื่องของการจัดการ API
ซึ่ง Kong มีทั้งแบบที่เสียเงินและฟรี
แบบฟรี Kong Open-Source (Community) เรามาเริ่มที่ตัว Open-Source หรือที่หลายคนเรียกว่า Community กันก่อนเลยดีกว่า ตัวนี้คือ API Gateway แบบทั่วไป ไม่เสียค่าใช้จ่าย ซึ่งทำหน้าที่เป็นตัวกลางเชื่อมต่อและสื่อสารระหว่างแอปพลิเคชัน สามารถนำ Free Plugins มาติดตั้งเพิ่มเติมเพื่อให้เหมาะสมกับการใช้งานได้
แบบเสียเงิน Kong Enterprise มาต่อกันที่ฝั่ง Enterprise กันบ้าง เปรียบเทียบให้เห็นภาพชัดๆ เลยก็คือ Kong Enterprise เป็นบริการที่เสียค่าใช้จ่ายเพื่ออัพเกรดฟีเจอร์ให้แอดวานซ์ขึ้นไปอีกขั้น ด้วยคุณสมบัติที่มากกว่า Kong Open-Source นั่นเองตัวอย่างเช่น GUI ที่เอาไว้ควบคุมการใช้งานต่างๆ มาพร้อมระบบป้องกันความปลอดภัย รองรับการขยายของ Application ในกรณีที่มี Workload สูง เสี่ยงต่อการเกิดปัญหานั่นเอง แม้ว่า Kong Enterprise จะมาพร้อมคุณสมบัติที่ตอบโจทย์การใช้งานรอบด้านขนาดนี้ แต่รู้หรือไม่ว่า ค่าใช้จ่ายในการใช้บริการนั้นเป็นมิตรกับผู้ใช้งาน ซึ่งมาในรูปแบบของ Pay-as-you-go Pricing Model และที่มากไปกว่านั้น Kong Enterprise ยังมีทีมผู้เชี่ยวชาญหลังบ้านที่คอยให้ความช่วยเหลือในกรณีเกิดปัญหาการใช้งานอีกด้วย
ลองมาเทียบข้อมูลทั้ง Kong Open-Source และ Enterprise กันหน่อย
Kong Open-Source (Community)
- Microservice API Gateway : สามารถที่จะใช้ API เพื่อเป็นตัวกลางของการสื่อสารแอปพลิเคชันต่างๆ
- Open Source Plugins : สามารถที่จะนำ Third Party เข้ามา Integrate กับ Kong ได้
- Community Support : ทาง Kong มีแหล่งรวบรวมข้อมูล หรือนักพัฒนาที่จะคอยช่วยเหลือและให้คำตอบตลอดเวลาในกรณีที่เราติดปัญหาต่างๆ ไม่ว่าจะเป็นการติดตั้งหรือการใช้งาน
Kong Enterprise
- Kong Admin GUI : มีหน้ากากที่เอาไว้บริหารจัดการ API
- Kong Security : รองรับในส่วนของการทำ AAA (Authentication, Authorisation, Auditing)
- Kong Dev Portal : สามารถที่จะติดตั้งหรือบริหารจัดการ Service ต่างๆ ได้
- Kong Analytics : ทำการ Monitor API traffic ได้โดยข้อมูลที่ได้รับจะเป็นแบบ Real-Time
- Kong Scalability : สามารถที่จะขยายออกหรือหดเข้าได้ทุกเมื่อขึ้นอยู่กับการใช้งานและ Traffic ต่างๆ
ร่ายยาวเลย ถึงเวลามาลองเล่นกันละ มาเริ่มจากใน git repo ของเราในนี้มีอยู่ 2 ไฟล์ 1.docker-compose.yaml => ไฟล์ docker-compose สำหรับ start kong + konga(UI) และก็มี database ด้วยนะ มี postgresql สำหรับใช้งานกับ kong , mongoDB สำหรับใช้งานกับ konga 2.kus.js => เป็นไฟล์ที่ใส่รายระเอียดของ User : admin ซึ่งจะเพิ่ม User อื่นอีกก็ได้
อันดับแรกเลย เครื่องที่เราจะใช้ทดสอบจะต้องมี docker และสามารถใช้งาน docker-compose , docker compose ได้ด้วย
docker --version
docker-compose version
output
มาเริ่มเลย
- git clone https://github.com/Arctica-th/kong.git
- cd kong
- มาดูไฟล์ kus.js กันหน่อย ก็นั่นแหละ username / password ก็ในรายละเอียดไฟล์นี้เลย
module.exports = [
{
"username": "admin",
"email": "admin@domain.com",
"firstName": "Admin",
"lastName": "Admin",
"node_id": "http://kong:8001",
"admin": true,
"active": true,
"password": "admin1234"
}
];
- start kong ขึ้นมา ปลุกชีพ
docker-compose up -d
- Check status kong container กันหน่อย
docker ps -a
- เรียบร้อย kong container healthy ละ
- เปิด web browser ขึ้นมา แล้วลองเข้า Konga ดู
http://localhost:1337
- login ลอกมาจากไฟล์ kus.js ได้เลย
- ในหน้านี้ให้เราใส่รายละเอียดของ kong gateway ก่อนถึงจะเข้าสู่หน้าหลักได้
ที่นี่เราจะมาลอง configure Kong กันหน่อยเพื่อทดสอบการใช้งาน kong เบื้องค้น
- Run nginx ที่เป็น docker container ไว้สำหรับทดสอบ
docker run -d -p 8090:80 --name nginx nginx:latest
ก็คือ รัน nginx container โดยเปิด port:8090 ของเครื่องไปที่ port:80 ของ container
- ทดสอบเปิด web browser ของ nginx ก่อน
http://localhost:8090/
- สร้าง service
กรอกข้อมูลของ service ที่เราจะไปต่อ ในที่นี่ก็คือ nginx พระเอกของเรา
- สร้าง route โดนการกดเข้าไปใน service nginx ที่พึ่งสร้างเมื่อกี๊ แล้วเลือก route ในนี้ จากนั้นกด ADD ROUTE
- หลังจากที่ configure service กับ route เรียบร้อยแล้วเราก็มาลอง เข้า web browser nginx ผ่าน kong api gateway กัน ว่าแล้วก็เริ่มกันเลยเปิดเข้าไปที่ URL:http://IP-Address-kong/mynginx
IP-Address-kong = IP Address ของเครื่อง kong /mynginx = configure route ในกำหนดใน kong
ผลลัพธ์ คือ เราควรจะต้องโผล่ไปที่ nginx ที่ start เป็น container ไว้ ถ้าไปได้ แปลว่าที่ configure นั้นถูกต้อง แต่ถ้าไม่ให้ย้อนกลับไปดู configure ดีๆ
ขั้นตอนนี้จะมีสิ่งที่ต้องเตรียมหลักๆ อยู่
- consumer เปรียบเสมือน user ถ้าใครเคยใช้ kafka มา consumer จะหมายถึงผู้บริโภค หรือมองง่ายๆ ก็มองไปว่าเป็นขารับนั่นแหละ
- Plugin Basic auth ก็คือ plugin ที่ไว้สำหรับ authen เพื่อกำหนดสิทธิ์ให้เฉพาะมีสิทธิ์เท่านั้น ที่จะสามารถ ใช้งาน API ได้ ซึ่ง Basic authen จะค่อนข้างง่ายในการทดสอบเพราะว่าใช้แค่ username/password ธรรมดา
- สร้าง consumer
ไปที่เมนู consumer แล้วกดสร้าง
ใส่ข้อมูลของ consumer ตามที่ต้องการแล้วกด submit
พอสร้างเสร็จแล้ว ก็ลองเข้าไปดูใน consumer หน้าตาก็จะเป็นแบบรูปด้านล่าง
- หลังจากสร้าง consumer เสร็จแล้ว ก็มา Add Plugin Basic auth ต่อ
กรอก username / password ที่ต้องการ แล้วกด submit
เสร็จแล้ว จะได้หน้าตาแบบนี้
จากนั้นไปยัง service ที่เราต้องการจะใส่่ Basic auth เลือกเมนู Plugin ด้านซ้ายมือ และกด ADD PLUGIN
หลังจากกด ADD PLUGIN ไปแล้วจะมีหน้าต่างเด้งขึ้นมาให้เลือก plugin ให้กด ADD ที่ Basic Auth ได้เลย
จะมีหน้าต่างเด้งอีกครั้ง เป็นรูปด้านล่าง แต่ไม่เป็นไรกด ADD PLUGIN ได้เลย เย้!!!
Add Plugin เสร็จแล้วให้ไปดูเมนู "Eligible consumers" ซึ่งอันนี้จะแสดง consumer ที่มีสิทธิ์มาเรียก API นี้ได้
ที่นี่ลองไปเปิด web browser ไปที่ service nginx ผ่าน kong api gatewaty กันใหม่อีกครั้ง URL:http://IP-Address-kong/mynginx เราก็จะเจอกับหน้า authen ทันที เหอะๆ
ที่นี่มาลองใช้งาน Plugin อีกตัวที่เข้ามาควรจัดการ การเข้าถึงของ consumer อีกที นั่นก็คือ ACL Plugin
- สร้าง consumer มาเพิ่มก่อน เพื่อให้เป็นคนที่ถูกเลือกให้ผิดหวัง
- กำหนด group ให้กับ consumer กันก่อน ส่วนการเข้าไปกำหนด group ให้กับ consumer ก็ให้เข้าไปใน consumer นั้นๆ แล้วเลือกเมนู groups เสร็จแล้วก็กดปุ่ม
กำหนด consumer 'cs-1' ให้เป็น group1
กำหนด consumer 'cs-2' ให้เป็น group2
- Configure service เพิ่มโดยการ Add Plugin ACL เข้าไป และใส่ group ของ consumer แรก
หลังจากกด ADD PLUGIN
- เปิด web browser แปป เสร็จแล้วลองเปิดขึ้นมาใหม่ แต่เดี๋ยวก่อน นี่แหละ มาลองทีละอัน อันแรกลอง username/password ของ consumer-1 ก่อน
เห็นไหม เข้าได้ใช่ไหม งั้นเราไปดูคนที่ถูกเลือกให้ผิดหวังกัน เปิด tab ใหม่ขึ้นมาแล้วกรอก link เดิมเลย ที่นี่ลองใส่ username/password ของ consumer-2 ดู
เรียบร้อย เข้าไม่ได้ใช่ไหมละ ก็เพราะเป็นคน... ไม่มีสิทธิ์... จะคิดดดดดดดดด เข้ามาก็ Deny ซิคร้าบบบ
ที่นี่เราก็สามารถจัดการ API โดยที่ไม่ต้องไปบอกให้ฝั่ง application ต้องแก้ไขเลย ก็แค่จัดการผ่าน kong api gateway ตรงนี้ แถบยังสามารถกำหนดสิทธิ์การเข้าถึงได้ด้วย ว่าจะอนุญาติให้ใครเข้ามาใช้งาน api ได้บ้าง
ฝากไว้ให้ซี๊ด ในการใช้งาน plugin ACL ของตัว kong community หนึ่งสิ่งที่เจอและทำให้เสียเวลาไปพอตัวเลยก็คือ เมื่อทำการ configure ACL แล้วต้องการดูว่ามี consumer ไหนบ้างที่สามารถเข้าถึง service นี้ได้บ้าง ที่ Eligible consumers ปรากฏว่า ไม่มี list แสดงให้เห็น แต่่ใช่ มันทำงานได้ เพราะพึ่งลองทดสอบไปเมื่อกี๊ นั่นแหละครับ เป็นสิ่งที่ทำให้อยากต่อ user ที่ใช้งาน และกับคนที่พึ่งเริ่มต้นใช้งานอย่างเราๆ ต้องมาเจ็ฐปวดและเสียเวลาไปกับขั้นตอนนี้ แต่ก็นะใช้ของฟรีครับ ทำใจ อยากใช้ที่ Stable ก็คงต้องไปเสียเงิน ใครเขาทำงานเพื่อการกุศลกัน