Изследване на New Spring Cloud Gateway

1. Общ преглед

В тази статия ще разгледаме основните характеристики на проекта Spring Cloud Gateway, нов API, базиран на Spring 5, Spring Boot 2 и Project Reactor.

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

За обяснение на модела на шлюза без проекта Spring Cloud Gateway вижте предишната ни статия.

2. Манипулатор на маршрутизация

Съсредоточен върху заявките за маршрутизиране, Spring Cloud Gateway препраща заявки към картографиране на Gateway Handler - което определя какво трябва да се направи с заявки, съответстващи на определен маршрут.

Нека започнем с бърз пример за това как манипулаторът на шлюз разрешава конфигурациите на маршрута с помощта на RouteLocator:

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

Забележете как използвахме основните градивни елементи на този API:

  • Route - основният API на шлюза. Определя се чрез дадена идентификация (ID), дестинация (URI) и набор от предикати и филтри
  • Predicate - предикат на Java 8 - който се използва за съвпадение на HTTP заявки, използвайки заглавки, методи или параметри
  • Филтър - стандартен WebFilter на 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 Routing Predicate Factories изследва фабриките за маршрутизиране по-подробно.

5. Заводи за WebFilter

Филтрите за маршрути правят възможна модификацията на входящата HTTP заявка или изходящия HTTP отговор.

Spring Cloud Gateway включва много вградени фабрики на WebFilter, както и възможност за създаване на персонализирани филтри.

Нашата статия Spring Cloud Gateway WebFilter Factories изследва фабриките на WebFilter по-подробно.

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

Spring Cloud Gateway може лесно да се интегрира с библиотеките за откриване на услуги и регистрите, като 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: // baeldung-service), той ще използва Spring Cloud LoadBalancerClient, за да разреши името (т.е. baeldung-service) към действителен хост и порт.

Немодифицираният оригинален URL адрес се поставя в атрибута ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR .

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

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

След като API на Actuator бъде инсталиран и конфигуриран, функциите за наблюдение на шлюза могат да бъдат визуализирани чрез достъп до / шлюз / крайна точка.

8. Прилагане

Сега ще създадем прост пример за използването на Spring Cloud Gateway като прокси сървър, използващ предиката на пътя .

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

Понастоящем Spring Cloud Gateway е в хранилището на етапите, версия 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: //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); } }

След стартирането на приложението можем да осъществим достъп до url: “// localhost / actuator / gateway / routes / baeldung_route”, за да проверим цялата създадена конфигурация на маршрутизация:

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

Виждаме, че относителният url: „/ baeldung“ е конфигуриран като маршрут,така че като натиснете URL адреса // // localhost / baeldung , ще бъдем пренасочени към //baeldung.com , както е конфигурирано в нашия пример.

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

В тази статия разгледахме някои от функциите и компонентите, които са част от Spring Cloud Gateway. Този нов API предоставя готови инструменти за поддръжка на шлюз и прокси.

Примерите, представени тук, могат да бъдат намерени в нашето хранилище на GitHub.