API Gateway плагиндер жана Middleware
1) Эмне үчүн плагиндер жана middleware керек
API-шлюз - корпоративдик саясатты мажбурлап аткаруунун чекити. Туура плагин чынжыр чогултулган:- коопсуздук стандарттары (authN/authZ, WAF, CORS),
- туруктуулукту коргойт (rate limit, circuit breaker, retry-policies),
- (схемаларды валидациялоо, трансформациялоо),
- байкоо (метрика, логи, трассировка),
- наркын төмөндөтөт (кэш, дедупликация, канарейка эрежелери).
Ачкыч: минималдуу жашыруун жана так колдонуу ырааттуулугу.
2) плагин класстары жана алар эмне
1. Идентификация/аутентификация
JWT/JWKS-провайдерлер, OAuth2/OIDC, API-ачкычтар, mTLS (client cert).
HMAC кол (Webhook/өнөктөштөр), DPoP/PoP четинде.
2. Авторизация
RBAC/ABAC/OPA/Cedar (PDP) жергиликтүү чечим кэш менен.
BOLA-guard: текшерүү 'tenant '/' owner' аталыштары/контекстинде.
3. Тармактык жана протоколдук коргоо
WAF (OWASP CRS), antibot (rate/behavioral), Geo/IP/ASN фильтрлери, TLS профилдери.
CORS, CSP аталыштары, Fetch-Metadata чыпкалар, CORP/COOP/COEP.
4. Туруктуулук
Rate limiting (token bucket/GCRA), квота жана атаандаштык.
Circuit breaker, таймауттар, adaptive concurrency, load shedding.
per-try timeout жана Jitter менен Retry-policy.
5. Трансформация жана валидация
Эл каттоо жолдору/аталыштары, body-rewrite, JSON/XML, gRPC, HTTP.
Схемаларды валидациялоо (OpenAPI/JSON Schema/Protobuf), ID нормалдаштыруу.
6. Кэш жана аткаруу
Response/fragment cache, ETag/If-None-Match, компрессия, brotli.
Request collapsing (coalescing) бирдей ачкычтар үчүн.
7. Байкоо жана аудит
RED/USE параметрлери, чечимдерди киргизүү (429/403/5xx), Tracking (W3C Trace-Context/OpenTelemetry), sampling (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) - тандап per-route камтыйт.
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 Конг: маршрут плагиндер
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' окушат → per-tenant лимиттерди/квоталарды/эрежелерди колдонушат.
Саясатты версиялаңыз ('policy _ version'), changelog жана канарейка ролун жүргүзүңүз.
7) сыноо жана rollout
Бошотулганга чейин
Контракттык тесттер чынжыр (таблица "эгер"): auth → deny, auth → allow, rate → 429, схема → 422.
Load: Burst × 10, узун плато, "кир" үлгүлөрү (slow-POST).
Chaos: PDP/JWKS/Redis деградациясы - минималдуу коопсуз үчүн fail-closed/деградация болушу керек.
Релиз
'Report-Only '/shadow-mode (колдонбостон чечимдерди логикалайбыз).
Canary 1-5% жол + метр салыштыруу (p95/p99, 4xx/5xx/429).
SLO/alerts боюнча автоматтык rollback.
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}`
- Tracks: span per-filter, атрибуттар 'policy _ version', 'tenant', 'limit _ key'.
- Логи (Sample): себептер менен deny/429/5xx чечимдер жана 'trace _ id'.
- Dashbord: Exec-кыскача, per-route, per-tenant, "ысык" саясат.
9) Коопсуздук жана иштетүү
Бардык сырлар (HMAC, JWKS жеке, API-ачкычтар) - KMS/Vault, -файлдарда эмес.
сезимтал каттамдар үчүн deny-by-default саясаты.
Кыска TTL JWKS/PDP кэш, backoff менен асинхрондук жаңыртуулар.
Трансформация схемаларынын миграциясы - versioned; "сындырып" - dual-write аркылуу.
body-size (DoS) жана JSON тереңдигин чектөө.
10) Антипаттерндер
Ар бир каттамда универсалдуу "бардыгы камтылган" плагиндер топтому → кошумча миллисекунддар жана эсептер.
Тышкы көз каранды плагиндер жок кэш/тайм → каскаддык тайм.
Фильтрлердин тартиби жок: адегенде трансформация/логика, андан кийин лимиттер туура эмес.
Жогорку кардиналдуу этикеткалар метрика (raw 'user _ id '/' ip').
AuthN/authZ айкалыштыруу үлгүлөрүндө аралаштыруу (Lua/Jinja менен бүдөмүк чечимдер).
Сырларды/токендерди каттоо.
Бир Global Redis/кластер бардык чектер үчүн эч кандай шардана/камдык.
11) iGaming/Каржы өзгөчөлүктөрү
Пер-тенант/пер-юрисдикция эрежелери: KYC/AML, санкциялар, жоопкерчиликтүү төлөмдөрдүн лимиттери.
Төлөм маршруттары үчүн катаал саясат: кыска таймауттар, бир кайталоо, демпотенттүүлүк ('Idempotency-Key').
PSP/KYC SDK үчүн периметрлерди бөлүү (өзүнчө домендер/плагин чынжырлары).
Өзгөрүлбөгөн чечимдердин логдорун текшерүү (корутундулар, бөгөт коюу, санкциялардан баш тартуу).
12) Prod-даярдык чек тизмеси
- Filters тартиби аныкталган: authN → authZ → limits → circuit/timeout → схема → transform → cache.
- Per-маршруттук плагин топтому; оор - керек жерде гана.
- JWKS/PDP кыска TTL жана кэш менен; Таймауттар жана fallback стратегиялары.
- Rate/Quota/Concurrency - ачкычтар иштелип чыккан, кампа.
- RED/USE метр топтому, OTel, sampling tail/adaptive.
- Canary + shadow-режими, SLO боюнча auto-rollback.
- KMS/Vault сырлары; конфиги - которулуучу, миграциясы бар.
- body/headers чеги; oversize/slow-POST коргоо.
- кардарлар үчүн документтер: 401/403/409/422/429/5xx, 'Retry-After' коддору, аталыштардын мисалдары.
13) TL; DR
"Эрте баш тартуу → аутентификация/авторизация → лимиттер/туруктуулук → валидация → трансформация/кэш → телеметрия" чынжырын куруу. Керектүү per-route плагиндерди гана күйгүзүү, тышкы чечимдерди кэштоо (JWKS/PDP), таймауттарды жана ретри-саясатты берүү, метриканын кардиналдуулугун көзөмөлдөө. shadow/canary аркылуу бошотуп, KMS/Vault сырларды сактоо жана p95/p99 ар бир плагин таасирин өлчөө.