API Gateway กับ Microservices
API Gateway คือ ประตูทางเข้าที่จะนำเราไปสู่ API ที่ให้ปบริการจริงๆ(Upstream service)
และไม่ว่าจะเป็น Monolith หรือ Microservices เราก็ควรจะต้องมี API Gateway เพราะเมื่อเราต้องการความปลอดภัยสิ่งที่เราต้องจัดการคือนำ traffic เข้ามาที่ API Gateway ที่เดียวแล้วคัดกรองว่า request ไหนที่สามารถวิ่งต่อเข้าไปยัง Service ที่เราให้บริการ(Upstream Service) ได้บ้าง เหมือนตอนช่วง Covid ที่เราต้องการให้ทุกคนเดินผ่านเครื่อง scan อุณหภูมิ ทางห้างสรรพสินค้าก็จะปิดประดูทางเข้าให้เหลือเพียงทางเดียวหรือ 2 ทางเพื่อคัดกรอง
API Gateway ดียังไง?
ใน Microservices เราไม่สามารถปล่อยให้ client(Mobile application หรือ front-end) เข้าถึง microservices ต่างๆได้โดยตรง เนื่องจาก เราจะไม่สามารถจัดการกับสิ่งต่างๆเหล่านี้ได้เลย
- เราจะไม่สามารถเปลี่ยนที่อยู่ของ service ได้เพราะ client ต้องรู้ ip address หรือ domain ของ service นั้นๆ ถึงจะสามารถติดต่อได้
- เราจะไม่มี log ของการเรียกใช้งาน service ต่างๆ
- กระบวนการ authentication และ authorization ที่ต้องต่างคนต่างทำ(Implement ในแต่ละ service) จะได้ความปลอดภัยที่น้อย เพราะเราจะบังคับให้มีการ authen และ authorize ให้ครบทุกจุดได้ยากมาก
เราจึงจำเป็นต้องมี API Gateway เพื่อมาช่วยลดปัญหาต่างๆที่กล่าวมาข้างบน
API Gateway ทำหน้าที่อะไร?
เราต้องมี api gateway เพื่อแก้ปัญหาต่างๆที่กล่าวมาด้่านบนเพราะ api gateway จะสามารถสร้าง route เพื่อนำทางไปยัง service ที่ให้บริการ(upstream service)ได้ ในอนาคตเราก็สามารถเปลี่ยนเส้นทางใหม่ได้ เช่น ถ้าเรามี service version ใหม่เราสามารถเปลี่ยน route ให้ชี้ไปยัง service version ใหม่ได้ทันที นอกจากนี้ API gateway ยังสามารถเก็บ log และกำหนดวิธีการ authen และ authorize จากที่เดียวได้ด้วย(เป็น Centralize Model ซึ่งจะง่ายในการควบคุมและรองรับการเปลี่ยนแปลง)
ความสามารถหลักๆ ที่ api gateway สามารถทำได้มีดังนี้
- routing service
- load balancer
- สามารถปรับเปลี่ยนที่อยู่ของ service ได้
- Caching
- ทำ Canary release ได้
- เชื่อมโยงกับ Authentication Service และ Authorization Service ต่างๆได้
และนอกจากนี้ใน 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 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 ซึ่งจะต้องระบุถึงรายละเอียดต่างของสินค้าชิ้นนั้นๆ ซึ่งจะเป็นข้อมูลที่ประกอบไปด้วย
- จำนวนสินค้าในตระกร้า
- ประวัติการสั่งซื้อ
- จำนวนสินค้าคงเหลือใน stock
- ทางเลือกในการส่งสินค้า
- สินค้าแนะนำ
ถ้าเป็น monolithic ก็คงจะไม่ได้เป็นปัญหาอะไร เพราะเราแค่ส่ง method GET ไปที่ api.example.com/product/details และระบบก็จะ ไป query ข้อมูลต่างๆด้านบนมาให้เรา ซึ่ง data ทั้งหมดก็จะอยู่ใน database เดียวกันอยู่แล้วไม่มีปัญหา แต่พอเป็น microservices สิ่งที่จะเกิดขึ้นก็คือเราจะต้องส่ง request ไปที่ microservice ต่างๆ ดังนี้
- ขอข้อมูลพื้นฐานจาก Product Service หรือ Catalog Service
- ขอจำนวนสินค้าในตระกร้าจากShopping Cart Service
- ขอประวัติการสั่งซื้อจาก Order Service
- ขอจำนวนสินค้าคงเหลือใน stock จาก Inventory Service
- ขอทางเลือกในการส่งสินค้าจาก Shipping Service
- ขอสินค้าแนะนำจาก Recommendation Service
และนอกจากนี้เรายังต้องการข้อมูลต่างๆเหล่านี้ไม่เท่ากันในแต่ละอุปกรณ์ โดยปกติ mobile จะต้องการข้อมูลน้อยกว่า web application ที่เปิดผ่าน browser อยู่แล้วเราจึงต้องการ Backend for frontend มาตอบโจทย์นี้ โดยเราจะสามารถใช้ api gateway มาประยุกต์ดังรูป
ถ้าไม่ใช้ 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 ทางไหนจะมีความคุ้มค่ามากกว่ากัน