六、Spring Cloud組件 - Gateway

Gateway是什麼

Cloud 全家桶中有個很重要的組件就是網關,在1.X版本中都是採用zuul網關,但是在2.X中,zuul網關升級出現分歧。Spring Cloud最後自己研發了一個網關代替zuul。

SpringCloud Gateway(親兒子)是Spring Cloud的一個全新項目,基於Spring 5.0+Spring Boot 2.0和Project Reactor等技術開發的網關,它旨在爲微服務架構提供一種簡單有效的統一的API路由管理方式。

SpringCloud Gateway作爲Spring Cloud生態系統中的網關,目標是替代Zuul,在Spring Cloud 2.0以上版本中,沒有對新版本的Zuul 2.0以上最新高性能版本進行集成,仍然還是使用的Zuul 1.x非Reactor模式的老版本。而爲了提升網關的性能, SpringCloud Gateway是基於WebFlux框架實現的,而WebFlux框架底層則使用了高性能的Reactor模式通信框架Netty.

Spring Cloud Gateway的目標提供統一的路由方式且基於Filter鏈的方式提供了網關基本的功能,例如:安全,監控/指標,和限流。

WebFlux是什麼東東:https://blog.csdn.net/z69183787/article/details/104258659

爲什麼選擇Gateway

一方面因爲Zu1.0已經進入了維護階段,而且Gateway是SpringCloud團隊研發的,是親兒子產品,值得信賴。
而且很多功能Zuul都沒有用起來也非常的簡單便捷。

Gateway是基於異步非阻塞模型上進行開發的,性能方面不需要擔心。雖然Netflix早就發佈了最新的Zuul 2.x,
但Spring Cloud貌似沒有整合計劃。而且Netfix相關組件都宣佈進入維護期;不知前景如何?

多方面綜合考慮Gateway是很理想的網關選擇。

Gateway能幹什麼

  • 反向代理
  • 鑑權
  • 流量控制
  • 熔斷
  • 日誌監控
  • 等等

微服務架構中網關在什麼位置,請看下圖

在這裏插入圖片描述

Gateway具有的特性

  • 基於Spring Framework 5, Project Reactor和Spring Boot 2.0進行構建;
  • 動態路由:能夠匹配任何請求屬性;
  • 可以對路由指定Predicate (斷言)和Filter (過濾器) ;
  • 集成Hystrix的斷路器功能;
  • 集成Spring Cloud服務發現功能;
  • 易於編寫的Predicate (斷言)和Filter (過濾器)
  • 請求限流功能;
  • 支持路徑重寫。

Spring Cloud Gateway與Zuul的區別

在SpringCloud Finchley正式版之前, Spring Cloud推薦的網關是Netflix提供的Zuul:

  1. Zuul 1.x,是一個基於阻塞1/0的API Gateway
  2. Zuul 1.x基於Servlet 2.5使用阻塞架構它不支持任何長連接(如WebSocket) Zuul的設計模式和Nginx較像,每次1/0操作都是工作線程中選擇一個執行,請求線程被E塞到工作線完成,但是差別是Nginx用C++實現, Zuul用Java實現,而JVM本身會有一次加載較慢的情況,使得Zuul的性能相對較差。
  3. Zuul 2.x理念更先進,想基於Netty非阻塞和支持長連接,但SpringCloud目前還沒有整合。Zuul 2.x的性能較Zuul 1.x有較大提升。在性能方面,根據官方提供的基準測試, Spring Cloud Gateway的RPS (每秒請求數)是Zuul的1.6倍。
  4. Spring Cloud Gateway建立在Spring Framework 5、 Project Reactor和Spring Boot 2之上,使用非阻塞API.
  5. Spring Cloud Gateway還支持WebSocket,並且與Spring緊密集成擁有更好的開發體驗

Gateway三大核心概念

  • route(路由):路由是構建網關的基本模塊,它由ID,目標URI,一系列的斷言和過濾器組成,如果斷言爲true則匹配該路由
  • predicate(斷言):參考的是Java8的java.util.function.Predicate,開發人員可以匹配HTTP請求中的所有內容(例如請求頭或請求參數),如果請求與斷言相匹配則進行路由
  • filter(過濾):指的是Spring框架中GatewayFilter的實例,使用過濾器,可以在請求被路由前或者之後對請求進行修改。

web請求,通過一些匹配條件,定位到真正的服務節點。並在這個轉發過程的前後,進行一些精細化控制。
predicate就是我們的匹配條件;而fiter,就可以理解爲一個無所不能的攔截器。有了這兩個元素,再加上目標uri,就可以實現一個具體的路由了

Gateway工作流程

在這裏插入圖片描述

客戶端向Spring Cloud Gateway發出請求。然後在Gateway Handler Mapping中找到與請求相匹配的路由,將其發送到Gateway Web Handler.

Handler再通過指定的過濾器鏈來將請求發送到我們實際的服務執行業務邏輯,然後返回。
過濾器之間用虛線分開是因爲過濾器可能會在發送代理請求之前(pre)或之後(post)執行業務邏輯

Filter在pre類型過濾可以做參數校驗、權限校驗、流量監控、日誌輸出、協議轉換等

在post類型過濾器中可以做響應內容、響應頭的修改、日誌輸出、流量監控等非常重要的功能。

核心邏輯:路由轉發+執行過濾器鏈

代碼實戰

請查看電商7.0項目源碼

路由配置的兩種方法

  • yml配置

    spring:
      cloud:
        gateway:
          locator:
            enabled: true
          routes:
            #認證服務
            - id: leimingtech-auth-server
              uri: lb://leimingtech-auth-server
              order: 1
              predicates:
                - Path=/auth/**
              filters:
                - StripPrefix=0
    
  • 配置類

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("circuitbreaker_route", r -> r.path("/consumingServiceEndpoint")
                .filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis"))
                    .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088")
            .build();
    }
    

常用的Predicate

https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/

Filter分爲兩種

  • GlobalFilter(全局網關)
  • GatewayFilter(單一網關)

Spring Cloud Gateway自帶Filter

https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章