Плагинҳо ва миёнаравӣ дар Gateway API
1) Чаро ба шумо плагинҳо ва миёнаравӣ лозиманд
Дарвозаи API - нуқтаи татбиқи сиёсати корпоративӣ. Занҷири васлшудаи дуруст насбшуда:- стандартикунонии бехатарӣ (auth
- устувориро муҳофизат мекунад (маҳдудияти суръат, схемаи барқ, сиёсати такрорӣ),
- шартномаро идора мекунад (тасдиқи схемаҳо, дигаргуниҳо),
- мушоҳидаҳоро медиҳад (ченакҳо, гузоришҳо, пайгирӣ),
- Хароҷотро коҳиш медиҳад (кэш, такроркунӣ, қоидаҳои канарӣ)
Калид: таъхири ҳадди аққал ва мувофиқати дақиқи барнома.
2) Синфҳои плагин ва онҳо чӣ кор мекунанд
1. Шиносоӣ/Аутентификатсия
Провайдерҳои JWT/JWKS, OAuth2/OIDC, калидҳои API, MTLS (сертификати муштарӣ).
Имзоҳои HMAC (webhooks/шарикон), DP op/POP дар канор.
2. Авторизатсия
RBAC/ABAC/OPA/Сидар (PDP) бо кэши ҳалли маҳаллӣ.
BOLA-посбон: санҷиши 'иҷорагир '/' соҳиби' дар сарлавҳаҳо/контекст.
3. Ҳифзи шабака ва протокол
WAF (OWASP CRS), анти-ботҳо (суръат/рафтор), филтрҳои Geo/IP/ASN, профилҳои TLS.
CORS, сарлавҳаҳои CSP, филтрҳои Fetch-Metadata, CORP/COOP/COEP.
4. Устуворӣ
Маҳдудияти нархҳо (сатил токен/GCRA), квотаҳо ва рақобатпазирӣ.
Қатъи гардиш, танаффус, мувофиқати мутобиқшавӣ, рехтани сарборӣ.
Retry-сиёсат бо вақти танаффус ва jitter.
5. Тағирот ва тасдиқкунӣ
Path/Header Барӯйхатгирии аҳолӣ, аз нав сабт кардани бадан, JSON/XML ↔, GRPC ↔ HTTP.
Тасдиқи схема (Schema Schema/Protobuf), нормализатсияи ID.
6. Кэшинг ва иҷрои
Кэши вокуниш/фрагмент, ET bag/If-None-Match, фишурдасозӣ, brotli.
Барои ҳамон калидҳо пошхӯрии (муттаҳидшавӣ) дархост кунед.
7. Мушоҳида ва аудит
Андозагирии RED/USE, сабти қарорҳо (429/403/5xx), пайгирӣ (W3C Trace-Context/Open-Telemetry), интихоб (дум/мутобиқшавӣ).
Сарлавҳаҳои амнияти аудит ва версияҳои сиёсат.
8. Давраи зиндагӣ ва амалиёт
Канарӣ/кабуд-сабз, парчамҳои хусусият, ҳалли сояҳо (журнал, татбиқ намешавад), муҳоҷирати версия.
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
Принсип: пештар - арзонтар/марговартар (инкор, аут, маҳдудиятҳо), баъдтар - "косметика" (табдилдиҳӣ, кэш).
4) Иҷро ва кардинализм
Қадамҳои O (1) -ро бидуни дархостҳои беруна дар роҳи гарм часпонед.
Ҳама плагинҳои "зангҳои беруна" (PDP/JWKS) тавассути TTL кӯтоҳ ва таровати асинхронӣ мебошанд.
Тамғакоғазҳо/тамғакоғазҳо барои ченакҳо - кардиналии маҳдуд ('иҷорагир', 'нақша', 'масир', аммо 'корбар _ ид').
Плагинҳои "вазнин" (WAF, тағирёбии бадан) - ба таври интихобӣ дар як масир имкон медиҳанд.
5) Намунаҳои конфигуратсия
5. 1 Фиристанда: JWT + Rate .Limit + OPA + Retris (псевдо)
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/Кушодан: HMAC + Луа + Редис (псевдо)
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 Конг: плагинҳо дар тӯли масир
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 + Лимит + Прокси-Зеркало (соя)
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: занҷири миёнаравӣ
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) Версияҳои бисёрсоҳавӣ ва сиёсат
Калиди масир: '{иҷорагир, нақша, минтақа, масир, версияи}'.
Плагинҳо 'иҷорадиҳанда' -ро аз мӯҳри/сарлавҳа/JWT MTLS SAN/JWT мехонанд → маҳдудиятҳо/квотаҳо/қоидаҳоро ба иҷорагир татбиқ кунед.
Сиёсатҳои версия ('policy _ version'), тағирдиҳӣ ва канарейкаро ворид кунед.
7) Озмоиш ва иҷрои он
Пеш аз озод шудан
Санҷишҳои занҷираи шартномавӣ (агар-пас ҷадвал): auth → инкор, auth → иҷозат диҳед, меъёри → 429, схема → 422.
Боркунӣ: таркишҳо × 10, доманакӯҳҳои дароз, намунаҳои "ифлос" (суст-POST).
Бесарусомонӣ: таназзули PDP/JWKS/Redis - бояд то ҳадди аққал бехатар бошад.
Нашр
'Ҳисобот-танҳо '/режими сояҳо (қарорҳои сабти бе барнома).
Канария 1-5% трафик + муқоисаи метрӣ (p95/p99, 4xx/5xx/429).
Бозгашти худкор дар SLO/огоҳиҳо.
8) Мушоҳида ва ченакҳо
Нишондиҳандаҳо:- 'http _ дархостҳо _ total {масир, иҷорагир, нақша, мақом}'
- 'request _ disteration _ seconds _ сатил {маршрут}' (p95/p99)
- 'rate _ limited _ total {policy}', 'retry _ total {сабаб}', 'circuit _ state'
- 'authn _ fail _ total {сабаб}', 'authz _ redied _ total {амал}'
- 'schema _ validation _ fail _ total {маршрут}'
- Нишонаҳо: фосила дар як филтр, атрибутҳои 'policy _ version', 'иҷорагир', 'limit _ key'.
- Гузоришҳо (интихобшуда): ҳалли/429/5xx бо сабабҳо ва 'trace _ id'.
- Панели панелҳо: Exec-хулоса, дар як масир, ба ҳар як иҷорагир, сиёсатмадорони "гарм".
9) Бехатарӣ ва амалиёт
Ҳама асрҳо (HMAC, JWKS хусусӣ, калидҳои API) - дар KMS/Vault, на дар файлҳои конфигуратсия.
Сиёсати пешфарз барои хатсайрҳои ҳассос.
Кэши кӯтоҳ TTL JWKS/PDP, навсозиҳои асинхронӣ бо бозгашт.
Муҳоҷирати схемаҳои трансформаторӣ - вертсия; "шикастан" - тавассути навиштани дугона.
Маҳдудияти андозаи бадан (DOS) ва умқи JSON.
10) Антипаттернҳо
Маҷмӯи универсалии ҳамаҷонибаи плагинҳо дар ҳар як масир → миллисекундҳо ва векселҳои иловагӣ.
Вобастагии берунаи плагинҳо бидуни кэш/танаффус → вақти танаффус.
Набудани тартиби филтр: аввал трансформатсия/мантиқ, баъд маҳдудиятҳо - нодуруст.
Кардиналии баланди тамғакоғазҳои метрикӣ (хом 'user _ id '/' ip').
Омезиши auth .N/auth-Z дар шакли трансформатсия (қарорҳои номуайян дар Lua/Jinja).
Сабти асрори/нишонаҳо.
Як Redis/кластери ҷаҳонӣ барои ҳама маҳдудиятҳо бидуни shardiness/reserve.
11) Хусусиятҳои IGaming/Finance
Қоидаҳои ҳар як иҷорагир/ба ҳар як қаламрав: KYC/AML, таҳримот, маҳдудиятҳои пардохтҳои масъул.
Сиёсати сахт барои хатсайрҳои пардохт: танаффуси кӯтоҳ, як такрор, аблаҳӣ ('Idempotency-Key').
Тақсим кардани периметрҳо барои PSP/KYC SDK (доменҳои алоҳида/занҷирҳои плагин).
Аудити сабтҳои тағйирнопазири қарор (хулоса, бастан, рад кардани санксия).
12) Рӯйхати санҷиши омодагии Prod
- Тартиби филтр auth
- Маҷмӯи плагинҳо дар як масир; вазнин - танҳо дар ҷойҳои зарурӣ.
- JWKS/PDP бо TTL кӯтоҳ ва кэш; вақти истироҳат ва стратегияҳои бозгашт.
- Нарх/Квота/Мувофиқат - калидҳо тарҳрезӣ шудаанд, нигоҳдории анбор.
- Маҷмӯи метрикии RED/USE, пайгирии OTel el, интихоби дум/мутобиқшавӣ.
- Ҳолати Canary + соя, худкор аз ҷониби SLO.
- Асрҳо дар KMS/Vault; конфигуратсияҳо - санҷидашуда, бо муҳоҷират.
- Маҳдудиятҳои бадан/сарлавҳаҳо; муҳофизати азим/суст-POST.
- Ҳуҷҷатҳои муштариён: рамзҳои 401/403/409/422/429/5xx, 'Retry-After', сарлавҳаҳои мисол.
13) TL; ДР
Сохтани занҷири "нокомии барвақтӣ → аутентификатсия/авторизатсия → маҳдудиятҳо/пойдорӣ → § тасдиқи трансформатсия/кэш → телеметрия". Танҳо плагинҳои заруриро дар як масир, қарорҳои берунаи кэшро (JWKS/PDP) фаъол созед, вақтро таъин кунед ва сиёсатҳои такрорӣ, кардинализатсияи ченакҳоро назорат кунед. Озод кардан тавассути соя/канарӣ, сирри худро дар KMS/Vault нигоҳ доред ва таъсири ҳар як плагинро дар p95/p99 чен кунед.