ลองเล่น KONG API GATEWAY แบบขำๆ

Sathit Seethaphon
Sathit Seethaphon
Published in
3 min readDec 1, 2017

--

ลองติดตั้งการงาน kong api gateway ด้วย docker

https://getkong.org/

จริงๆ อยากเขียน blog มากๆ นะ ปีหน้านี่คงจริงจัง ตั้งใจว่าจะพักไม่รับงาน อ่านหนังสือ เขียน blog ปลูกผัก 555 แต่ช่วงนี้งานหนักทั้งปีจนไม่ไหวแระ ปีหน้าพักแน่นอน บ่นมาเยอะเข้าเรื่องดีกว่า

API GATEWAY คืออะไร?

มันคือศูนย์รวมการเข้าถึง API ต่างๆ ทุกอย่างต้องผ่านที่นี่ ข้อดีก็คือ เราสามารถจัดการได้ง่าย เช่น เรื่องของการ Authen, การ Limit การเข้าใช้งาน ผมว่ามันเหมาะกับระบบที่มี API เยอะๆ หรือระบบที่เป็น Microservice จะได้จัดการได้สะดวก ลองอ่านที่พี่ปุ๋ยเขียนอธิบายไว้ครับ http://www.somkiat.cc/api-gateway-with-microservice/

ข้อเสียก็คือถ้า API GATEWAY ตายก็คงใช้งานไม่ได้หมด 55 ต้องหาระบบสำรองไว้ครับ แต่เดี่ยวนี้ใช้ docker น่าจะสบายๆ

KONG API GATEWAY คืออะไร

kong api gateway คือ api gateway อีกตัวที่เป็น open source เบื้องหลังมันคือ OpenResty + NGINX ใช้งานง่ายมากๆ สำหรับตัว Admin GUI ก็มีนะ แต่เป็นเวอร์ชัน Kong Enterprise Edition (EE) ซึ่งก็ต้องเสียเงินแหละ แต่เราสายฟรีก็ใช้ Kong Community Edition (CE) เอาละกัน ไม่มี GUI เน้น command line เอา T_T

จริงๆ มันก็มีหลายตัวเหมือนกันนะ api gateway เช่น https://apiumbrella.io/

ลองเล่นกัน

เราจะลองติด kong api gateway เพื่อให้มันทำ reverse proxy ไปตามที่เราตั้งค่าไว้ ซึ่งถ้าเป็นปกติเราก็ต้องไปตั้งค่า nginx กันเอาเองแต่ เราใช้ kong แล้วก็ config ผ่าน restful api เอาง่ายๆ ครับ

ตัวอย่างผมจะสร้างจำลอง domain แบบ local ไว้ทดสอบใน hosts ของเครื่องชื่อ backend.dev แล้วให้มันส่งต่อไปที่ https://blog.sathit.me ซึ่งเวลาที่เข้าไปที่ backend.dev มันก็จะวิ่งผ่าน kong แล้ว kong จะส่งต่อไปที่ https://blog.sathit.me ให้ซึ่งตรงนี้เราอยากจะเอาอะไรมากั้นก็ได้เช่นทำ authen ตัว kong ก็มี plugin ไว้ให้ใช้เยอะทีเดียวเช่น Oauth2, jwt, HMAC, LDAP อื่นๆ ลองดูได้ที่นี่ https://konghq.com/plugins/

ติดตั้ง KONG API GATEWAY ด้วย docker

การติดตั้งทำได้หลายรูปแบบมาก https://konghq.com/install/ ผมเลือก docker เพราะง่ายและสะดวกสุด

ในส่วนแรกเราจะติดตั้ง database ก่อนซึ่งเราจะใช้เป็น postgres ในตัวอย่างมีให้เลือก cassandra ด้วย

สั่งรัน container ชื่อ kong-database และกำหนด user เป็น kong และสร้าง db ชื่อ kong รันที่ port 5432

docker run -d --name kong-database \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
postgres:9.4

จากนันลอง docker ps ดูจะเห็น kong-database แล้ว

จากนั้นเราจะทำการ migrate ข้อมูลด้วยการรัน docker run — rm คือรันเสร็จแล้วก็ปิด container ไปเลย

docker run --rm \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong:latest kong migrations up

จากนั้นเราจะทำการติดตั้งตัว Kong API Gateway

docker run -d --name kong \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-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" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong:latest

แล้วลอง docker ps ดู

ทดลองเรียกใช้งานว่า api ใช้ได้ไหม ใช้ curl

curl -i http://localhost:8001

ใครไม่สะดวกก็ใช้ postman ก็ได้ครับ

ถ้าเข้าใช้งานได้ก็ถึงว่า kong เราพร้อมสำหรับการใช้งานแล้ว

โดย port สำหรับเรียกใช้งานคือ 8000 ส่วน 8001 สำหรับ admin ในการตั้งค่าต่างๆ ผ่าน api ส่วน 8443,8444 ก็สำหรับ https ครับ

ในการใช้งานจริงเราก็สามารถตั้งค่า port จาก 8000 เป็น 80 ได้ครับ

สร้าง API

เดี่ยวผมจะลองให้เข้า backend.dev:8000 แล้วให้มันส่งต่อไปที่ https://blog.sathit.me

เดี่ยวเราไปเพิ่ม domain ใน local สำหรับ mac ให้แก้ไขไฟล์ที่ /etc/hosts สำหรับ windowsที่ c:\Windows\System32\Drivers\etc\hosts แล้วเพิ่ม

127.0.0.1 backend.dev

เข้าไปในไฟล์

จากนั้นให้เราสร้าง api ผ่าน restful-api ซึ่งเราจะใช้ curl ก็ได้หรือ postman ก็ได้ตามสะดวก โดยเราจะสร้าง api ชื่อ satit แล้วคอยดัก hosts ที่ชื่อว่า backend.dev เมื่อไหร่มีการเรียกเข้ามาให้ส่งต่อไปที่ https://blog.sathit.me

รายละเอียด api ดูที่นี่ครับ https://getkong.org/docs/0.11.x/admin-api/#add-api ก็ทำได้หมดอ่ะ เพิ่ม ลบ แก้ไข ดูข้อมูล หรือรายการทั้งหมด

ลองสร้าง ให้เลือกเอาวิธีใดวิธีหนึ่ง

url: http://localhost:8001/apis
method: post

curl

curl -i -X POST \
--url http://localhost:8001/apis/ \
--data 'name=satit' \
--data 'hosts=backend.dev' \
--data 'upstream_url=https://blog.sathit.me'

postman

จากนั้นเราจะได้ข้อมูล api ขึ้นมาเราสามารถดูได้ด้วยคำสั่ง

url: http://localhost:8001/apis
method: get

curl http://localhost:8001/apis

ลองเรียกผ่าน API GATEWAY

เราได้ทำการตั้งค่า คือเมือ่มีการเรียก backend.dev แล้วให้ gateway ส่งต่อไปที่ https://blog.sathit.me

ก็เปิด browser แล้วใส่ url backend.dev:8000 ใส่ 8000 เพราะว่าเรารัน kong ไว้ที่ 8000 มันก็จะวิ่งต่อไปที่ https://blog.sathit.me ให้เลย

ลองไปเล่นกันดูครับจริงๆ มีเยอะ เอาแค่นี้ละกันเนาะเหนื่อยพิมพ์ ฮา…

--

--