API Gateway 設計

API Gateway可以當作給前端用的中間層,以便讓後端提供的服務維持單一職責,讓一個服務做好一件事就好。API 閘道是微服務架構中的一種服務,它為用戶端提供共用層和 API,以便與內部服務進行通信。 API 閘道可以路由請求,轉換協定,聚合資料,並實現一些共用邏輯,如身份驗證和速率限制器等。你可以將 API Gateway 看做是一個享用各種微服務的入口。我們的系統可以有一個或多個 API Gateway,這具體取決於用戶端的需求。例如,我們可以為桌面流覽器,移動應用程式和公共API提供單獨的閘道。

API Gateway 設計架構

在微服務架構中,您可以通過網路配置將服務放置於 DMZ(非軍事區域)中,並通過API Gateway 將其暴露給用戶端。該閘道還可以處理多個身份驗證方法,例如,可以支援基於cookie和基於 token 的身份驗證。因為大多數微服務是需要通過認證才可以使用的。將類似身份驗證的共用邏輯放在 API Gateway 上可以讓你的微服務更加專注。
api gateway

  • 亦可以當作服務分流
    API Gateway as an entry point to microservices

  • 輸入文件格式轉換
    想像一下,在微服務中如果我們使用了 JSON,但是在某個用戶端中只支持 XML 的 API,這個時候就可以把 JSON 轉換 XML 這一過程放在 API Gateway 中,而不是在每個微服務中實現。
    transfer

  • 通訊協定轉換
    微服務架構允許使用不同的協定以便於獲得使用不同技術的優勢。然而,大多數用戶端只支援一種協定。在這種情況下,我們需要轉換用戶端的服務協定。API Gateway 也可以成為介於用戶端和微服務之間的一個協定轉換層,用戶端只使用 HTTP REST 來和各種服務交換資訊,而實際上我們內部的各種微服務可以基於不同的規範、協定來進行資訊傳遞。
    protocol transfer

採用認證優先

const express = require('express')  
const httpProxy = require('express-http-proxy')  
const app = express()

const userServiceProxy = httpProxy('https://user-service')

// Authentication
app.use((req, res, next) => {  
  // TODO: my authentication logic
  next()
})

// Proxy request
app.get('/users/:userId', (req, res, next) => {  
  userServiceProxy(req, res, next)
})

採用服務轉發

const express = require('express')  
const request = require('request-promise-native')  
const app = express()

// Resolve: GET /users/me
app.get('/users/me', async (req, res) => {  
  const userId = req.session.userId
  const uri = `https://user-service/users/${userId}`
  const user = await request(uri)
  res.json(user)
})