← Назад к вопросам

Как знаешь варианты реализации API Gateway

1.7 Middle🔥 131 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Варианты реализации API Gateway

API Gateway — критичный компонент микросервисной архитектуры. Я работал с несколькими вариантами реализации и знаю их плюсы/минусы.

1. Spring Cloud Gateway (самый популярный в Spring-экосистеме)

Это встроенное решение для Spring Boot приложений:

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("user-service", r -> r
                .path("/users/**")
                .filters(f -> f
                    .stripPrefix(1)
                    .addRequestHeader("X-Request-ID", UUID.randomUUID().toString())
                    .retry(config -> config
                        .setRetries(3)
                        .setMethods(HttpMethod.GET, HttpMethod.POST))
                    .rateLimit(config -> config
                        .setCapacity(100)
                        .setRefillTokens(100)
                        .setRefillPeriod(Duration.ofSeconds(1))))
                .uri("lb://user-service"))
            .route("order-service", r -> r
                .path("/orders/**")
                .filters(f -> f.stripPrefix(1))
                .uri("lb://order-service"))
            .build();
    }
}

Плюсы:

  • Встроена в Spring Boot
  • Асинхронная обработка (WebFlux)
  • Хорошая интеграция с Service Discovery (Eureka, Consul)
  • Реактивная обработка потоков

Минусы:

  • Требует WebFlux (может быть сложнее для разработчиков)
  • Меньше готовых плагинов, чем у Kong

2. Netflix Zuul (старый подход, но всё ещё используется)

Зуул — классический gateway на основе servlet:

@Configuration
public class ZuulConfig {
    @Bean
    public ZuulProperties zuulProperties() {
        ZuulProperties properties = new ZuulProperties();
        ZuulProperties.ZuulRoute userRoute = new ZuulProperties.ZuulRoute();
        userRoute.setPath("/users/**");
        userRoute.setServiceId("user-service");
        userRoute.setStripPrefix(true);
        properties.getRoutes().put("user-service", userRoute);
        return properties;
    }
}

@Component
public class AuthFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre"; // pre, route, post, error
    }
    
    @Override
    public int filterOrder() {
        return 1;
    }
    
    @Override
    public boolean shouldFilter() {
        return true;
    }
    
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        String authToken = ctx.getRequest().getHeader("Authorization");
        
        if (authToken == null || !isValidToken(authToken)) {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
        }
        
        return null;
    }
    
    private boolean isValidToken(String token) {
        // Валидация токена
        return true;
    }
}

Плюсы:

  • Долгая история использования
  • Много документации
  • Простой синхронный API

Минусы:

  • Не рекомендуется для новых проектов (deprecated)
  • Синхронная обработка (меньше throughput)
  • Thread-per-request модель

3. Kong (standalone gateway)

Конг — независимый gateway на базе Nginx + Lua:

# kong.yml
_format_version: "3.0"
services:
  - name: user-service
    url: http://user-service:8080
    routes:
      - name: user-route
        paths:
          - /users
        methods:
          - GET
          - POST
routes:
  - name: protected-route
    service: user-service
    paths:
      - /users/protected
plugins:
  - name: jwt
    service: user-service
    config:
      key_claim_name: sub
      secret_is_base64: false
  - name: rate-limiting
    config:
      minute: 100
      hour: 1000
  - name: cors
    config:
      origins:
        - "http://localhost:3000"
      methods:
        - GET
        - POST

Плюсы:

  • Независим от языка приложений
  • Высокая производительность
  • Обширный набор плагинов
  • Можно использовать в любом стеке

Минусы:

  • Отдельный сервис (нужна отдельная инфраструктура)
  • Сложнее развертывание
  • Нужно изучать синтаксис Kong

4. AWS API Gateway

Манейджд решение от AWS:

// Java клиент для работы с AWS API Gateway
AmazonApiGateway client = AmazonApiGatewayClientBuilder
    .standard()
    .build();

PutIntegrationRequest request = new PutIntegrationRequest()
    .withRestApiId("api-id")
    .withResourceId("resource-id")
    .withHttpMethod("POST")
    .withType(IntegrationType.HTTP_PROXY)
    .withUri("https://user-service:8080/users");

client.putIntegration(request);

Плюсы:

  • Полностью управляемо
  • Встроена аутентификация (IAM, Cognito)
  • Масштабируемость "из коробки"
  • Интеграция с AWS сервисами

Минусы:

  • Vendor lock-in
  • Дорого при высоком трафике
  • Меньше контроля над логикой

5. Nginx + Custom Logic

Минималистичный подход с Nginx:

upstream user_service {
    server user-service:8080;
}

upstream order_service {
    server order-service:8080;
}

server {
    listen 8000;
    
    location /users/ {
        proxy_pass http://user_service/;
        proxy_set_header X-Request-ID $http_x_request_id;
        proxy_set_header Authorization $http_authorization;
        
        # Rate limiting
        limit_req zone=api burst=20 nodelay;
    }
    
    location /orders/ {
        proxy_pass http://order_service/;
        auth_request /auth;
    }
    
    location = /auth {
        internal;
        proxy_pass http://auth-service/validate;
    }
}

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

Плюсы:

  • Простота
  • Высокая производительность
  • Минимальные зависимости

Минусы:

  • Нужны знания Nginx/Lua для сложной логики
  • Сложнее масштабировать
  • Меньше встроенных возможностей

Мой выбор для разных сценариев

Spring Boot проект → Spring Cloud Gateway — естественная интеграция

Микросервисы разных языков → Kong — универсальность

AWS инфраструктура → AWS API Gateway — встроенная интеграция

Простой случай → Nginx — минимум overhead

Типичная архитектура в моих проектах

Client → Load Balancer (AWS ALB)
        ↓
        API Gateway (Spring Cloud Gateway)
        ├─ Authentication Filter
        ├─ Rate Limiting
        ├─ Request Logging
        ↓
        Service Discovery (Eureka)
        ├─ User Service
        ├─ Order Service
        └─ Payment Service

Выбор gateway зависит от контекста: для новых Spring проектов — Spring Cloud Gateway, для гетерогенных сред — Kong или AWS API Gateway.

Как знаешь варианты реализации API Gateway | PrepBro