JavaRush /Курсы /Модуль 5. Spring /Лекция 166: Важные паттерны микросервисов: API Gateway, S...

Лекция 166: Важные паттерны микросервисов: API Gateway, Service Discovery, Circuit Breaker

Модуль 5. Spring
17 уровень , 5 лекция
Открыта

Сегодня нас ждет тема, которая является основой успеха в микросервисной архитектуре: паттерны! Представьте себе город со множеством зданий: офисы, магазины, рестораны. У каждого из них свой адрес и свои функции. Теоретически, вы можете напрямую попасть в любое здание, но как именно? Представьте, что у вас есть умные навигаторы, которые знают все маршруты и подскажут короткий путь? В мире микросервисов такие "навигаторы" называются API Gateway, а вот чтобы сами здания могли найти друг друга — используется Service Discovery. Но что, если одно из зданий закрыто временно? Тогда город использует Circuit Breaker, чтобы не вызвать перегрузки. Паттерны, которые мы сегодня изучим, сильно упрощают работу с микросервисами и делают их устойчивыми и управляемыми.


API Gateway: Ворота в мир микросервисов

API Gateway — это центральная точка входа для всех клиентских запросов. Вместо того, чтобы клиент напрямую взаимодействовал с каждым микросервисом, он проходит через Gateway, который маршрутизирует запросы, выполняет трансформацию данных, а также отвечает за безопасность.

Вот аналогия: если микросервисы — это здания, то API Gateway — это единый вход, откуда далее направляют посетителей в нужное здание.

Основные задачи API Gateway:

  1. Маршрутизация запросов: перенаправление HTTP-запросов к нужным микросервисам.
  2. Аутентификация и авторизация: обеспечение безопасности системы.
  3. Агрегация данных: объединение ответов от нескольких микросервисов в один.
  4. Кэширование: уменьшение нагрузки на сервисы за счёт локального хранения данных.
  5. Трансформация запросов и ответов: например, преобразование данных из одного формата в другой.

Как это выглядит в жизни?

Допустим, у вас есть 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 — это "жёлтые страницы", где указаны адреса всех зданий (микросервисов).

Сценарий использования:

  1. Новый микросервис стартует и регистрируется в "реестре служб".
  2. Другие микросервисы или 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)

  1. Добавьте зависимость:
    
    <dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>2.0.2</version>
    </dependency>
    
  2. Настройте Circuit Breaker в application.properties:
    
    resilience4j.circuitbreaker.instances.catalog.failureRateThreshold=50
    resilience4j.circuitbreaker.instances.catalog.slowCallRateThreshold=60
    
  3. Используйте в коде:
    
    @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 защищает вашу систему от снежного кома отказов.

Эти паттерны помогут сделать вашу систему не только масштабируемой и гибкой, но и устойчивой к сбоям. В следующей лекции мы поговорим об автономии сервисов, изоляции данных и некоторых других архитектурных принципах микросервисов.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ