Godzilla vs Kong (Microservice + API gateway)
3 min read

Godzilla vs Kong (Microservice + API gateway)

Godzilla vs Kong (Microservice + API gateway)

สวัสดีครับ วันนี้ godzilla ไม่ได้มาสู้กับ kong นะ แต่จะมาสปอยวิธีการนำ kong มาทำ apigateway ให้กับ nest microservice ต่างหาก

Api Gateway คืออะไร

เป็น service ที่มาช่วยทำหน้าที่ เป็นตัวการ route request ต่างๆ ที่มาจากผู้ใช้  ไปยัง service ต่างๆ โดยผู้ใช้ ไม่ต้อง request ผ่าน service โดยตรง อย่างในรูปภาพข้างล่างนี้ครับ

https://www.citrix.com/es-mx/solutions/app-delivery-and-security/protect-applications-apis/what-is-api-gateway.html

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

Top 10 API gateways for API management to try in 2020
Besides simplifying your company development, management, and security for APIs, API gateway tools offer additional extras. For instance, API planning and testing. They both are important on the…

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

https://raw.githubusercontent.com/pantsel/konga/HEAD/screenshots/konga-logo.png
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 เข้าไป จะเจอหน้าตาเว็บเป็นแบบรูปข้างล่างครับ

https://codeinsane.files.wordpress.com/2019/01/konga-02.png?w=636

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 ให้ครับขอให้ทุกคนที่เข้ามาอ่านได้นำบทความนี้ ไปต่อยอดได้นะครับขอบคุณครับ


Open-Source API Management and Microservice Management
Secure, Manage & Extend your APIs or Microservices with plugins for authentication, logging, rate-limiting, transformations and more.
ชีวิตดีเพราะมี Kong ช่วยทำ API Gateway
ล่าสุดงานฝั่ง Back-end ของผมก็เริ่มเป็นชิ้นเป็นอันซักที หลังจากที่ใช้เวลากับมันมานานเหลือเกิน (เพราะไม่ยอมอ่าน Documentation หรือป่าวก็ไม่รู้) และสิ่งที่ต้องทำต่อจากนี้ก็คือต้องเตรียม Deploy ขึ้น…
personal-by-molysulfur/kong-nest-microservices-example
Contribute to personal-by-molysulfur/kong-nest-microservices-example development by creating an account on GitHub.