探索新的Spring Cloud Gateway

1.概述

在本文中,我們將探討Spring Cloud Gateway項目的主要功能,該項目是基於Spring 5,Spring Boot 2和Project Reactor的新API。

該工具提供了開箱即用的路由機制,經常在微服務應用程序中使用,作為將多個服務隱藏在單個外觀後面的一種方式。

有關不使用Spring Cloud Gateway項目的網關模式的說明,請查看我們以前的文章。

2.路由處理程序

Spring Cloud Gateway專注於路由請求,將請求轉發到網關處理程序映射-後者確定與特定路由匹配的請求應執行的操作。

讓我們從一個簡單的示例開始,該示例說明網關處理程序如何使用RouteLocator:解析路由配置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 –網關的主要API。它由給定的標識(ID),目標(URI)以及謂詞和過濾器集定義
  • Predicate – Java 8的Predicate –用於通過標頭,方法或參數匹配HTTP請求
  • Filter –標準的Spring WebFilter

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基礎結構匹配路由。

它還包括許多內置的Route Predicate工廠。所有這些謂詞都與HTTP請求的不同屬性匹配。多個路由謂詞工廠可以通過邏輯“和”進行組合。

路由匹配既可以通過編程方式應用,也可以通過配置屬性文件使用其他類型的Route Predicate Factories來應用。

我們的文章Spring Cloud Gateway路由謂詞工廠更詳細地探討了路由工廠。

5. WebFilter工廠

路由過濾器使修改傳入的HTTP請求或傳出的HTTP響應成為可能。

Spring Cloud Gateway包括許多內置的WebFilter工廠以及創建自定義過濾器的可能性。

我們的文章Spring Cloud Gateway WebFilter工廠更詳細地探討了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使用ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR.在交換屬性屬性中查找URI ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR.

如果URL具有lb方案(例如lb://baeldung-service)它將使用Spring Cloud LoadBalancerClient將名稱(ie, baeldung-service)解析為實際的主機和端口。

未經修改的原始URL放置在ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR屬性中。

7.監控

Spring Cloud Gateway利用Actuator API,這是一個著名的Spring-Boot庫,它提供了一些現成的服務來監視應用程序。

一旦安裝並配置了Actuator API,就可以通過訪問/gateway/端點來可視化網關監視功能。

8.實施

現在,我們將使用path謂詞創建一個簡單的示例,將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: "*'

以及網關應用程序代碼:

@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

 }

我們看到相對網址: “/baeldung”被配置為路由, 因此點擊網址“http://localhost/baeldung”我們將被重定向到“ http://baeldung.com ”,如示例中所配置。

9.結論

在本文中,我們探討了Spring Cloud Gateway的一部分功能和組件。這個新的API為網關和代理支持提供了現成的工具。

此處提供的示例可以在我們的GitHub存儲庫中找到。