Сьогодні в нас тема, яка є основою успіху в мікросервісній архітектурі: патерни! Уявіть собі місто з безліччю будівель: офіси, магазини, ресторани. У кожної з них своя адреса і свої функції. Теоретично ви можете потрапити прямо в будь-яку будівлю, але як саме? Уявіть, що в вас є розумні навігатори, які знають всі маршрути й підкажуть короткий шлях. У світі мікросервісів такі "навігатори" називаються API Gateway, а щоб самі будівлі могли знайти одна одну — використовують Service Discovery. Але що, якщо одна з будівель тимчасово зачинена? Тоді місто використовує Circuit Breaker, щоб не створити перевантаження. Патерни, які ми сьогодні вивчимо, значно спрощують роботу з мікросервісами і роблять їх стійкими та керованими.
API Gateway: Ворота в світ мікросервісів
API Gateway — це центральна точка входу для всіх клієнтських запитів. Замість того, щоб клієнт безпосередньо взаємодіяв з кожним мікросервісом, він проходить через Gateway, який маршрутизує запити, виконує трансформацію даних, а також відповідає за безпеку.
Ось аналогія: якщо мікросервіси — це будівлі, то API Gateway — це єдиний вхід, звідки далі направляють відвідувачів у потрібну будівлю.
Основні задачі API Gateway:
- Маршрутизація запитів: перенаправлення HTTP-запитів до потрібних мікросервісів.
- Аутентифікація та авторизація: забезпечення безпеки системи.
- Агрегація даних: об'єднання відповідей від кількох мікросервісів в одну.
- Кешування: зменшення навантаження на сервіси за рахунок локального збереження даних.
- Трансформація запитів та відповідей: наприклад, перетворення даних з одного формату в інший.
Як це виглядає на практиці?
Припустимо, у вас є e-commerce застосунок:
- Клієнт хоче подивитися інформацію про товар. Запит проходить через API Gateway.
- Gateway перенаправляє запит до мікросервісу каталогу.
- Якщо інформація про товар також пов'язана з відгуками, Gateway може агрегувати дані з двох мікросервісів (каталогу і відгуків) і повернути клієнту єдину відповідь.
Приклад з використанням Spring Cloud Gateway:
@SpringBootApplication
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("catalog_service", r -> r.path("/catalog/**")
.uri("http://localhost:8081")) // перенаправляє на мікросервіс каталогу
.route("review_service", r -> r.path("/reviews/**")
.uri("http://localhost:8082")) // перенаправляє на мікросервіс відгуків
.build();
}
}
Чим це допомагає?
- Спрощує клієнтську логіку: клієнт "знає" тільки про один вхід.
- Центральне місце керування: можна ввімкнути кешування або логування саме в Gateway.
- Швидка адаптація: можна змінювати внутрішні маршрути без зачіпання клієнтів.
Недоліки API Gateway:
- Може стати точкою відмови (single point of failure), якщо не налаштувати відмовостійкість.
- Додає невеликий оверхед, бо всі запити проходять через один сервіс.
Service Discovery: а тепер знайдіть один одного!
Service Discovery — механізм, що дозволяє мікросервісам знаходити один одного динамічно. Це особливо актуально, коли мікросервіси часто створюються, видаляються або масштабуются.
Якщо API Gateway — це "головні ворота", то Service Discovery — це "жовті сторінки", де вказані адреси всіх будівель (мікросервісів).
Сценарій використання:
- Новий мікросервіс стартує і реєструється в "реєстрі служб".
- Інші мікросервіси або API Gateway можуть запросити "реєстр служб", щоб знайти потрібний сервіс.
Популярні інструменти Service Discovery:
- Netflix Eureka (Spring Cloud підтримує його "з коробки").
- Consul.
- Zookeeper.
Приклад використання з Eureka:
Крок 1: Налаштування Eureka Server
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
Крок 2: Реєстрація мікросервісу Додай в application.properties:
spring.application.name=catalog-service
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
Тепер ваш "catalog-service" зареєструється в Eureka Server і стане доступним для інших.
Circuit Breaker: відмовостійкість на максимумі
Circuit Breaker (вимикач) — це патерн, який запобігає перевантаженню мікросервісів. Якщо один з мікросервісів перестав відповідати (або відповідає повільно), Circuit Breaker "перекриває" запити до цього сервісу, захищаючи інші частини системи.
Circuit Breaker робить систему більш стійкою, бо запобігає масовим відмовам при падінні одного сервісу. А ще — знижує навантаження на ресурси, які й так переживають складні часи.
Приклад Circuit Breaker для REST-запиту (реалізація з використанням Resilience4j)
- Додай залежність:
<dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-spring-boot2</artifactId> <version>2.0.2</version> </dependency> - Налаштуй Circuit Breaker в
application.properties:resilience4j.circuitbreaker.instances.catalog.failureRateThreshold=50 resilience4j.circuitbreaker.instances.catalog.slowCallRateThreshold=60 - Використай у коді:
@RestController public class CatalogController { private final RestTemplate restTemplate; public CatalogController(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @GetMapping("/catalog") @CircuitBreaker(name = "catalog", fallbackMethod = "fallbackCatalog") public String getCatalog() { return restTemplate.getForObject("http://localhost:8081/catalog", String.class); } public String fallbackCatalog(Throwable t) { return "Catalog service is currently down. Please try again later."; } }
Підсумки
Ці три патерни — API Gateway, Service Discovery і Circuit Breaker — наріжні камені мікросервісної архітектури. API Gateway забезпечує централізований вхід і керує запитами. Service Discovery допомагає мікросервісам знаходити один одного. Circuit Breaker захищає вашу систему від ефекту снігової кулі при відмовах.
Ці патерни допоможуть зробити вашу систему не лише масштабованою і гнучкою, але й стійкою до збоїв. У наступній лекції поговоримо про автономію сервісів, ізоляцію даних і деякі інші архітектурні принципи мікросервісів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ