1. 概述
在本教程中,我們將探索 Spring Cloud Gateway 項目的主要功能,這是一個基於 Spring 6、Spring Boot 3 和 Project Reactor 的新 API。
該工具提供了一套開箱即用的路由機制,通常用於微服務應用程序中,作為隱藏多個服務在單個外觀背後的方式。
要了解 Gateway 模式(不包括 Spring Cloud Gateway 項目),請查看我們之前的文章。
2. 路由處理程序
Spring Cloud Gateway 專注於路由請求,會將請求轉發到 Gateway Handler 映射,該映射確定瞭如何處理與特定路由匹配的請求。
下面是一個 Gateway Handler 通過使用 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 節示例所示) 或使用屬性配置創建:
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: baeldung
uri: baeldung.com
- id: myOtherRouting
uri: localhost:99994. 路由工廠
Spring Cloud Gateway 通過使用 Spring WebFlux 的 HandlerMapping 基礎設施來匹配路由。
它還包含許多內置的 Route Predicate 工廠。所有這些謂詞都匹配 HTTP 請求的不同屬性。可以通過邏輯“and”組合多個 Route Predicate 工廠。
路由匹配既可以通過編程方式,也可以通過配置屬性文件使用不同類型的 Route Predicate 工廠。
我們的文章 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 過濾器
該 LoadBalancerClient 過濾器通過使用 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 屬性查找交換屬性中的 URI。
如果 URL 包含 lb 方案(例如 lb://baeldung-service),它將使用 Spring Cloud LoadBalancerClient 將名稱(即 baeldung-service)解析為實際的主機和端口。
未修改的原始 URL 將放置在 ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR 屬性中。
7. 監控
Spring Cloud Gateway 利用 Actuator API,這是一個成熟的 Spring Boot 庫,它提供了一系列內置的服務,用於監控應用程序。
安裝並配置了 Actuator API 後,可以通過訪問 /gateway/ 端點來可視化網關監控功能。
8. 實現
我們將創建一個簡單的 Spring Cloud Gateway 作為代理服務器的示例,使用 路徑 謂詞。
8.1. 依賴項
為了添加該項目,我們將使用 spring-cloud-starter-gateway 依賴項,它將獲取所有必需的依賴項:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>4.1.0</version>
</dependency>8.2. 代碼實現
現在,我們將在 application.yml 文件中創建一個簡單的路由配置:
spring:
cloud:
gateway:
routes:
- id: baeldung_route
uri: http://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);
}
}