API 게이트웨이 및 라우팅
1) 아키텍처에서 API 게이트웨이 역할
게이트웨이 API-가장자리의 L7 구성 요소:- 인바운드 트래픽 허용 (TH/HTTP2/HTTP3, WebSocket, gRPC)
- 규칙에 따른 경로 (호스트/경로/헤더/방법/쿼리/지리/무게/건강);
- 엔드 투 엔드 정책을 적용합니다: 인증/인증, 요율 제한, WAF, CORS, 캐싱;
- 변환을 수행합니다 (헤더/바디의 정규화, gRPC SL JSON, GraphQL 스티칭).
- 안정성 (타임 아웃, 재시도, 회로 차단기, 특이 치 감지) 을 제공합니다.
- 관찰 및 청구 (로그, 메트릭, 추적, 할당량) 를 제공합니다.
- 내부 토폴로지 (서비스 메쉬, 개인 서비스) 를 분리합니다.
종종 쌍으로 사용됩니다: Edge/API-Gateway + Ingress/Mesh (Envoy/Istio/Linkerd) - 첫 번째는 두 번째 동서 외교 정책을 결정합니다.
2) 전형적인 토폴로지
단일 글로벌 게이트웨이 (CNC/edge Pop → L7 게이트웨이 → 서비스) - 간단한 중앙 집중식 정책.
지역 게이트웨이 (지역당) + 스마트 지리/대기 시간 라우팅.
다중 임차인: 임차인 당 전용 경로/하위 도메인/키, 할당량 및 제한.
하이브리드: 온 프렘 + 클라우드, 프라이빗 링크/피어링, 프라이빗 백엔드가 API 게이트웨이 뒤에 있습니다.
3) L7 라우팅 규칙
기준:- 호스트/경로: 'api. 예. com '→ '/v1/orders/'.
- 헤더: 'X- 클라이언트', 'X- 지역', '사용자 에이전트', '수락'.
- 방법/내용 유형: JSON/Proto/GraphQL 구별.
- 쿼리/조각: 주의-캐시/변형에 영향을 미칩니다.
- Geo/Latency: 가장 가까운 팝/지역, 성능 저하시 장애.
- 가중/카나리아: 쿠키로 끈적 끈적한 트래픽 배포 90/10, 50/50.
- 세션 친화력: 키/토큰을 기반으로 한 해시 기반 (스케일링 할 때주의).
yaml nginx. ingress. kubernetes. io/canary: "true"
nginx. ingress. kubernetes. io/canary-weight: "10" # 10% traffic to new backend
예 (특사, 헤더 기반 라우팅):
yaml match: { prefix: "/orders", headers: [{name: "X-Experiment", exact_match: "new"}] }
route: { cluster: orders-v2 }
4) 프로토콜 및 호환성
REST/JSON-기본적으로 클라이언트 유효성 검사/생성을위한 OpenAPI를 설명하십시
gRPC - TH/2에 대한 이진 프로토; 외부 클라이언트의 경우 gRPC-JSON 트랜스코딩을 사용하십시오
GraphQL - 집계 서비스; 주변에서 쿼리의 복잡성/깊이를 모니터링하십시오.
WebSocket/SSE-양방향/푸시; 끈적 끈적한 타임 아웃을 고려하십
KDE/2/3 (QUIC) - 멀티플렉싱/빠른 시작; WAF/프록시 호환성 검증.
5) 보안: 인증 및 인증
5. 1 운송
TLS 1. 주변에 2 +, HSTS, OCSP 스테이플 링, PFS.
B2B/내부 API 및 머신 투 머신 용 mTLS.
IP 허가자/명칭, 지리 구속 조건.
5. 2 응용 프로그램 계층
OAuth2/OIDC: JWT 베어러 토큰, 서명/만료/청중 확인.
NMAS/서명: 날짜 + 표준화 된 라인 + 서명 (AWS와 유사) - 대체, 반복 (nonce/time 창) 으로부터 보호합니다.
API 키: 식별자로서 만; RBAC/ABAC/scopes를 통한 권리.
CORS: 명시 적 허용 원산지, 비행 전 캐시.
WAF: 서명 (OWASP API Top 10), 이상, 봇 보호, 재귀 JSON 필드.
DDoS/남용: 연결 제한, 토큰 버킷/누출 버킷, 버스트 + 평균 속도, 동적 금지.
yaml plugins:
- name: oidc config: { issuer: "...", client_id: "...", client_secret: "...", scopes: ["orders. read"] }
- name: rate-limiting config: { minute: 600, policy: local }
6) 검증, 변환 및 호환성
계획: OpenAPI/JSON-Schema/Protoguy에 따른 신체/헤더/매개 변수 검증.
변환: 필드 정규화, PII 마스킹, 상관 헤더 추가 ('추정', 'x- 요청 -id').
버전: '헤더: X-API-Version', 접두사 '/v1 ', 리소스 버전; 탈퇴 정책 1부터 시작하십시오.
후방 컴파트: 애드 필드 만; 새 버전없이 "파괴" 변경을 피하십시오.
이념성: 'Idempotency-Key' 게이트웨이는 TTL과 함께 Redis에 키를 저장합니다.
7) 탄력성: 연결 정책
시간 초과: 연결/읽기/쓰기; 합리적인 기본값 (예: 1/5/5).
구제: 안전하고 유쾌한 경우에만; 지터, 지수 백오프, 최대 시도.
회로 차단기: 오류/대기 시간에 열기; 샘플을 위해 반 개방.
이상 탐지-풀에서 잘못된 인스턴스를 제거합니다.
벌크 헤드/경쟁: 경로 당 동시 요청 제한.
실패: 능동/수동, 구역 저하.
그림자 트래픽: V2 "회색" 은 V1과 평행하게 실행됩니다 (응답에 영향을 미치지 않음).
yaml circuit_breakers:
thresholds:
- priority: DEFAULT max_connections: 1024 max_pending_requests: 2048 max_retries: 3
8) 캐싱 및 성능
HTTP- 치즈: '캐시 컨트롤', 'ETag/If-None-Match', 'Vary', '부실한 동안 재발행'.
가장자리 캐시/팝: 정적 및 캐시 된 API를위한 CDN (demempotent GET).
압축: 'ggip/br' (압축되지 않은 압축).
요청 붕괴 ("통합"): 동일한 병렬 요청 결합.
응답 성형: 필드/필터, 커서 기반, 크기 제한.
9) 관찰 및 운영
'l7 _ req _ total {route, 메소드, 코드}', 'latency _ ms {p50, p95, p99}', 'upstream _ aults', 'Reshit _ count', 'cb _ rate', '429 _ rate', '쿼터 _ usage {테넌트'.
로그: 구조적, 'trace _ id/span _ id', 'user _ id/tentent _ id', 'client _ ip'.
추적: W3C 추적 컨텍스트 ('traceparent', 'tracestate') 는 업스트림으로 전파됩니다.
감사: 누가 어떤 권리를 가지고 무엇을 일으켰는지; 민감한 API를위한 불변의 저장소.
SLO/SLA: 대상 p99, 오류 예산; 루트 레벨이 글로벌 레벨보다 낫습니다.
10) 용량 계획 관리
최소/시간/일에 테넌트/키/고객 풀 쿼터.
버스트 + 지속 한계; 스무딩을위한 새는 양동이.
공정성: 과부하 된 경우-" 처음 만난 "대신 공정한 큐잉.
우선 순위: 우선 순위 및 전용 수영장이있는 시스템/중요 경로.
11) 관리 및 릴리스 변경
카나리아/청록색: 무게 라우팅; SLO에서 자동 전진 (오류/대기 시간).
기능 게이트/백엔드 플래그: 헤더/토큰으로 활성화
그림자/diff 유효성 검사기: 신체/상태 비교, 델타 공차.
준비: 할당 된 도메인/경로 ('준비. 아피... '), 개별 키 및 할당량.
12) 설정 예
12. 1 NGINX-기본 제한 및 캐시 게이트웨이
nginx map $http_x_request_id $reqid { default $request_id; }
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
server {
listen 443 ssl http2;
server_name api. example. com;
security add_header Strict-Transport-Security "max-age = 31536000" always;
location /v1/ {
limit_req zone=perip burst=30 nodelay;
proxy_set_header X-Request-ID $reqid;
proxy_set_header Authorization $http_authorization;
proxy_connect_timeout 1s;
proxy_read_timeout 5s;
proxy_cache api_cache;
proxy_cache_valid 200 10s;
proxy_cache_use_stale error timeout updating;
proxy_pass http://orders-v1;
}
}
12. 2 특사-밸런스 및 리트레이 라우팅
yaml routes:
- match: { prefix: "/orders" }
route:
weighted_clusters:
clusters:
- name: orders-v1 weight: 90
- name: orders-v2 weight: 10 retry_policy:
retry_on: "5xx,reset,connect-failure"
num_retries: 2 per_try_timeout: 2s
12. 3 Traefik-미들웨어 및 헤더
yaml http:
middlewares:
secHeaders:
headers:
stsSeconds: 31536000 contentTypeNosniff: true routers:
api:
rule: "Host(`api. example. com`) && PathPrefix(`/v1`)"
service: svc-orders middlewares: ["secHeaders"]
13) 반 패턴
모두에 대한 하나의 세계적 한계 - "좋은 이웃" 은 "시끄러운" 때문에 고통 받고 있습니다.
dempotency가없는 배상 → 중복 효과 (지불, 엔터티 생성).
'타임 아웃 '/' 최대 바디 크기' 를 무시하고 근로자를 교수형에 처하게합니다.
게이트웨이에서 엣지 정책과 비즈니스 로직을 혼합합니다 (경계 가중).
체계의 검증 부족 → 고객의 취약성 및 "파괴" 릴리스.
정의/제한/유휴 시간을 제외한 Naked WebSocket.
회전없이 헤드 라인의 비밀; 내부 B2B에는 mTLS가 없습니다.
14) 테스트 플레이 북 (게임 데이)
요청 폭풍: 리미터/할당량 확인, 429 동작, 저하.
하나의 클러스터 손실: failover/weight 재분배; SLO 카나리아.
가중 답변: 최대 본체/타임 아웃; 관절을 자릅니다.
주사/이상: WAF 규칙, 재귀 JSON 억제, 큰 GraphQL 깊이.
추적은 '추적 가능한' 전파 및 샘플링을 확인하지 못했습니다.
비밀: 키 회전/JWKS, 토큰 만료, 시계 왜곡 허용 오차.
15) 구현 점검표
- 도메인/경로/버전 정의, OpenAPI/프로토 게시.
(PHP 3 = 3.0.6, PHP 4)
- 인증 (OIDC/HMAC), RBAC/scopes, CORS가 활성화되었습니다.
- 임차인 당 한도/할당량, 공정 대기열, 429-UX.
- 무게/헤더 라우팅, 카나리아 계획 및 롤백.
- 타임 아웃/재 시도/회로 차단기/특이 치 정책.
- 체계 검증, 변환, PII 마스킹.
- Edge-ке/ETag, 합병, ggip/br.
- 관찰 가능성: 메트릭, 로그, 트랙, 대시 보드 및 경고.
- 런북: 사건, 키 회전, 블록 목록, 검은 금요일.
16) FAQ
Q: API 게이트웨이는 서비스 메쉬와 어떻게 다릅니 까?
A: 게이트웨이 - 남북 (외부 경계, 종단 간 정책). 메쉬 - 동서 (트랙 클러스터 연결/MSL/retrai). 종종 함께 사용됩니다.
Q: 구현할 곳: 게이트웨이 또는 서비스에서?
A: 두 수준: 게이트웨이-거친 입자 (인증, 기본 권리/할당량), 서비스-세밀한 (도메인 역할/속성).
Q: gRPC-JSON 트랜스코딩은 언제 필요합니까?
A: 내부 gRPC 및 외부에는 REST/JSON 및 간단한 클라이언트/브라우저가 필요합니다.
Q: 버전 지정 전략을 선택하는 방법?
A: 공개 API의 경우 경로 '/vN '+ 박탈 헤더와 긴 겹침. 내부 기능 플래그/호환성 체계.
17) 총계
API 게이트웨이는 단순한 프록시가 아니라 정책과 탄력성의 중심입니다. 적절한 라우팅, 보안, 한계, 검증 및 관찰 가능성은 예측 가능성과 릴리스 속도를 제공합니다. 엣지 게이트웨이를 서비스 메시, 자동화 카나리아 및 할당량, 테스트 고장과 결합하면 병목 현상이 아닌 가속기가됩니다.