官網上給出的Spring Cloud Gateway特性如下圖所示:

翻譯過來就是:

  • 基於 Spring Framework 5 ,Project Reactor 以及 Spring Boot 2.0 構建
  • 路由能夠匹配任何請求屬性
  • Predicates和Filters可以區分路由生效
  • 集成了斷路器
  • 繼承了Spring Cloud DiscoveryClient
  • 輕鬆編寫Predicates和Filters
  • 請求流控
  • 路徑重寫

通過上面的圖片可以看出Spring Cloud Gateway的主要功能是由Predicate、Filter以及Route實現,同時也能看出這裡對應到了新特性裡的“Predicates和Filters可以區分路由生效”。

Route(路由):路由是閘道器的基本單元,由ID、URI、一組Predicate、一組Filter組成,根據Predicate進行匹配轉發。

Predicate(斷言):路由轉發的判斷條件,目前Spring Cloud Gateway支援多種方式,常見如:Path、Query、Method、Header等,寫法必須遵循 key=vlue的形式。

Filter(過濾器):過濾器是路由轉發請求時所經過的過濾邏輯,可用於修改請求、響應內容等。

路由和過濾器的概念在之前Zuul閘道器的學習中也有所涉及,這裡重點學習一下Predicate:

在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性實現了各種路由匹配規則,有通過 Header、請求引數等不同的條件來進行作為條件匹配到對應的路由。網上有一張圖總結了 Spring Cloud 內建的幾種 Predicate 的實現。

圖中的謂語就是Predicate的另一種翻譯,也可以看到有很多型別的Predicate。比如說時間型別的Predicate(AfterRoutePredicateFactory、BeforeRoutePredicateFactory以及BetweenRoutePredicateFactory),當只有滿足特定時間要求的請求會進入到此Predicate中,並交由Route處理;Cookie型別的CookieRoutePredicateFactory,指定的Cookie滿足正則匹配,才會進入此Route。此外還有Host、Method、Path、Queryparam、Remoteaddr型別的Predicate,每一種Predicate都會對當前的客戶端請求進行判斷。

接下來通過一個具體的例子來感受一些Spring Cloud Gateway:

pom中新增相關依賴,由於Spring Cloud Gateway繼承了斷路器,因此也需要新增hystrix的依賴,否則會出現報錯:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

如果啟動時有報java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/exc/InvalidDefinitionException。那是由於版本衝突,需要手動新增jackson的依賴並指定明確的版本(2.8.5以上):

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.9.5</version>
</dependency>

具體的Route、Predicate、Filter等設定可以通過程式碼或者配置檔案來實現,這裡我們還是通過application.yml來實現:

server:
port: 10290
spring:
application:
name: spring-cloud-gateway
cloud:
gateway:
routes:
#路由標識
- id: route-service
uri: http://127.0.0.1:10090
order: 0
predicates:
#匹配127.0.0.1:10290/provider?mode=test
- Path=/provider
- Query=mode, test #引數在轉發的過程中不會丟失
filters:
#127.0.0.1:10090/query/getServiceName?mode=test
- RewritePath=/provider, /query/getServiceName

完成上述配置後,我們啟動服務來進行驗證:

沒有問題!

參考資料:

https://blog.csdn.net/qq_38380025/article/details/102968559

https://www.cnblogs.com/crazymakercircle/p/11704077.html

https://blog.csdn.net/weixin_41357182/article/details/100140772