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 тепер не тільки розподіляє запити, а й захищає твої дані та мікросервіси. Рухаємось далі!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ