常見的微服務架構(Microservice)中,會將各服務拆分到各個容器(container),但也導致一些問題。
- 每一次為了要完成使用者提出的需求可能都會一次打出數個到數十個請求到各個微服務容器去,這對客戶來說非常不友善
- 另一個問題是客戶使用的Protocol不一定相同(比如REST、AMQP),每個微服務都必須要先驗證是否請求類型支援使得重複性增加
- 又或是需要重構整個微服務,但由於使用者是直接面向微服務本身的所以導致窒礙難行
為了解決以上的諸多問題,通常會搭配API Gateway來統一管理。API Gateway是介於Client端和後端中間的調度者,提供統一窗口給使用者,並負責管理使用者請求和處理給使用者的回應,針對不同的微服務,介於中間層的API Gateway有以下幾種優勢
- 作為Client和Server之間的緩衝層
- 提前驗證一些錯誤,以防止Server花太多資源處理錯誤
- 作為類似Proxy的存在,可以避免Client直接訪問後端Server
API Gateway主要應用的功能如下
- 授權和驗證安全性 Authentication and Security Policy Enforcement
- 請求重組以及導流 Request Composition and Routing
- 負載平衡和斷路器模式 Load Balancing and Circuit Breaking
- 協議轉換和服務探索 Protocol Translation and Service Discovery
- 監控、分析和記帳 Monitoring, logging, analytics and billing
- 快取 caching
除了本地端的API Gateway之外,由於雲端化的興起,三大雲端業者都有推出API Gateway的服務,以下列出幾個市面上常見的API Gateway工具
- Amazon API Gateway
- Apigee (Google Cloud API Gateway)
- Azure API Management
- Kong
- Apache APISIX
- F5 NGINX Plus
- HA Proxy
- 3scale (Red Hat)
授權和驗證安全性 Authentication and security policy enforcement
API gateway就類似於警衛大樓的警衛,要到達住家之前必須先通過前台警衛的驗證和給你電梯卡的授權,雖然需要多聘用警衛和加裝門禁卡,但有了這一層可以有效地避免許多惡意攻擊,如DDos(Distributed Denial of Service) & DOS(Denial of Service)。
請求重組以及導流 Request Composition and Routing
授權驗證和確認過安全性之後,API gateway會根據請求把它拆分或是組合並導流到對應的多個微服務,同時也提供限流的功能。
負載平衡和斷路器模式 Load Balancing and Circuit Breaking
- load balancing – 透過API gateway的load balancing功能,我們可以把請求分散到多個的instances,有效率地使用後端的資源,load balancing的好處就是假如其中有一個instance掛了,那他也不會影響整個服務的完整性,頂多就是performance稍差一(假如loading很重的話😂)。
- Circuit Breaking – 概念類似於電路裡面的斷路器,當今天請求面向的服務裡有某元件出錯或回傳異常,會暫時關閉對該服務的支援以防止大量的請求導致更嚴重的問題,通常擁有關閉(Close)、打開(Open)、半開(Half-Open)的功能,關閉之後過一陣子會半開讓一個請求通過,如果通過的話則再次打開該服務的通道。
註:API gateway注重於OSI(Open System Interconnection Model)裡的第七層,可以處理如Header、Domain、HTTP/HTTPs的數據,而Load balancer則著重於第四層,Load balancer僅適合用於單體後端服務,不像API gateway來的靈活
協議轉換和服務探索 Protocol Translation and Service Discovery
- Protocol Translation – 假設我們的API Server支援HTTP和gRPC的傳輸方式,那API gateway可以接受所有型別的請求,再由API gateway轉換後分配到後端相對應的服務,可以單純化微服務的開發,因為可以簡單預期所有請求都會是預期的型別,而當Server回傳時,API gateway也可以把它翻譯成Client看得懂的資料。
- Service Discovery – 可能是透過DHCP、DNS查找、也可能是透過配置文件、標籤、環境變數也可能是由統一的中心化服務來處理,客戶只要向該Server請求就可以查找需要的服務,關於詳細的細節展開可以參考這篇文章 -> 《Service Discovery Concepts》
監控、分析和記帳 Monitoring, logging, analytics and billing
- Monitoring & Logging – 監控和紀錄API歷程和是否擁有錯誤,提醒和方便開發者debug,同時也可以統一管理和觀察API的使用情形,幫助我們優化服務。
- API Analytics – API gateway可以將Client的請求做分析,來瞭解API的實際表現如何,API Gateway是雙向的,除了處理來自Client的請求之外,他也可以去監控和分析後端的表現,比如計算記憶體容量,佔用多少資源等等,把數據整合後做分析也可以做到有效監控服務的效果。
- API Gateway可以把資料串間到如Kafka、Google Logging Service來做到即時分析,以及支援將metric串接到Prometheus、datadog等以實現及時監控。
快取 caching
把部分重複性高的請求回覆快取在API gateway這一層可以有效減輕整體微服務的loading。
總結
本篇文章帶大家初步了解API gateway在軟體開發中扮演的角色,雖然使用API Gateway是需要更多的開發和管理,並持續地更新來支持新的服務,但隨著API的需求越來越複雜,在現代軟體開發中,可擴展性(saclibility)、安全性(security)、表現(performance)已經是開發中必須考慮的課題,而使用API gateway可以達到上述說的種種需求,在一個專案中,當API開發的越來越多,API Gateway的價值會也越來越重要。
參考連結
What is an API Gateway
What is load balancer