Spring Cloud Gateway 學習+實踐


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM