探索新的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 –
標準的SpringWebFilter
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存儲庫中找到。