Odwrócony proxy i routing
1) Odwrócona rola proxy
Odwrócony proxy - „przednia linia” platformy: akceptuje TLS, dystrybuuje ruch między upstream, stosuje zasady bezpieczeństwa i wydajności. Celem jest minimalna opóźnienie, przewidywalna trasa i szybkie odizolowanie poniżających instancji/stref.
2) Warstwy i protokoły
L4: TCP/UDP proxy (SNI-based TLS passthrough, QUIC). Niska cena, bez zrozumienia HTTP.
L7: HTTP/1. 1-2-3, gRPC, WebSocket. Bogaty routing (host, ścieżka, nagłówki, pliki cookie), transformacje i pamięć podręczną.
Model TLS: zakończyć na obwodzie (NGINX/Envoy), wewnątrz - mTLS/mesh. SNI umożliwia wirtualne hosty na tym samym IP.
3) Strategie routingu (L7)
1. Hosta: według domeny ('api. marki. com '→ cluster' marka-api ').
2. Ścieżka: '/v1/payments '→' payments-svc', '/v1/wallets '→' portfele-svc'.
3. Na podstawie nagłówka: „X-Region: eu-central”, „X-Najemca: 42”, „User-Agent ”/„ Accept”.
4. Oparte na plikach cookie: testy A/B, sesje lepkie.
5. Ważony/Kanaryjski: procent ruchu do nowej wersji (1-5% → 100%).
6. Geo/ASN: według kraju/ASN wysłany do najbliższego POP/region.
7. Konsekwentne hashing: powiązanie klucza (user_id/tenant_id) z instancją → lokalizacja pamięci podręcznej/lepkość.
8. Shadow/Mirroring: kopiowanie ruchu do „cienia” w górę strumienia bez wpływu na odpowiedź (w przypadku testów regresji).
4) Wyważenie i tolerancja uszkodzeń
Algorytmy: round-robin, least-request, random, ring-hash (consistent).
Kontrole zdrowotne: aktywne (HTTP/TCP) + pasywne (kodami/terminami).
Wyrzut zewnętrzny: tymczasowo „knock out” host ze zwiększonym błędem/opóźnieniem.
Ponowne próby: ograniczone, z wypróbowaniem czasu i jitterem; nie wycofywać niebezpiecznych metod bez idempotencji.
Łączenie połączeń: zachować ciepłe baseny do góry rzeki, ograniczyć wzloty.
5) Wydajność obwodu
Buforowanie: za pomocą klawisza (metoda + host + ścieżka + Vary), warunków 'ETag/If-None-Match', TTL i stale-while-revalidate.
Kompresja: brotli/gzip dla odpowiedzi tekstowych.
HTTP/2/3: multipleksowanie, kompresja nagłówka; Sprawdź zgodność WAF/IDS.
Żądanie koalescingu - Załamać równoległe żądania dla tego samego klucza pamięci podręcznej.
6) Bezpieczeństwo na serwerze proxy
TLS: 1. 2 + (lepszy niż 1. 3), zszywanie OCSP, HSTS.
Filtry WAF/bot: przed routing do aplikacji.
CORS/CSP/Fetch-Metadane: zgodnie z polityką.
Nagłówek-мибиена: "X-Forwarded-For/Proto", "Forwarded", "Traceparent'; wtrysk nagłówka i zabezpieczenie przed nadmiernym rozmiarem.
Limity ciała/nagłówków: wczesne 413/431 dla wzorów DoS.
mTLS dla integracji partnerów i wewnętrznych interfejsów API.
7) Programy wdrażania: kanaryjski/niebiesko-zielony/wersje
Ważony poziom routingu на-7 (1%, 5%, 25%, 50%, 100%).
Brama nagłówka: włącz funkcję według flagi/nagłówka (wewnętrzna/testowa).
Niebiesko-zielony: pełny przełącznik DNS/trasy, szybki zwrot.
Cień: równoległy przebieg nowej wersji z wpisem mierników/kłód.
8) Lepkie sesje i routing hash
Lepkość plików cookie ('Set-Cookie: SRV = shard-a; Ścieżka =/; Tylko ') dla obciążeń statecznych.
Ring-hash/consistent by 'user _ id/tenant _ id' - reduce cache cross-disabilities.
Uwaga: unikać „wiecznej” lepkości dla zapisu ładunków → hot-spot; Użyj lokatora kwot.
9) Trasa regionalna i geograficzna
Anycast + geo-DNS, aby wybrać najbliższy POP.
Nadmiar nagłówka (na przykład „X-Region”) do testów i debugowania.
Koordynacja z legalnie wymaganą lokalizacją danych (trasa według regionu/jurysdykcji).
10) Obserwowalność i kontrola
Wskaźniki RED: RPS, prędkość błędów (według klas), opóźnienie p95/p99 na trasę/klastra.
Stan zewnętrzny/stan zdrowia: liczba edycji/rekrutacji, tempo powolnego wywoływania.
Kłody: ustrukturyzowane, bez PII; korelacja 'trace _ id'/' span _ id'.
Odwzorowanie (OTel): spans ingress → router → upstream; przykłady na wykresach p99.
11) Przykłady konfiguracji
11. 1 NGINX: host/ścieżka/ważony + kka
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 Wysłannik: header-routing, canary, outlier-ejection, lustering
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: zasady + oprogramowanie pośrednie
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 + manifest dla kanarka (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) Przekształcenia i kompatybilność
Normalizacja nagłówków/ścieżek, spis lokalizacji, kontrola Cache-Control.
gRPC z HTTP/JSON za pośrednictwem tłumaczy (grpc-json-transcoder).
Uaktualnienia WebSocket/HTTP2 - upewnij się, że serwer proxy pomija 'Upgrade '/' Connection'.
13) Scenariusze testowania i chaosu
Załadunek: wybuchy, długi płaskowyż, „długie” ciała (slow-POST).
Wtrysk opóźnienia/straty do góry strumienia → ponowne próbowanie/wyczucie czasu/kontrola zewnętrzna.
Metryka kanaryjska: p95/p99, szybkość błędów nowej wersji vs stare; automatyczny zwrot przez SLO.
Cień: porównanie odpowiedzi (pobieranie próbek) i logiki obok siebie.
14) Antypattery
Globalne rekolekcje z wyłączeniem idempotencji i terminu → podwójne i burza.
Lepkie sesje bez sterowania gorącymi strzałami → skew obciążenia.
Brak kontroli zdrowotnych/wytrysku z zewnątrz → „zgniłe” przypadki w basenie.
Nieograniczone nagłówki/ciała → najprostszy DoS.
Mieszanie transformacji i bezpieczeństwa bez wersji schematu → nieoczekiwane regresje.
Pojedynczy globalny pamięć podręczna bez 'Vary' → błędne odpowiedzi.
15) Szczegóły dotyczące iGaming/Finance
Regionalność: routing według gracza/jurysdykcji marki; izolacja stref płatniczych.
Drogi krytyczne (depozyty/wyjścia): krótkie czasy, jedno powtórzenie, idempotencja; pojedyncze skupiska.
PSP/KYC: dedykowane baseny upstream, ścisłe zasady retry/timeout, circuit-breaker, geo-pins.
kanały AB: bezpieczne eksperymenty z płatnościami/limitami tylko dla ścieżki odczytu; pisać - poprzez flagi i małe procenty.
16) Lista kontrolna gotowości Prod
- TLS 1. 2+/1. 3, zszywanie OCSP, HSTS; poprawne 'X-Forwarded-'.
- Jasne zasady routingu: host/path/header/cookie; dokumentację.
- Kontrole zdrowotne, wyrzucanie na zewnątrz, wypróbowywanie czasu na próbę, przekaźniki ograniczone.
- Ważony/kanaryjski + cień; auto-rollback przez SLO/alert.
- Pamięć podręczna/kompresja/ETag; granice nadwozia/nagłówków; zażądać koalescencji.
- Kłody/ścieżki z "trace _ id'; RED + wskaźniki zewnętrzne/zdrowotne; deski rozdzielcze na trasę/klaster.
- Filtry WAF/bot/CORS; zbyt duża i powolna ochrona POST.
- Sklejone/spójne hashing w razie potrzeby; Sterowanie na gorąco.
- Konfiguracje są wersjonowane, migracje są bezpieczne, sekrety w KMS/Vault.
17) TL; DR
Zakończ TLS na obwodzie i trasę do L7 poprzez host/path/header/cookie. Do zwolnień - ważone kanarka i cień; w przypadku stabilności - kontrole zdrowotne, wytryskiwanie na zewnątrz, ograniczone ponowne próby z wyprzedzeniem na próbę. Użyj pamięci podręcznej, kompresji i spójnego hashingu, gdzie poprawia p95. Zmierz sygnały RED i status klastra, trzymaj WAF i limity rozmiarów. Dla krytycznych tras płatniczych - oddzielne klastry, krótkie SLA i ścisłe zarządzanie retras/idempotency.