# 微服務架構設計 - Backend For Frontend Pattern (BFF)


# 前言

介紹 BFF 之前我們先講一下 Client 與 Microservices 直接溝通,我們知道微服務有很多的不同的服務,它們的端點也四散在各處,那當今天網頁或是 App 要存取,就要對各自的端點做請求,看似簡單暴力但也衍伸了許多問題,因此現代很少會使用這種溝通方式


# Direct Client-To-Microservices 問題

  1. Client 與服務高耦合
  2. Client 與服務高網路依賴 - 可能造成延遲
  3. 服務全都暴露給 Client 的安全性問題
  4. 所有接觸 Client 的服務都要做相同的事情,比如驗證

# API Gateway Pattern

由於 Direct Client-To-Microservices 出現了太多問題,後來多數人都使用 API Gateway Pattern 只有單一端口對 Client 開放,有以下特色

  1. 反向代理
  2. 可做 Redirect 將 Client 與 Microservices 解耦
  3. 請求聚合,減少網路溝通成本
  4. 通用邏輯都集中在 Gateway 處理

# API Gateway Pattern 問題

儘管 API Gateway Pattern 看似解決了 Direct Client-To-Microservices 很多問題,但還是有很多隱患

  1. 產生單點故障問題 - 單一節點故障造成整個系統癱瘓
  2. Client 與 Services 多一層 Gateway 可能造成網路延遲
  3. 架構變複雜
  4. 需要由專門的團隊來開發與維護 Gateway

# Backend-For-Frontend Pattern

BFF Pattern 就是來解決 API Gateway Pattern 所帶來的問題的
當 Client 的種類越來越多 (手機、網頁、桌面應用程式),他們都需要單一的端點可能產生一些問題,原因在於每個 Client 所需的格式可能不同 (如 App 需要輕量便捷的設計因此資料結構相較於桌面應用程式簡略),當然遇到這種問題我們可以對 API Gateway 進行額外處理,但是這樣讓架構變得更複雜也不容易擴展,當有新的 Client 種類就要重新添加

因此後來出現了 BFF Pattern 主要的理念是根據 UX 使用者體驗做 API 切分,也就是說對於不同裝置設置不同的 Proxy Server


# Backend-For-Frontend Pattern 優點

  1. 更容易根據 Client 進行調整 API
  2. 每個 Proxy 更容易針對 Client 進行發展,容易維護與擴展

理想狀況是每個 Client Dev Team 負責自已的 BFF Proxy,更能對於 Client 進行反應與改變,Backend Team 就只需要針對系統業務進行開發即可


# 參考資料

  1. 前端開發者該負責寫 API Endpoints 嗎?The Backend For Frontend Pattern (BFF) In Microservices World
更新於