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

Лекція 242: Практика: налаштування API Gateway з використанням Spring Cloud Gateway

Модуль 5. Spring
Рівень 24 , Лекція 1
Відкрита

Ми дізналися, що таке API Gateway і навіщо він потрібен у мікросервісній архітектурі, як Gateway допомагає маршрутизувати запити, виконувати аутентифікацію/авторизацію, балансувати навантаження і навіть захищати систему від атак. Тепер настав час застосувати теорію на практиці і налаштувати API Gateway, використовуючи Spring Cloud Gateway.

Чи знаєте ви, що Netflix був піонером у розробці власного API Gateway, який надихнув індустрію? Їхній проєкт Zuul настільки успішно справлявся з керуванням мільйонами запитів на секунду, що Spring Framework зробив Spring Cloud Gateway як сучасну альтернативу з ширшою функціональністю.


Що будемо робити?

У межах цієї лекції ми налаштуємо Spring Cloud Gateway для маршрутизації запитів між кількома мікросервісами. Ви навчитеся не тільки створювати маршрути, але й використовувати фільтри для налаштування роботи вашого шлюзу.


1. Підготовка проєкту

Створення нового проєкту Spring Boot

Почнемо зі створення нового проєкту Spring Boot, який буде виконувати роль API Gateway. Для цього можна скористатися Spring Initializr або вашим улюбленим інструментом.

Ось які модулі нам знадобляться:

  • Spring Cloud Gateway (обов'язково).
  • Spring Boot Web Starter (додається автоматично).
  • Spring Boot Actuator (для моніторингу, опційно).

Налаштування pom.xml або build.gradle

Якщо ви використовуєте Maven, додайте у ваш pom.xml таку залежність:


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

Для користувачів Gradle додайте в build.gradle:

implementation 'org.springframework.cloud:spring-cloud-starter-gateway'

Не забутьте вказати правильну версію Spring Cloud у вашому файлі конфігурації. Наприклад, якщо ви використовуєте Spring Boot версії 3.x, то сумісний реліз Spring Cloud буде 2022.x. Вкажіть це в секції управління версіями.


2. Налаштування маршрутів (Routes)

Маршрут (Route) — це базовий будівельний блок в Spring Cloud Gateway. Він визначає, куди направляти вхідний запит. Почнемо з простого прикладу: перенаправляємо всі запити з шляху /service1/** на локальний мікросервіс, запущений на порті 8081.

Конфігурація в application.yml

Створіть файл application.yml в папці src/main/resources і додайте мінімальну конфігурацію:


spring:
  cloud:
    gateway:
      routes:
        - id: service1-route
          uri: http://localhost:8081
          predicates:
            - Path=/service1/**

Що тут відбувається:

  • id: унікальний ідентифікатор маршруту.
  • uri: куди направляти запити (наш мікросервіс на порті 8081).
  • predicates: умови, за яких маршрут використовується. Тут ми вказали, що запити, які починаються з /service1/, мають оброблятися цим маршрутом.

Кодовий аналог конфігурації

Якщо ви не фан YAML, альтернативою є налаштування маршрутів прямо в коді. Ось як це можна реалізувати:


@Bean
public RouteLocator customRoutes(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("service1-route", r -> r.path("/service1/**")
                                           .uri("http://localhost:8081"))
            .build();
}

Цей метод повертає RouteLocator, який містить всі маршрути. Зверніть увагу, що маршрути можна визначати більш детально, додаючи фільтри, про які поговоримо нижче.


Тестування маршруту

Запустіть ваш API Gateway і мікросервіс на порті 8081. Тепер за допомогою Postman, curl або браузера виконайте запит:

GET http://localhost:8080/service1/hello

API Gateway перенаправить запит на мікросервіс за адресою http://localhost:8081/hello.


3. Використання фільтрів

Фільтри дозволяють обробляти запити і відповіді. Це як втручання в "проксі", щоб додати або змінити інформацію.

Додавання фільтрів

Давайте додамо фільтр, який буде додавати HTTP-заголовок до кожного запиту. Оновимо конфігурацію в application.yml:


spring:
  cloud:
    gateway:
      routes:
        - id: service1-route
          uri: http://localhost:8081
          predicates:
            - Path=/service1/**
          filters:
            - AddRequestHeader=X-Custom-Header, HelloWorld

Тепер кожен запит до /service1/ буде містити в заголовку X-Custom-Header: HelloWorld.


Реалізація кастомного фільтра

Ви також можете реалізувати свій власний фільтр. Наприклад, фільтр, який логуватиме кожен запит:


@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 URI: {}", exchange.getRequest().getURI());
        return chain.filter(exchange);
    }
}

Такий фільтр виконається для кожного запиту. Якщо потрібен тільки для певного маршруту, можна додати його в ланцюжок фільтрів для конкретного маршруту.


4. Налаштування предикатів (Predicates)

Предикати визначають умови, за яких буде використовуватися маршрут. Наприклад, перевіримо, щоб запит оброблявся тільки при певному HTTP-методі.

У application.yml додайте:

spring:
  cloud:
    gateway:
      routes:
        - id: service1-get-route
          uri: http://localhost:8081
          predicates:
            - Path=/service1/**
            - Method=GET

Тепер тільки GET-запити будуть маршрутизуватися. Усі інші методи (POST, PUT тощо) будуть ігноруватися.


Розширені предикати

Ви можете комбінувати предикати. Наприклад, команда нижче оброблятиме тільки запити з GET-методом, які приходять з хоста mydomain.com:


predicates:
  - Path=/service1/**
  - Method=GET
  - Host=mydomain.com

5. Корисні фільтри і предикати: Управління CORS

Якщо ваш API Gateway використовується для публічного доступу, треба врахувати CORS (Cross-Origin Resource Sharing). Додамо таке налаштування:

spring:
  cloud:
    gateway:
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedOrigins: "http://localhost:3000"
            allowedMethods:
              - GET
              - POST

Ця конфігурація дозволяє запити з фронтенду, запущеного на localhost:3000.


6. Перевіряємо результат

  1. Переконайтеся, що ваші мікросервіси працюють.
  2. Відкрийте Postman або використайте curl для тестування кількох маршрутів:
    • http://localhost:8080/service1/hello — має перенаправлятися на мікросервіс.
    • http://localhost:8080/service1/unknown — має повертати 404, якщо ресурс не існує в мікросервісі.

Якщо все працює, то вітаю! Ви щойно створили свій перший API Gateway.


7. Типові помилки і їх усунення

  1. Помилка 404 при доступі до маршруту: Перевірте, чи співпадає шлях у предикаті з відправленим запитом.
  2. Помилка 500 при виклику мікросервісу: Переконайтеся, що вказаний URI (наприклад, http://localhost:8081) дійсно доступний і працює.
  3. Проблеми з CORS: Якщо браузер блокує запити, переконайтеся, що CORS налаштований коректно.

Далі ви зможете заглиблюватися в більш складні конфігурації API Gateway, додаючи аутентифікацію, авторизацію і балансування навантаження. Корисні посилання для вивчення:

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ