Перейти к основному содержимому

Изучение нового Spring Cloud Gateway

· 4 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

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("**.foreach.com")
.and()
.path("/foreach")
.uri("http://foreach.com"))
.route(r -> r.host("**.foreach.com")
.and()
.path("/myOtherRouting")
.filters(f -> f.prefixPath("/myPrefix"))
.uri("http://othersite.com")
.id("myOtherID"))
.build();
}

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

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

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

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

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

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

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

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

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

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

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

5. Фабрики веб-фильтров

Фильтры маршрутов делают возможным изменение входящего 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

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

Если URL-адрес имеет схему lb (например, lb://foreach-service) , он будет использовать Spring Cloud LoadBalancerClient для преобразования имени (т. е. foreach-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: foreach_route
uri: http://foreach.com
predicates:
- Path=/foreach/
management:
endpoints:
web:
exposure:
include: "*'

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

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

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

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

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

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

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

Представленные здесь примеры можно найти в нашем репозитории GitHub .