官網上給出的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可以區分路由生效”。
路由和過濾器的概念在之前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: 10290spring: 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
完成上述配置後,我們啟動服務來進行驗證:
沒有問題!