反向代理和路由
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和严格的撤回/等效性管理。