API Gateway — это как консьерж в гостинице: он принимает все запросы от внешних пользователей, проверяет, кто они такие, решает, куда их отправить, и отвечает за общее управление. Это делает API Gateway центральной точкой контроля между клиентами и микросервисами. В этой лекции мы будем разбираться с основными функциями API Gateway.
Расширенные возможности маршрутизации
Маршрутизация API Gateway — это сердце его работы. Она отвечает за то, чтобы запросы попадали именно к тем микросервисам, которые могут их обработать.
Пример:
Представьте, у вас есть два микросервиса:
- Сервис управления пользователями (
UserService) по адресуhttp://localhost:8081. - Сервис заказа товаров (
OrderService) по адресуhttp://localhost:8082.
Вы хотите, чтобы:
- Запросы на
/users/**маршрутизировались вUserService. - Запросы на
/orders/**— вOrderService.
Настроим это в Spring Cloud Gateway:
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("user_service_route", r -> r.path("/users/**")
.uri("http://localhost:8081")) // Маршрутизация в UserService
.route("order_service_route", r -> r.path("/orders/**")
.uri("http://localhost:8082")) // Маршрутизация в OrderService
.build();
}
}
Теперь API Gateway перенаправляет запросы в зависимости от пути. Это уже круто, но мы можем сделать больше.
Управление аутентификацией и авторизацией
Аутентификация — это проверка, кто вы (например, вход с логином и паролем). Авторизация — это проверка, что вам разрешено делать (например, доступ только к определённым данным).
API Gateway может выполнять аутентификацию и авторизацию несколькими способами:
- Проверка токенов (например, JWT).
- Интеграция с системами OAuth2/SSO.
- Экономия жизни вашего бекенда за счёт отказа неавторизованным запросам ещё на уровне API Gateway.
Расширенные функции маршрутизации
Для сложных сценариев маршрутизации API Gateway поддерживает предикаты и фильтры.
Предикаты (Predicates) используются для определения правил маршрутизации. Например:
- По пути (
Path): маршрутизируй запросы, если их путь соответствует/users/**. - По HTTP-методу (
Method): толькоGETзапросы. - По хосту (
Host): например, запросы, пришедшие наapi.example.com.
Пример использования предикатов:
@Bean
public RouteLocator advancedRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("user_service", r -> r
.path("/users/**")
.and()
.method("GET") // Только GET-запросы
.uri("http://localhost:8081"))
.build();
}
Фильтры (Filters) позволяют обрабатывать запросы и ответы: модифицировать их, добавлять заголовки, проверять параметры и т.д.
Пример: добавим заголовок ко всем запросам:
@Bean
public RouteLocator routeWithFilters(RouteLocatorBuilder builder) {
return builder.routes()
.route("order_service", r -> r
.path("/orders/**")
.filters(f -> f.addRequestHeader("X-Request-ID", "12345")) // Добавляем заголовок
.uri("http://localhost:8082"))
.build();
}
Аутентификация в API Gateway
Работа с аутентификацией — ключевая функция API Gateway в построении безопасных приложений.
JWT (JSON Web Token) — это токен, который клиент отправляет с запросами, а сервер (или API Gateway) проверяет его подлинность, используя секретный ключ. Это удобно, потому что не нужно каждый раз обращаться к базе: токен уже содержит всю информацию.
Пример настройки проверки JWT: Добавляем зависимость в pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
Настраиваем конфигурацию:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.oauth2ResourceServer()
.jwt(); // Включаем поддержку JWT
}
}
Теперь все запросы с токенами будут проверяться.
Авторизация в API Gateway
Авторизация — это наше "а вам туда можно?". Она отвечает за то, чтобы пользователи могли делать только то, что им позволено.
Роли и разрешения
В микросервисной среде роли (например, ADMIN, USER) используются для ограничения функциональности.
Настроим авторизацию с ролями:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // Только для админов
.antMatchers("/user/**").hasRole("USER") // Только для пользователей
.anyRequest().authenticated(); // Остальные запросы - только для аутентифицированных
}
Управление безопасностью
Кроме аутентификации и авторизации, API Gateway должен защищать от атак, таких как SQL-инъекции, XSS и CSRF.
Защита от CSRF
CSRF (Cross-Site Request Forgery) — это атака, при которой злоумышленник заставляет пользователя выполнить запрос от его имени. Spring Security по умолчанию включает защиту от CSRF для форм.
Для REST API её можно отключить (но с осторожностью!):
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); // Отключаем, если используем токены
}
API Gateway может ограничивать число запросов для предотвращения DoS-атак. Например, настроим лимит запросов с помощью фильтров.
Практическое задание
- Настройте маршрутизацию для двух микросервисов:
/users/**и/orders/**. - Реализуйте JWT-аутентификацию, где пользователи с токенами могут отправить запрос.
- Добавьте авторизацию для ограничения доступа:
- Админы могут выполнять
POSTна/orders. - Пользователи могут только
GETна/users.
- Админы могут выполнять
Мы сделали большой шаг вперёд — от простой маршрутизации к продвинутым сценариям с аутентификацией и авторизацией. API Gateway теперь не только распределяет запросы, но и защищает ваши данные и микросервисы. Двигаемся дальше!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ