Godzilla vs Kong (Microservice + API gateway)

สวัสดีครับ วันนี้ godzilla ไม่ได้มาสู้กับ kong นะ แต่จะมาสปอยวิธีการนำ kong มาทำ apigateway ให้กับ nest microservice ต่างหาก
Api Gateway คืออะไร
เป็น service ที่มาช่วยทำหน้าที่ เป็นตัวการ route request ต่างๆ ที่มาจากผู้ใช้ ไปยัง service ต่างๆ โดยผู้ใช้ ไม่ต้อง request ผ่าน service โดยตรง อย่างในรูปภาพข้างล่างนี้ครับ

ซึ่ง apigateway มีให้เลือกใช้อย่างมากมายเลยครับ ถ้าอยากรู้ว่ามีของอะไรบ้างผมจะแนบลิงค์เพิ่มเติมไว้ให้ครับส่วนบทความนี้ผมจะเลือกใช้ kong apigateway ครับ

Kong คืออะไร
Kong เป็น open source
ในการทำ api gateway แล้ว kong ก็มี docker image
ให้เราได้ใช้กันด้วย แล้วบทความนี้ผมก็จะ ใช้ docker นี่แหละครับในการลง kong
มาลง kong กันก่อนนะครับ
สร้าง docker network ขึ้นมาก่อนครับ
docker network create kong-net
การที่เราจะลง kong ขั้นแรกเราจะต้องมี database ก่อนครับ ซึ่งมีให้เลือกระหว่าง cassandra (nosql)
หรือ postgest (sql)
ครับ ส่วนบทความนี้ผมเลือกเป็น postgest
เริ่มจากรันคำสั่ง ข้างล่างนี้เพื่อสร้าง database ขึ้นมาครับ
docker run -d --name kong-database \
--network kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
postgres:9.6
ต่อไป เป็นการ migrate database ลงใน kong-database ครับ
docker run --rm \
--network kong-net \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
kong kong migrations bootstrap
สุดท้ายรัน container เราก็จะได้ kong มาเรียบร้อยครับ
docker run -d --name kong \
--network kong-net \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong
จากที่เรา รัน code เมื่อเราเปิด http://localhost:8001
จะได้ json หน้าตาแบบนี้
{
"hostname": "6297f09a6098",
"tagline": "Welcome to kong",
"timers": {},
"configuration": {},
"pids": {},
"lua_version": "LuaJIT 2.1.0-beta3",
"version": "2.4.1",
"plugins": {},
"node_id": "c0fcbcec-7cc4-4bb1-8f51-0d1b9118d600"
}
มาสร้าง KONG Admin API. ให้ kong เพื่อให้ใช้ง่านง่ายกันดีกว่าโดยใช้ Konga

docker pull pantsel/konga
docker run -p 1337:1337
--network kong-net \
-e "DB_ADAPTER=postgres" \
-e "DB_HOST=kong-database" \
-e "DB_USER=kong" \
-e "DB_PASSWORD=kong" \
-e "DB_DATABASE=kong-database" \
-e "NODE_ENV=development" \
--name konga \
pantsel/konga
หลังจากนั้น พอเข้า localhost:1337 konga จะให้เรา register ก่อนหลังจากนั้น login เข้าไป จะเจอหน้าตาเว็บเป็นแบบรูปข้างล่างครับ

Nest Micro Service
ผมได้ทำ การ สร้าง Nestjs มา 2 โปรเจ็ค ชื่อว่า microservice1
กับ microservice2
วิธีสร้าง nestjs สามารถเข้าไปดูจากเว็บไซต์ nest หรือ บทความเก่าของผมได้ครับ https://www.molysulfur.dev/nestjs-mysql-ep1 หรือ https://docs.nestjs.com/first-steps
จากนั้น ทั้ง 2 โปรเจ็คให้ลง package nestjs microservice ลงเข้าไปครับ
npm i --save @nestjs/microservices
จากนั้นใน main.ts แก้ไขโดยเพิ่ม microservice เข้าไป
ในส่วนของ app.listen() ให้ใส่ port ที่แตกต่างกันนะครับ อย่าซ้ำกันหละ
จากนั้นให้เรา start microservice ทั้ง 2 ทิ้งไว้เลยครับ
มาเชื่อม Kong กับ Nest ดีกว่า
Step 1
กลับมาที่ konga ครับ จะเห็นว่า จะมีให้ create connection
ใน name
ให้ใส่อะไรไปก็ได้ครับ จากนั้นในส่วน kong admin url
ในใส่ http://kong:8001
เมื่อสร้างเสร็จ ใครที่ connection ขึ้น active คลิกตรง active มันจะเปลี่ยนเป็นคำว่า deactive แบบในรูปครับ

Step 2
ใน sidebar ของ konga จะมีแถบ services ให้คลิก services -> add service

จากนั้นให้เราใส่ ข้อมูลลงไป บทความนี้จะใส่ข้อมูลลงไปแค่ใน Name, HOST, PORT, Protocal
- Name ให้ใส่อะไรก็ได้ครับ
- HOST ให้ใส่ IP ของ network เรา
- PORT ให้ใส่ port ที่ service ของเรา start อยู่ครับ
- Protocal หากว่าเรา รันใน server แล้ว เป็น https ให้ใส่ https แต่ถ้าเราอยู่ใน local ก็ใส่ http ครับ
ให้ add service ลงไปทั้ง 2 service ที่เรารันอยู่เลยนะครับ จากนั้น คลิกเข้าไปแต่ละ service ใน list ครับ แล้วในหน้านั้น จะมีแถบ routes ครับ คลิกตรง add route ได้เลยครับ

จะเห็น dialog ขึ้นมา ในส่วนนี้จะเป็นการใส่ข้อมูลเงื่อนไขว่า ถ้าหาก มี request เข้ามา path ของ kong แบบไหน ให้ โยงไปหา service ที่เราเลือก
จากรูป บทความนี้จะใส่ ไปใน path ว่า /microservice1
และ /microservice2
นะครับ
หลังจากนั้นลองทดสอบยิง request
ไปที่ localhost:8000/microservice1 และ /microservice2
จะได้ผลลัพท์ตามด้านล่างครับ


บทความนี้ก็เป็นการพา ทำ apigateway ซึ่งตัว kong ยังสามารถทำอะไรได้อีกมากมายใครที่สนใจจะนำไปศึกษาต่อผมจะแปะลิงค์เว็บหลัก kong ให้ครับขอให้ทุกคนที่เข้ามาอ่านได้นำบทความนี้ ไปต่อยอดได้นะครับขอบคุณครับ

