1. Обзор
В этой статье мы рассмотрим основные функции проекта Spring Cloud Gateway , нового API, основанного на Spring 5, Spring Boot 2 и Project Reactor.
Инструмент предоставляет готовые механизмы маршрутизации, часто используемые в приложениях микросервисов, чтобы скрыть несколько служб за одним фасадом.
Для объяснения шаблона шлюза без проекта Spring Cloud Gateway ознакомьтесь с нашей предыдущей статьей .
2. Обработчик маршрутизации
Ориентируясь на запросы маршрутизации, шлюз Spring Cloud перенаправляет запросы на сопоставление обработчика шлюза, которое определяет, что следует делать с запросами, соответствующими определенному маршруту.
Давайте начнем с краткого примера того, как обработчик шлюза разрешает конфигурации маршрутизатора с помощью Route Locator:
@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:
- Маршрут – основной API шлюза. Он определяется заданной идентификацией (ID), назначением (URI) и набором предикатов и фильтров
- Предикат – Предикат Java 8– , который используется для сопоставления HTTP-запросов с использованием заголовков, методов или параметров Фильтр –
- стандартный пружинный Веб-фильтр
3. Динамическая маршрутизация
Как и Zuul , Spring Cloud Gateway предоставляет средства для маршрутизации запросов к различным службам.
Конфигурация маршрутизации может быть создана с помощью чистой Java ( Route Locator , как показано в примере в разделе 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 Web Flux Сопоставление обработчиков инфраструктура.
Он также включает в себя множество встроенных фабрик предикатов маршрутов. Все эти предикаты соответствуют различным атрибутам HTTP-запроса. Несколько фабрик предикатов маршрута могут быть объединены с помощью логического “и”.
Сопоставление маршрутов может быть применено как программно, так и с помощью файла свойств конфигурации с использованием другого типа фабрик предикатов маршрутов.
В нашей статье Spring Cloud Gateway Routing Predicate Factories более подробно рассматриваются фабрики маршрутизации.
5. Фабрики веб-фильтров
Фильтры маршрутов позволяют изменять входящий HTTP-запрос или исходящий HTTP-ответ.
Spring Cloud Gateway включает в себя множество встроенных фабрик веб-фильтров, а также возможность создания пользовательских фильтров.
В нашей статье Spring Cloud Gateway Web Filter Factories более подробно рассматриваются фабрики веб-фильтров.
6. Поддержка клиентов Spring Cloud Discovery
Spring Cloud Gateway можно легко интегрировать с библиотеками обнаружения служб и реестров, такими как Eureka Server и Consul:
@Configuration @EnableDiscoveryClient public class GatewayDiscoveryConfiguration { @Bean public DiscoveryClientRouteDefinitionLocator discoveryClientRouteLocator(DiscoveryClient discoveryClient) { return new DiscoveryClientRouteDefinitionLocator(discoveryClient); } }
6.1. Фильтр клиента LoadBalancer
Клиентский фильтр LoadBalancer ищет URL-адрес в свойстве атрибута exchange с помощью Server Web Exchange Utils.GATEWAY_REQUEST_URL_ATTR.
Если URL-адрес имеет схему lb (например, lb://baeldung-service) , он будет использовать клиент Spring Cloud LoadBalancer для разрешения имени (т. Е. baeldung-service) на фактический хост и порт.
Неизмененный исходный URL-адрес помещается в Utils Server Web Exchange.GATEWAY_ORIGINAL_REQUEST_URL_ATTR атрибут.
7. Мониторинг
Spring Cloud Gateway использует API привода, хорошо известную библиотеку Spring-Boot, которая предоставляет несколько готовых сервисов для мониторинга приложения.
После установки и настройки API привода функции мониторинга шлюза можно визуализировать, обратившись к /gateway/ endpoint.
8. Реализация
Теперь мы создадим простой пример использования Spring Cloud Gateway в качестве прокси-сервера с использованием предиката path .
Теперь мы создадим простой пример использования Spring Cloud Gateway в качестве прокси-сервера с использованием предиката || path||.
Шлюз Spring Cloud в настоящее время находится в репозитории milestones версии 2.0.0.RC2. Это также версия, которую мы используем здесь.
Чтобы добавить проект, мы будем использовать систему управления зависимостями:
org.springframework.cloud spring-cloud-gateway 2.0.0.RC2 pom import
Далее мы добавим необходимые зависимости:
org.springframework.boot spring-boot-actuator org.springframework.boot spring-boot-starter-webflux org.springframework.cloud spring-cloud-starter-gateway
8.2. Реализация кода
А теперь мы создаем простую конфигурацию маршрутизации в файле application.yml :
spring: cloud: gateway: routes: - id: baeldung_route uri: http://baeldung.com predicates: - Path=/baeldung/ management: endpoints: web: exposure: include: "*'
И код приложения шлюза:
@SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
После запуска приложения мы можем получить доступ к URL-адресу: “http://localhost/actuator/gateway/routes/baeldung_route” для проверки всех созданных конфигураций маршрутизации:
{ "id":"baeldung_route", "predicates":[{ "name":"Path", "args":{"_genkey_0":"/baeldung"} }], "filters":[], "uri":"http://baeldung.com", "order":0 }
Мы видим, что относительный URL: “/baeldung” настроен как маршрут, поэтому попадание по URL “http://localhost/baeldung” мы будем перенаправлены на ” http://baeldung.com “, как было настроено в нашем примере.
9. Заключение
В этой статье мы рассмотрели некоторые функции и компоненты, входящие в состав Spring Cloud Gateway. Этот новый API предоставляет готовые инструменты для поддержки шлюза и прокси-сервера.
Примеры, представленные здесь, можно найти в нашем репозитории GitHub .