«1. Обзор

В этой статье мы рассмотрим основные функции проекта Spring Cloud Gateway, нового API на основе Spring 5, Spring Boot 2 и Project Reactor.

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

Для объяснения шаблона Gateway без проекта Spring Cloud Gateway ознакомьтесь с нашей предыдущей статьей.

2. Обработчик маршрутизации

Ориентируясь на запросы маршрутизации, Spring Cloud Gateway перенаправляет запросы на сопоставление обработчика шлюза, которое определяет, что следует делать с запросами, соответствующими определенному маршруту.

Давайте начнем с быстрого примера того, как обработчик шлюза разрешает конфигурации маршрутов с помощью RouteLocator:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
      .route("r1", r -> r.host("**.baeldung.com")
        .and()
        .path("/baeldung")
        .uri("http://baeldung.com"))
      .route(r -> r.host("**.baeldung.com")
        .and()
        .path("/myOtherRouting")
        .filters(f -> f.prefixPath("/myPrefix"))
        .uri("http://othersite.com")
        .id("myOtherID"))
    .build();
}

Обратите внимание, как мы использовали основные строительные блоки этого API:

    Route – the основной API шлюза. Он определяется заданной идентификацией (ID), пунктом назначения (URI) и набором предикатов и фильтров Predicate — предикат Java 8 — который используется для сопоставления HTTP-запросов с использованием заголовков, методов или параметров. Filter — стандартный веб-фильтр Spring

3. Динамическая маршрутизация

Как и Zuul, Spring Cloud Gateway предоставляет средства для маршрутизации запросов к различным службам.

Конфигурация маршрутизации может быть создана с использованием чистой Java (RouteLocator, как показано в примере в разделе 2.1) или с использованием конфигурации свойств:

spring:
  application:
    name: gateway-service  
  cloud:
    gateway:
      routes:
      - id: baeldung
        uri: baeldung.com
      - id: myOtherRouting
        uri: localhost:9999

4. Фабрики маршрутизации

Spring Cloud Gateway сопоставляет маршруты, используя инфраструктура Spring WebFlux HandlerMapping.

Он также включает множество встроенных фабрик предикатов маршрутов. Все эти предикаты соответствуют различным атрибутам HTTP-запроса. Несколько фабрик предикатов маршрутов могут быть объединены с помощью логического «и».

Сопоставление маршрутов можно применять как программно, так и через файл свойств конфигурации с использованием другого типа фабрик предикатов маршрутов.

В нашей статье «Фабрики предикатов маршрутизации Spring Cloud Gateway» более подробно рассматриваются фабрики маршрутизации.

5. Фабрики WebFilter

Фильтры маршрутов делают возможным изменение входящего HTTP-запроса или исходящего HTTP-ответа.

Spring Cloud Gateway включает в себя множество встроенных фабрик WebFilter, а также возможность создавать собственные фильтры.

В нашей статье Spring Cloud Gateway WebFilter Factory более подробно рассматриваются фабрики WebFilter.

6. Поддержка Spring Cloud DiscoveryClient

Spring Cloud Gateway можно легко интегрировать с библиотеками Service Discovery и Registry, такими как Eureka Server и Consul:

@Configuration
@EnableDiscoveryClient
public class GatewayDiscoveryConfiguration {
 
    @Bean
    public DiscoveryClientRouteDefinitionLocator 
      discoveryClientRouteLocator(DiscoveryClient discoveryClient) {
 
        return new DiscoveryClientRouteDefinitionLocator(discoveryClient);
    }
}

6.1. LoadBalancerClient Filter

LoadBalancerClientFilter ищет URI в свойстве атрибута обмена, используя ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR.

Если URL-адрес имеет схему lb (например, lb://baeldung-service), он будет использовать Spring Cloud LoadBalancerClient для преобразования имени (например, baeldung-service) в фактический хост и порт.

Неизмененный исходный URL помещается в атрибут ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR.

7. Мониторинг

Spring Cloud Gateway использует Actuator API, известную библиотеку Spring-Boot, которая предоставляет несколько готовых сервисов для мониторинга приложения.

После установки и настройки Actuator API функции мониторинга шлюза можно визуализировать, обратившись к /gateway/ endpoint.

8. Реализация

Теперь мы создадим простой пример использования Spring Cloud Gateway в качестве прокси-сервера, используя предикат пути.

8.1. Зависимости

Spring Cloud Gateway в настоящее время находится в репозитории вех версии 2.0.0.RC2. Это также версия, которую мы используем здесь.

Для добавления проекта воспользуемся системой управления зависимостями:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-gateway</artifactId>
            <version>2.0.0.RC2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Далее добавим необходимые зависимости:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

8.2. Реализация кода

Теперь создадим простую конфигурацию маршрутизации в файле application.yml:

spring:
  cloud:
    gateway:
      routes:
      - id: baeldung_route
        uri: http://baeldung.com
        predicates:
        - Path=/baeldung/
management:
  endpoints:
    web:
      exposure:
        include: "*'

И код приложения Gateway:

@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

«

{
    "id":"baeldung_route",
    "predicates":[{
        "name":"Path",
        "args":{"_genkey_0":"/baeldung"}
    }],
    "filters":[],
    "uri":"http://baeldung.com",
    "order":0
}

«После запуска приложения мы можем получить доступ к URL-адресу: «http://localhost/actuator/gateway/routes/baeldung_route», чтобы проверить всю созданную конфигурацию маршрутизации:

Мы видим, что относительный URL-адрес: « /baeldung настроен как маршрут, поэтому, нажав на URL-адрес «http://localhost/baeldung», мы будем перенаправлены на «http://baeldung.com», как это было настроено в нашем примере.

9. Заключение

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