API Gateway

2022/02/11閱讀時間約 6 分鐘
API Gateway

API Gateway 是什麼?

參考上圖,API Gateway 是一個程式,位於 Client 和 Microservice 之間。當伺服器架構採用這種設計後,會有以下優點:
  1. 架構彈性 - 當伺服器架構需要調整的時候,Client 不需要調整(前提是 API 維持不變)。
  2. 安全性 - Internet 的使用者都無法直接存取 API Gateway 後面的 service,只能透過 API Gateway 間接存取。所以 service 可開放存取的 API 是有限的,降低惡意使用者攻擊的範圍。

API Gateway 的功能

具代表性的 API Gateway 有 HAProxy、NGINX、Kong、Traefik。我們也可以用自己熟悉的程式語言撰寫 API Gateway,比如用 Ocelot 撰寫。
這些 API Gateway 提供的功能都非常的接近,但是不同的 API Gateway 有廠商自己提供的特殊功能,而以下是常見的功能。

Load balancing

將負載適當的分攤到不同的 service 上,讓伺服器可以服務更多的使用者。
以 Traefik 為範例,以下設定是將 Request 送到不同的 serivce 上:
## Dynamic configuration
http:
  services:
    my-service:
      loadBalancer:
        servers:
        - url: "http://<private-ip-server-1>:<private-port-server-1>/"
        - url: "http://<private-ip-server-2>:<private-port-server-2>/"

Authentication and Authorization

API Gateway 通常會有 Basic Authentication 的功能,Client 提供帳號、密碼才可以存取;甚至更進階的有提供 JWT Authentication,提供 JWT 才可以存取。
以下是 Traefik 設定 Basic Authentication,設定了兩位使用者(帳號、密碼分別是 test/test, test2/test2):
# Declaring the user list
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-auth
spec:
  basicAuth:
    secret: authsecret
---
# Note: in a kubernetes secret the string (e.g. generated by htpasswd) must be base64-encoded first.
# To create an encoded user:password pair, the following command can be used:
# htpasswd -nb user password | openssl base64
apiVersion: v1
kind: Secret
metadata:
  name: authsecret
  namespace: default
data:
  users: |2
    dGVzdDokYXByMSRINnVza2trVyRJZ1hMUDZld1RyU3VCa1RycUU4d2ovCnRlc3QyOiRhcHIxJGQ5
    aHI5SEJCJDRIeHdnVWlyM0hQNEVzZ2dQL1FObzAK

request routing

API Gateway 收到 HTTP Request 後,可以根據 HTTP resource path 決定將 HTTP Request 送到內部網路的服務上,比如 https://www.company.com.tw/api/auth 將 HTTP Request 送到內部網路的 auth service;https://www.company.com.tw/api/order 將 HTTP Request 送到內部網路的 order service。

protocol translation

當 API Gateway 轉發 HTTP Request 的時候,可能內部服務並不是使用 HTTP 通訊協定,比如可能使用 gRPC、TCP、UDP 等等,API Gateway 可以將 HTTP Request 轉換成 gRPC、TCP、UDP 後,送給內部的服務。

Rate-Limiting

Rate-Limiting 可以限制 API 請求的頻率,比如全部的使用者每分鐘只能呼叫 API 10000 次;限制免費使用者每月只能呼叫 1000 次 API。

IP Listing

可以設定 IP 黑名單、白名單。以下是 Traefik 的設定:
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ipwhitelist
spec:
  ipWhiteList:
    sourceRange:
      - 127.0.0.1/32
      - 192.168.1.7

monitoring

提供監控的功能,比如提供 Prometheus, Datadog, InfluxDB, StatsD 的 Metrics。
為什麼會看到廣告
    專注於 C#, DevOps 的工程師
    留言0
    查看全部
    發表第一個留言支持創作者!