GH GambleHub

反向代理和路由

1)反向代理角色

反向代理是平臺的「前線」:接受TLS,在應用程序之間分配流量,並應用安全和性能策略。目標是最小潛伏期,可預測的路由以及降解的實例/區域的快速隔離。

2)圖層和協議

L4: TCP/UDP proxy (SNI-based TLS passthrough, QUIC).低價,不了解HTTP。
L7: HTTP/1.1–2–3, gRPC, WebSocket.豐富的路由(主機、路徑、頭端、cookies)、轉換和緩存。

TLS模型:在外圍(NGINX/Envoy),內部為mTLS/mesh。SNI允許一個IP上的虛擬主機。

3)路由策略(L7)

1.基於主機:按域('api.brand.com '→ cluster' brand-api')。

2.Path-based: `/v1/payments` → `payments-svc`, `/v1/wallets` → `wallets-svc`.

3.Header-based: `X-Region: eu-central`, `X-Tenant: 42`, `User-Agent`/`Accept`.

4.基於Cookie:A/B測試,「粘性」會話。
5.加重/金絲雀:每個新版本的流量百分比(1-5% → 100%)。
6.Geo/ASN:通過國家/ASN發送到最近的ROR/區域。
7.一致搶購:將密鑰(user_id/tenant_id)綁定到實例→緩存鎖定/粘性。
8.Shadow/Mirroring:將流量復制到「影子」應用程序,而不影響響應(用於倒退測試)。

4)平衡和容錯

算法: round-robin, least-request, random, ring-hash (consistent).

健康檢查:主動(HTTP/TCP)+被動(通過代碼/時間戳)。
Outlier ejection:以增加錯誤/潛伏期暫時地「敲掉」主機。
Retries:受限制,帶有按時間計時和抖動;不要在沒有相容性的情況下重新設計不安全的方法。
連接池:將戰池保持在apstrims上,限制高點。

5)外圍性能

緩存:按鍵(method+host+path+Vary),條件「ETag/If-None-Match」,TTL和stale-while-revalidate。
壓縮:brotli/gzip用於文本響應。
HTTP/2/3:多路復用,頭部復制;確保WAF/IDS兼容性。
請求緩存:將並行查詢捕獲到相同的緩存密鑰。

6)代理安全

TLS: 1.2+(優於1。3), OCSP stapling, HSTS.

WAF/機器人過濾器: 在路由到app.

CORS/CSP/Fetch-Metadata:根據政策。
Header-гигиена: `X-Forwarded-For/Proto`, `Forwarded`, `traceparent`;頭部噴射和超大保護。
Body/headers極限:DoS模式的早期413/431。
用於合作夥伴集成和內部API的mTLS。

7)Deploe方案: 金絲雀/藍綠色/版本

Weighted routing на level-7 (1%, 5%, 25%, 50%, 100%).

Header-gate:包括標記/標題(內部/測試)。
藍綠色:完全切換DNS/route,快速回滾。
Shadow:新版本的並行運行,並記錄指標/邏輯。

8)粘貼會話和哈希路由

Cookie-stickiness (`Set-Cookie: SRV=shard-a;Path=/;HttpOnly')用於stateful負載。
通過「user_id/tenant_id」進行ring-hash/consistent是緩存交叉障礙的減少。
警告:避免在熱點→為寫作載荷提供「永恒」粘性;使用配額常數。

9)區域和地理路由

Anycast+geo-DNS選擇最近的POP。
用於測試和調試的Header-override(例如「X-Region」)。
與法律規定的數據本地化(區域/管轄區路線)保持一致。

10)可觀察性和控制

RED指標:RPS,error-rate(按類),latency p95/p99 per-route/cluster。
Outlier/health:彈出量/重復包含量,慢通話率。
Logs:結構化,沒有PII;韓語「trace_id」/「span_id」。
Tracing(OTel):ingress→router→upstream的睡眠;p99圖表上的exemplars。

11)配置示例

11.1 NGINX: host/path/weighted + кэш

nginx map $http_x_canary $canary { default 0; "1" 1; }
upstream app_v1 { least_conn; server 10. 0. 0. 1:8080 max_fails=3 fail_timeout=10s; }
upstream app_v2 { least_conn; server 10. 0. 0. 2:8080; }

server {
listen 443 ssl http2;
server_name api. example. com;

Кэш proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=apicache:256m max_size=10g inactive=10m use_temp_path=off;

location /v1/ {
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Request-ID $request_id;
proxy_read_timeout 300ms; proxy_connect_timeout 100ms;

Weighted: 5% on v2 if canary = 1, otherwise 0%
set $backend app_v1;
if ($canary) { set $backend app_v2; }
proxy_pass http://$backend;
}

Static with cache location/assets/{
proxy_cache apicache;
proxy_cache_valid 200 10m;
add_header Cache-Control "public, max-age=600";
proxy_pass http://static_cluster;
}
}

11.2 Envoy: header-routing, canary, outlier-ejection, mirroring

yaml static_resources:
clusters:
- name: svc_v1 type: STRICT_DNS lb_policy: LEAST_REQUEST outlier_detection:
consecutive_5xx: 5 interval: 5s base_ejection_time: 30s max_ejection_percent: 50
- name: svc_v2 type: STRICT_DNS lb_policy: LEAST_REQUEST
- name: mirror_svc type: STRICT_DNS

listeners:
- name: https filter_chains:
- filters:
- name: envoy. filters. network. http_connection_manager typed_config:
route_config:
virtual_hosts:
- name: api domains: ["api. example. com"]
routes:
- match:
prefix: "/v1"
headers:
- name: "X-Region"
exact_match: "eu"
route:
cluster: svc_v1 timeout: 350ms retry_policy:
retry_on: connect-failure,reset,5xx num_retries: 1 per_try_timeout: 200ms request_mirror_policies:
- cluster: mirror_svc runtime_key: mirror. enabled
- match: { prefix: "/v1" }
route:
weighted_clusters:
clusters:
- name: svc_v1 weight: 95
- name: svc_v2 weight: 5

11.3 Traefik: rules + middleware

yaml http:
routers:
api:
rule: "Host(`api. example. com`) && PathPrefix(`/v1`)"
service: svc middlewares: [hsts, compress]
middlewares:
hsts:
headers:
stsSeconds: 31536000 stsIncludeSubdomains: true compress:
compress: {}
services:
svc:
weighted:
services:
- name: v1 weight: 95
- name: v2 weight: 5

11.4 Kubernetes: Ingress+金絲雀宣言(NGINX Ingress)

yaml apiVersion: networking. k8s. io/v1 kind: Ingress metadata:
name: api annotations:
nginx. ingress. kubernetes. io/canary: "true"
nginx. ingress. kubernetes. io/canary-weight: "5"
spec:
rules:
- host: api. example. com http:
paths:
- path: /v1 pathType: Prefix backend:
service:
name: svc-v1 port: { number: 8080 }

12)轉換和互操作性

標題/路徑正常化,「位置」普查,「緩存控制」控制。
gRPC ↔ HTTP/JSON通過轉換器(grpc-json-transcoder)。
WebSocket/HTTP2升級:確保代理跳過「升級」/「連接」。

13)測試和混亂場景

負載:bursts,長高原,「長」身體(慢發)。
將延遲/損失註入應用程序中→檢查retries/timeout/outlier。
金絲雀度量:p95/p99,新版本vs舊版本;通過SLO自動回滾。
影子:對比響應(采樣)和側面邏輯。

14)反模式

不考慮偶然性和截止線的全球逆轉→雙重和風暴。
不受「熱」縫隙控制的sticky會話→負載偏斜。
缺少health-checks/outlier-ejection →池中的「腐爛」實例。
無限制的標題/身體→最簡單的DoS。
在沒有方案版本的情況下,轉換和安全性的混合→意想不到的倒退。
沒有「Vary」的單全局密鑰→錯誤的答案。

15) iGaming/財務細節

區域性:通過玩家/品牌管轄權進行路由;隔離支付區域。
關鍵路線(存款/結論):短時間停頓,一次重播,平均水平;各個群集。
PSP/KYC:專用的上遊池,嚴格的撤退/定時政策,巡回賽決勝局,地質泡沫。
AB通道:僅用於閱讀路徑的安全支付/限額實驗;寫作-通過旗幟和小比例。

16)準備就緒支票清單

[] TLS 1.2+/1.3, OCSP stapling, HSTS;正確的「X-Forwarded-」。
  • 明確的路由規則:host/path/header/cookie;文件。
  • Health-checks, outlier-ejection, per-try timeout,限時回程。
[] Weighted/canary + shadow;通過SLO/Alert自動回滾。
  • 緩存/壓縮/ETag;人體/頭部限制;request coalescing.
  • 帶有「trace_id」的徽標/腳本;RED+outlier/健康指標;dashbords per-route/cluster。
  • WAF/機器人過濾器/CORS;超大和慢開機自檢保護。
  • 在需要時進行sticky/consistent hashing;控制熱心。
  • Configs在KMS/Vault中進行翻新,遷移是安全的。

17) TL;DR

將TLS切入周邊,然後通過host/path/header/cookie路由L7。對於發行版-加權金絲雀和陰影;對於可持續性-健康檢查,脫衣舞表演,帶有按時間順序的有限視圖。在改進p95的地方使用緩存、壓縮和自覺打包。測量RED信號和群集狀態,保持WAF和尺寸限制。對於關鍵的支付路徑-單獨的集群,短的SLA和嚴格的撤回/等效性管理。

Contact

與我們聯繫

如有任何問題或支援需求,歡迎隨時聯絡我們。我們隨時樂意提供協助!

開始整合

Email 為 必填。Telegram 或 WhatsApp 為 選填

您的姓名 選填
Email 選填
主旨 選填
訊息內容 選填
Telegram 選填
@
若您填寫 Telegram,我們將在 Email 之外,同步於 Telegram 回覆您。
WhatsApp 選填
格式:國碼 + 電話號碼(例如:+886XXXXXXXXX)。

按下此按鈕即表示您同意我們處理您的資料。