Гайды

API Gateway и service discovery: Consul, etcd

Роль шлюза, Consul catalog и Connect, etcd и Kubernetes; Ingress и лимиты на upstream.

~10 мин чтения

API Gateway и service discovery: Consul, etcd

API Gateway — единая точка входа: TLS, auth, rate limit, routing, composition запросов к микросервисам. Service discovery — как клиент находит живые инстансы (Consul, etcd, встроенный DNS k8s). K8s — Pods, Deployments и Services; REST-дизайн — REST: HATEOAS и версионирование.


1. Функции API Gateway

  • Аутентификация (JWT, mTLS, API keys).
  • WAF интеграция.
  • Request/response transform.
  • Observability (correlation id).

Продукты: Kong, Tyk, AWS API Gateway, Envoy + contour/emissary.

Лимиты: помимо RPS по клиенту, задавайте burst и quota по API key / JWT sub; для GraphQL — отдельный query cost (см. GraphQL vs REST). На уровне mesh (Istio) — LocalRateLimit и глобальные квоты через внешний сервис.


2. Consul

Catalog сервисов, health checks, DNS service.consul, KV store. Connect — service mesh с mTLS.


3. etcd

Распределённое консенсусное KV (Raft); backend для Kubernetes сам по себе. Для service discovery приложений чаще используют обёртки или Kubernetes Service + Endpoints.


4. В Kubernetes

Часто Ingress + CoreDNS достаточно; mesh (Istio/Linkerd) добавляет traffic management.


5. Маршрутизация и политики

Path/host based routing, веса для canary, JWT validation на шлюзе vs в каждом сервисе (компромисс безопасность/централизация). mTLS между gateway и upstream в zero-trust сетях. Request size limits защищают от OOM на бэкенде.


6. Consul: операции

Gossip и Raft для серверов; клиентский agent на ноде для регистрации сервиса и локальных health checks. Prepared queries для failover между датацентрами. Храните ACL tokens в Vault, не в репозитории.


7. Чек-лист

  • Не превращать gateway в «божественный объект» со всей бизнес-логикой.
  • Кэширование ответов только где безопасно.
  • Лимиты и таймауты на upstream — Circuit breaker и retry.
  • Идемпотентность при ретраях на шлюзе (ключи, dedup).
  • Единый correlation id с заголовка входа до исходящих вызовов.

Дальше: Ingress в Kubernetes