官網上給出的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
