Codding Gun

API Gateway กับ Microservices

API Gateway คือ ประตูทางเข้าที่จะนำเราไปสู่ API ที่ให้ปบริการจริงๆ(Upstream service)

และไม่ว่าจะเป็น Monolith หรือ Microservices เราก็ควรจะต้องมี API Gateway เพราะเมื่อเราต้องการความปลอดภัยสิ่งที่เราต้องจัดการคือนำ traffic เข้ามาที่ API Gateway ที่เดียวแล้วคัดกรองว่า request ไหนที่สามารถวิ่งต่อเข้าไปยัง Service ที่เราให้บริการ(Upstream Service) ได้บ้าง เหมือนตอนช่วง Covid ที่เราต้องการให้ทุกคนเดินผ่านเครื่อง scan อุณหภูมิ ทางห้างสรรพสินค้าก็จะปิดประดูทางเข้าให้เหลือเพียงทางเดียวหรือ 2 ทางเพื่อคัดกรอง

API Gateway ดียังไง?

Without API Gateway
ที่มา: https://www.nginx.com/blog/building-microservices-using-an-api-gateway
ใน Microservices เราไม่สามารถปล่อยให้ client(Mobile application หรือ front-end) เข้าถึง microservices ต่างๆได้โดยตรง เนื่องจาก เราจะไม่สามารถจัดการกับสิ่งต่างๆเหล่านี้ได้เลย

เราจึงจำเป็นต้องมี API Gateway เพื่อมาช่วยลดปัญหาต่างๆที่กล่าวมาข้างบน

API Gateway ทำหน้าที่อะไร?

API Gateway
ที่มา: https://www.nginx.com/blog/building-microservices-using-an-api-gateway
เราต้องมี api gateway เพื่อแก้ปัญหาต่างๆที่กล่าวมาด้่านบนเพราะ api gateway จะสามารถสร้าง route เพื่อนำทางไปยัง service ที่ให้บริการ(upstream service)ได้ ในอนาคตเราก็สามารถเปลี่ยนเส้นทางใหม่ได้ เช่น ถ้าเรามี service version ใหม่เราสามารถเปลี่ยน route ให้ชี้ไปยัง service version ใหม่ได้ทันที นอกจากนี้ API gateway ยังสามารถเก็บ log และกำหนดวิธีการ authen และ authorize จากที่เดียวได้ด้วย(เป็น Centralize Model ซึ่งจะง่ายในการควบคุมและรองรับการเปลี่ยนแปลง)

ความสามารถหลักๆ ที่ api gateway สามารถทำได้มีดังนี้

และนอกจากนี้ใน api gateway รุ่นใหม่ๆ จะเพิ่มความสามารถต่างๆ เช่น การใส่ rate limiting เพื่อเพิ่มความปลอดภัยให้กับ microservices หรือ การ mocking service ที่จะช่วยให้เราสามารถสร้าง web api ปลอมๆขึ้นมา ซึ่งจะช่วยให้เราสามารถสร้าง prototype ไปเก็บ requirements ได้ง่ายขึ้น

API Gateway กับ Load Balancers

การที่เราเลือกว่าจะเป็น microservices หรือไม่นั้นความต้องการที่เราอยากได้มากๆคือ High availability และ Auto Scaling ซึ่งการจะมีทั้ง High availability และ Auto scaling นั้นเราจำเป็นต้องมี Load balancers

Load balancers คือ เครื่องมือที่ช่วยให้เรากระจาย requests ที่เข้ามาออกไปยัง services ที่จะมีอยู่มากกว่า 1 instances(ช่วยกันทำงาน)

Load balancers
ที่มา: https://www.nginx.com/blog/introduction-to-microservices

ซึ่งจากรูปเราจะเห็นว่า load balancer จะทำการกระจายการทำงานออกไปยัง Trip management service ที่มีอยู่ 3 instances และอาจมีการเพิ่มขึ้นหรือลดลงได้ในอนาคต

การเป็น API Gateway นั้นอาจไม่จำเป็นต้องทำหน้าที่เป็น Load balancer ก็ได้แต่โดยส่วนมากเราจะขาดฟังก์ชั้นนี้ไปไม่ได้ เราจึงเห็นว่าส่วนมาก api gateway นั้นก็จะทำหน้าที่เป็น load balancer ไปด้วยในตัว

Backend For Frontend(BFF) และ API Gateway

Backend For Frontend(BFF) คือการสร้าง front-end ขึ้นมาเพื่อปรับ response ให้เหมาะกับ client หรือ front-end ที่ส่ง request เข้ามา

ลองจินตนาการถึงหน้่า product details ซึ่งจะต้องระบุถึงรายละเอียดต่างของสินค้าชิ้นนั้นๆ ซึ่งจะเป็นข้อมูลที่ประกอบไปด้วย

ถ้าเป็น monolithic ก็คงจะไม่ได้เป็นปัญหาอะไร เพราะเราแค่ส่ง method GET ไปที่  api.example.com/product/details และระบบก็จะ ไป query ข้อมูลต่างๆด้านบนมาให้เรา ซึ่ง data ทั้งหมดก็จะอยู่ใน database เดียวกันอยู่แล้วไม่มีปัญหา แต่พอเป็น microservices สิ่งที่จะเกิดขึ้นก็คือเราจะต้องส่ง request ไปที่ microservice ต่างๆ ดังนี้

และนอกจากนี้เรายังต้องการข้อมูลต่างๆเหล่านี้ไม่เท่ากันในแต่ละอุปกรณ์ โดยปกติ mobile จะต้องการข้อมูลน้อยกว่า web application ที่เปิดผ่าน browser อยู่แล้วเราจึงต้องการ Backend for frontend มาตอบโจทย์นี้ โดยเราจะสามารถใช้ api gateway มาประยุกต์ดังรูป

API Gateway
รูปภาพแสดงการใช้ api gateway เป็นประตูทางเข้าของ microservices
API Gateway
รูปภาพแสดงการใช้ Backend for frontend(BFF) สำหรับตอบโจทย์ client แต่ละประเภท

ถ้าไม่ใช้ API Gateway ใน Microservices ได้มั้ย?

ได้แน่นอน ซึ่งเราจะต้องออกแบบเป็น service mesh ซึ่งก็จะใช้การฝัง proxy เข้าไปในแต่ละ service ซึ่งเครื่องมือที่ใช้ในการทำ service mesh ก็จะมีทั้ง linkerd และ Istio

การออกแบบเป็น service mesh นั้นมีข้อดีคือการจัดการในรายละเอียดสามารถทำได้ดีกว่า เช่น การใช้ mTLS protocol ในการสื่อสาร หรือการ implement timeout and retries ที่จะช่วยให้ microservices ของเรามี resiliency มากขึ้น แต่แน่นอนเราก็ต้องแลกมากับขนาดของ microservices ที่ใหญ่ขึ้นเพราะต้องแทรก proxy เข้าไปในทุกๆ services ดังนั้นเราก็คววรจะชั่งน้ำหนักให้ดีระหว่างการใช้ api gateway และ service mesh ทางไหนจะมีความคุ้มค่ามากกว่ากัน

ตามไปอ่านต่อเพิ่มเติมได้ที่

Phanupong Permpimol
Follow me