ลองเล่น KONG API GATEWAY แบบขำๆ
ลองติดตั้งการงาน kong api gateway ด้วย docker
จริงๆ อยากเขียน 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 ให้เลย
ลองไปเล่นกันดูครับจริงๆ มีเยอะ เอาแค่นี้ละกันเนาะเหนื่อยพิมพ์ ฮา…