Gateway API中的插件和中間件
1)為什麼需要插件和中間件
API網關是企業策略的執行點。正確組裝的插件鏈:- 標準化安全性(authN/authZ,WAF,CORS),
- 保護可持續性(利率限制,巡回賽決勝局,回歸政策),
- 管理合同(方案驗證、轉型),
- 給出可觀察性(度量,邏輯,跟蹤),
- 降低成本(緩存、重復數據消除、金絲雀規則)。
關鍵:最小潛伏期和明確的應用順序。
2)插件類及其在做什麼
1.識別/身份驗證
JWT/JWKS提供商,OAuth2/OIDC,API密鑰和mTLS(客戶端證書)。
HMAC簽名(webhooks/partners),邊緣的DPoP/PoP。
2.授權授權
RBAC/ABAC/OPA/Cedar(PDP)具有本地解決方案緩存。
BOLA後衛:在標題/上下文中檢查「tenant」/「owner」。
3.網絡和禮賓保護
WAF(OWASP CRS),反機器人(rate/behavioral),Geo/IP/ASN過濾器,TLS配置文件。
CORS,CSP標題,Fetch-Metadata過濾器,CORP/COOP/COEP。
4.可持續性
比例限制(token bucket/GCRA),配額和競爭力。
巡回賽決勝局,計時賽,自適應銜接,裝載共享。
Retry-policy帶有per-try timeout和jitter。
5.轉換和驗證
路徑/標頭普查,車身恢復,JSON/XML ↔,gRPC ↔ HTTP。
模式驗證(OpenAPI/JSON Schema/Protobuf),ID規範化。
6.緩存和性能
響應/幀緩存,ETag/If-None-Match,壓縮和brotli。
請求相同鍵的拼接(coalescing)。
7.可觀察性和審計
RED/USE度量標準,決策編寫(429/403/5xx),跟蹤(W3C Trace-Context/OpenTelemetry),采樣(tail/adaptive)。
審核安全標題和策略版本。
8.生命周期和操作
Canary/blue-green, feature-flags, shadow solutions(編寫,不應用),版本遷移。
3)應用程序(推薦鏈)
[Ingress TLS]
→ Early-Deny (ASN/Geo, IP allow/deny)
→ mTLS / Client Cert Auth
→ JWT/OAuth2 AuthN (JWKS cache)
→ OPA/ABAC AuthZ (solution cache)
→ Rate Limit / Concurrency
→ Circuit / Timeout / Retries (пер-try)
→ Schema Validation (request)
→ Transform (headers/path/body) / CORS
→ Caching (lookup)
→ Upstream Proxy (app)
← Caching (store) / Compression
← Response Transform / Schema Validation (response)
← Logging / Tracing / Metrics / Security Headers
原則:以前-更便宜/更胖子(deny,auth,極限),後來是「化妝品」(轉化,緩存)。
4)性能和基數
堅持O (1)步驟,無需在熱路上進行外部查詢。
所有「外部呼叫」插件(PDP/JWKS)都是通過短TTL和asynchronous refresh進行的。
度量的標簽/標簽是受限基數(「tenant」,「plan」,「route」,但不是「user_id」)。
「重」插件(WAF, body-transform)-選擇性地按路線打開。
5)配置示例
5.1 Envoy: JWT+RateLimit+OPA+Retries(偽)
yaml static_resources:
listeners:
- name: public_listener filter_chains:
- filters:
- name: envoy. filters. network. http_connection_manager typed_config:
route_config:
name: main virtual_hosts:
- name: api domains: ["api. example. com"]
routes:
- match: { prefix: "/v1/payments" }
route:
cluster: payments timeout: 350ms retry_policy:
retry_on: connect-failure,reset,5xx,gateways num_retries: 1 per_try_timeout: 200ms http_filters:
- name: envoy. filters. http. jwt_authn typed_config:
providers:
oidc:
issuer: https://auth. example. com/
remote_jwks:
http_uri: { uri: https://auth. example. com/.well-known/jwks. json, cluster: jwks, timeout: 2s }
cache_duration: 300s forward: true
- name: envoy. filters. http. ext_authz # OPA/Cedar PDP typed_config:
http_service:
server_uri: { uri: http://opa:8181, cluster: opa, timeout: 50ms }
authorization_request: { allowed_headers: { patterns: [{ exact: "authorization" }, { exact: "x-tenant" }] } }
- name: envoy. filters. http. ratelimit typed_config:
domain: public-api rate_limit_service:
grpc_service: { envoy_grpc: { cluster_name: rl } }
- name: envoy. filters. http. router
5.2 NGINX/OpenResty: HMAC+Lua+Redis(偽)
nginx lua_shared_dict jwks 10m;
lua_shared_dict limits 10m;
server {
listen 443 ssl http2;
Early deny by ASN/Geo if ($bad_asn) { return 403; }
HMAC signature check (webhooks/partners)
set_by_lua_block $sig_ok {
return verify_hmac_signature(ngx. var. http_x_signature, ngx. var. request_time, ngx. var. request_body)
}
if ($sig_ok = 0) { return 401; }
Token bucket in Redis access_by_lua_block {
local key = ngx. var. binary_remote_addr.. ":".. ngx. var. request_uri local allowed, retry_after = ratelimit_allow(key, 50, 100)
if not allowed then ngx. header["Retry-After"] = retry_after return ngx. exit(429)
end
}
proxy_read_timeout 300ms;
proxy_connect_timeout 100ms;
proxy_pass http://app_backend;
}
5.3 Kong:沿途插件
yaml services:
- name: payments url: http://payments:8080 routes:
- service: payments paths: ["/v1/payments"]
plugins:
- name: jwt config: { key_claim_name: kid, secret_is_base64: false, run_on_preflight: false }
- name: opa config: { server_url: "http://opa:8181/v1/data/authz/allow", timeout: 50 }
- name: rate-limiting config: { second: 50, policy: redis, redis_host: redis, fault_tolerant: true }
- name: correlation-id config: { header_name: "traceparent" }
- name: response-transformer config: { add: { headers: ["Strict-Transport-Security:max-age=31536000"] } }
5.4 Apache APISIX: JWT + Limit + Proxy-Mirror (shadow)
yaml routes:
- uri: /v1/wallets/
plugins:
openid-connect:
client_id: wallet discovery: "https://auth. example. com/.well-known/openid-configuration"
scope: "openid"
limit-count:
count: 100 time_window: 60 key_type: "var"
key: "remote_addr"
proxy-mirror: # shadow traffic host: "http://shadow-backend:8080"
upstream_id: 1
5.5 Traefik: Middleware連鎖店
yaml http:
middlewares:
hsts-headers:
headers:
stsSeconds: 31536000 stsIncludeSubdomains: true ratelimit:
rateLimit:
average: 50 burst: 100 routers:
api:
rule: "Host(`api. example. com`) && PathPrefix(`/v1`)"
service: app middlewares:
- hsts-headers
- ratelimit
6)多功能性和策略版本
路由密鑰: 「{tenant, plan, region, route, version}」.
插件從mTLS SAN/JWT汙名/標頭中讀取「tenant」,→應用限額/配額/規則。
轉化策略(「policy_version」),引導changelog和金絲雀滾動。
7)測試和滾動
發布之前
合同鏈測試(如果有的話):auth→deny,auth→allow,rate→429,schema→422。
負載:bursts × 10,長高原,「骯臟」模式(慢開機)。
混沌:PDP/JWKS/Redis降解-必須是失敗的/降解到最低安全。
發行版
「Report-Only」/shadow-mode(我們編寫解決方案而無需應用)。
金絲雀流量的1-5%+指標比較(p95/p99,4xx/5xx/429)。
通過SLO/Alert自動回滾。
8)可觀察性和指標
度量標準:- `http_requests_total{route,tenant,plan,status}`
- `request_duration_seconds_bucket{route}` (p95/p99)
- `rate_limited_total{policy}`, `retry_total{reason}`, `circuit_state`
- `authn_fail_total{reason}`, `authz_denied_total{action}`
- `schema_validation_fail_total{route}`
- 預告片:按過濾器演唱,「policy_version」,「tenant」,「limit_key」屬性。
- Logi(采樣):deny/429/5xx解決方案,其中包含原因和「trace_id」。
- Dashbords:執行摘要,per-route,per-tenant,「熱門」策略。
9)安全和操作
所有秘密(HMAC、JWKS私有、API密鑰)-在KMS/Vault,不在config文件中。
敏感路由的deny-by-default策略。
JWKS/PDP緩存短TTL,後端異步更新。
轉換方案的遷移-經過;「打破」-通過雙寫。
限制車身尺寸(DoS)和JSON深度。
10)反模式
每條路線上通用的全包插件集→額外的毫秒和計數。
沒有緩存/時間戳的插件的外部依賴性→級聯時間戳。
沒有過濾器順序:首先是轉換/邏輯,然後是限制-不正確。
指標標簽的高基數(raw'user_id'/'ip')。
在轉換模式中混合authN/authZ(Lua/Jinja中的隱式解決方案)。
編譯秘密/令牌。
一個全局Redis/群集,用於所有限值,不帶硬化/備份。
11) iGaming/財務細節
常規/常規:KYC/AML,制裁,負責任付款限制。
支付路線的強硬政策:短時間,一次重復,等效性(「Idempotency-Key」)。
PSP/KYC SDK(單個域/插件鏈)的周長分離。
審核不變的決策邏輯(結論,鎖定,制裁豁免)。
12)準備就緒支票清單
- 已定義過濾器的順序:authN → authZ → limits → circuit/timeout → schema → transform → cache。
- Per路線插件集;沈重-僅在需要的地方。
- 具有短TTL和緩存的JWKS/PDP;定時和倒退策略。
- Rate/Quota/Concurrency-密鑰設計,存儲硬盤。
- RED/USE指標集、OTel跟蹤、tail/adaptive sampling。
- 金絲雀+影子模式,通過SLO自動回滾。
- KMS/Vault中的秘密;configs是可轉換的,有遷移。
- 身體限制/頭條;超大/慢開機自檢保護。
- 客戶文件:編碼401/403/409/422/429/5xx,「Retry-After」,標題示例。
13) TL;DR
建立「早期故障→身份驗證/授權→限制/可持續性→轉換→驗證/緩存→遙測」鏈。僅啟用所需的per-route插件,緩存外部解決方案(JWKS/PDP),設置時間表和返回策略,控制度量的基數。通過影子/金絲雀發布,在KMS/Vault中保持秘密,並測量每個插件對p95/p99的影響。