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 — это первый барьер входа в вашу систему, поэтому настройка безопасности, мониторинга и фильтров крайне важна.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ