JavaRush /Курсы /Модуль 5. Spring /Лекция 278: Практика: настройка API Gateway для маршрутиз...

Лекция 278: Практика: настройка API Gateway для маршрутизации запросов

Модуль 5. Spring
28 уровень , 7 лекция
Открыта

API Gateway — это своего рода швейцарский нож для ваших микросервисов. Его задачи включают маршрутизацию запросов к нужным сервисам, управление безопасностью (например, аутентификацию и авторизацию), балансировку нагрузки, мониторинг и даже кэширование. Если представить микросервисы как магазин с индивидуальными прилавками, то API Gateway будет кассиром, который направляет вас к нужному прилавку в зависимости от вашего запроса.

Основные функции API Gateway:

  • Маршрутизация запросов: перенаправление запросов на нужный микросервис.
  • Аутентификация и авторизация: проверка пользователей на соответствие политике безопасности.
  • Балансировка нагрузки: распределение запросов между несколькими экземплярами микросервисов.
  • Кэширование: ускорение отклика за счет хранения часто запрашиваемых данных.
  • Обработка ошибок: унифицированная обработка и возврат ошибок клиентам.
  • Мониторинг и логирование: сбор метрик и логов запросов.

Мы будем использовать Spring Cloud Gateway для реализации API Gateway. Это мощный инструмент, который легко интегрируется со Spring Boot и предоставляет множество возможностей "из коробки".


Основные функции API Gateway в Spring Cloud Gateway

Spring Cloud Gateway построен на базе Project Reactor, поддерживает асинхронную обработку запросов, а также легко конфигурируется через файлы application.yml. Вот основные элементы, которые мы будем использовать:

  • Routes (маршруты): определяют, куда направлять запросы.
  • Filters (фильтры): обрабатывают запросы или ответы (например, логирование, модификация заголовков).
  • Predicates (условия): определяют соответствие маршруту (например, по URI, HTTP-методу).

Настройка проекта: API Gateway

1. Создаем Spring Boot проект для API Gateway

Для начала создайте новый Spring Boot проект через Spring Initializr:

  • Dependencies: добавьте Spring Cloud Gateway и Spring Boot Actuator для мониторинга.

Сгенерируйте проект, импортируйте его в IDE и убедитесь, что pom.xml содержит следующие зависимости:


<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

2. Настраиваем application.yml

В файле application.yml определите маршруты для микросервисов. Например, у нас есть два микросервиса:

  • User Service: сервис для управления пользователями.
  • Order Service: сервис для обработки заказов.

Добавьте следующие конфигурации:


server:
  port: 8080 # Gateway будет работать на порту 8080

spring:
  cloud:
    gateway:
      routes:
      - id: user-service-route
        uri: http://localhost:8081 # Адрес User Service
        predicates:
          - Path=/users/** # Запросы на URI /users/* будут идти сюда
        filters:
          - AddRequestHeader=X-Gateway, GatewayActive

      - id: order-service-route
        uri: http://localhost:8082 # Адрес Order Service
        predicates:
          - Path=/orders/**
        filters:
          - AddRequestHeader=X-Gateway, GatewayActive

Что тут происходит?

  • Мы создали два маршрута (routes): user-service-route и order-service-route.
  • Если запрос поступает на /users/**, он перенаправляется на http://localhost:8081 (User Service).
  • Если запрос поступает на /orders/**, запрос перенаправляется на http://localhost:8082 (Order Service).
  • Мы добавили фильтры, которые динамически добавляют заголовок X-Gateway для всех запросов, проходящих через API Gateway.

3. Запускаем Gateway и микросервисы

Для тестирования запустите два простых Spring Boot приложения:

  • User Service: работает на порту 8081, возвращает информацию о пользователях.
  • Order Service: работает на порту 8082, отвечает за заказы.

Пример кода для User Service:


@RestController
@RequestMapping("/users")
public class UserController {
    @GetMapping
    public ResponseEntity<String> getUsers() {
        return ResponseEntity.ok("Returning list of users");
    }
}

Пример кода для Order Service:


@RestController
@RequestMapping("/orders")
public class OrderController {
    @GetMapping
    public ResponseEntity<String> getOrders() {
        return ResponseEntity.ok("Returning list of orders");
    }
}

После того как все три приложения запущены (Gateway, User Service, и Order Service), вы можете проверить Gateway:

  • http://localhost:8080/users: Должен перенаправить запрос на User Service.
  • http://localhost:8080/orders: Должен перенаправить запрос на Order Service.

4. Добавляем фильтры для логирования

Фильтры — это сердце Gateway. Они позволяют вам модифицировать запросы и ответы.

Добавим фильтр для логирования. Создайте класс:


@Component
public class LoggingFilter implements GlobalFilter {

    private static final Logger logger = LoggerFactory.getLogger(LoggingFilter.class);

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        logger.info("Request path: {}", exchange.getRequest().getPath());
        return chain.filter(exchange);
    }
}

Этот фильтр выводит путь запроса в логи. Добавьте фильтр в конфигурацию. Запустите приложение и убедитесь, что логи запросов выводятся в консоль.

5. Настраиваем балансировку нагрузки

Если у вас есть несколько экземпляров одного микросервиса, вы можете добавить балансировку нагрузки.

В application.yml добавьте:


spring:
  cloud:
    gateway:
      routes:
      - id: user-service-route
        uri: lb://user-service
        predicates:
          - Path=/users/**

eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

Здесь lb://user-service означает, что запросы будут направлены через Eureka для балансировки.


Тестирование и отладка

Проверьте работу маршрутов, создав тесты:

  • Отправьте запрос на /users и убедитесь, что данные возвращаются с User Service.
  • Проверьте корректность заголовков, отправленных API Gateway.
  • Проверьте логи для убедительности, что запросы логируются.

Выводы

Теперь вы понимаете, как настроить маршрутизацию запросов через Spring Cloud Gateway, добавить базовые фильтры и даже использовать балансировку нагрузки с Eureka. В реальных проектах API Gateway — это первый барьер входа в вашу систему, поэтому настройка безопасности, мониторинга и фильтров крайне важна.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ