聊聊Spring Cloud Gateway

網關概述

整體來看,網關有點類似於門面,所有的外部請求都會先經過網關這一層。

網關不僅只是做一個請求的轉發及服務的整合,有了網關這個統一的入口之後,它還能提供以下功能。

  • 針對所有請求進行統一鑑權、限流、熔斷、日誌。
  • 協議轉化。針對後端多種不同的協議,在網關層統一處理後以HTTP對外提供服務。譬如針對Dubbo服務還需要提供一個Web應用來進行協議轉化,此時可以在API網關層轉換協議。
  • 統一錯誤碼處理。
  • 灰度發佈
  • 請求轉發,並且可以基於網關實現內、外網隔離。

常用的解決方案場景如下:

image

image

image

Spring Cloud Gateway

Spring Cloud Gateway是基於Spring Boot 2.0、Spring WebFlux和Project Reactor等技術開發的網關,它不僅提供了統一的路由請求的方式,還基於過濾鏈的方式提供了網關最基本的功能;解決了Spring Cloud Zuul的性能問題:

  • Zuul 1.x採用的是傳統的thread per connection方式來處理請求,也就是針對每一個請求,會爲這個請求專門分配一個線程來進行處理,直到這個請求完成之後纔會釋放線程,一旦後臺服務器響應較慢,就會使得該線程被阻塞,所以它的性能不是很好。

  • Zuul 1.x採用的是傳統的thread per connection方式來處理請求,也就是針對每一個請求,會爲這個請求專門分配一個線程來進行處理,直到這個請求完成之後纔會釋放線程,一旦後臺服務器響應較慢,就會使得該線程被阻塞,所以它的性能不是很好。

Spring WebFlux基於Project Reactor響應式框架實現了完全無阻塞的、響應式的、高併發性能的、網絡請求響應;解決了如上的Zuul性能問題。

個人覺得,其實就是類似Nginx、Redis等基於Reactor模式的實現;也是非阻塞IO(Epoll)的另一種體現。

請求過程及關鍵概念

Spring Cloud Gateway的請求處理過程如圖所示,其中有幾個非常重要的概念。

  • 路由(Route):它是網關的基本組件,由ID、目標URI、Predicate集合、Filter集合組成。

  • 謂語(Predicate):它是Java 8中引入的函數式接口,提供了斷言的功能。它可以匹配HTTP請求中的任何內容。如果Predicate的聚合判斷結果爲true,則意味着該請求會被當前Router進行轉發。

  • 謂語(Predicate):它是Java 8中引入的函數式接口,提供了斷言的功能。它可以匹配HTTP請求中的任何內容。如果Predicate的聚合判斷結果爲true,則意味着該請求會被當前Router進行轉發。

image

Spring Cloud Gateway啓動時基於Netty Server監聽一個指定的端口(該端口可以通過server.port屬性自定義)。當客戶端發送一個請求到網關時,網關會根據一系列Predicate的匹配結果來決定訪問哪個Route路由,然後根據過濾器鏈進行請求的處理。過濾器鏈可以在請求發送到後端服務器之前和之後執行,也就是首先執行Pre過濾器鏈,然後將請求轉發到後端的微服務執行具體的業務,最後執行Post過濾器鏈。

Route Predicate Factories

Predicate是Java 8提供的一個函數式接口,它允許接收一個參數並返回一個布爾值,可以用於條件過濾、請求參數的校驗。

image

在Spring Cloud Gateway中,Predicate提供了路由規則的匹配機制。比如:

image

意思是通過Path屬性來匹配URL前綴是/gateway/的請求。

如下,Spring Cloud Gateway默認提供了很多Route Predicate Factory,這些Predicate會分別匹配HTTP請求的不同屬性,並且多個Predicate可以通過and邏輯進行組合。

image

Gateway Filter Factories

Filter分爲Pre類型的過濾器和Post類型的過濾器。

  • Pre類型的過濾器在請求轉發到後端微服務之前執行,在Pre類型過濾器鏈中可以做鑑權、限流等操作。

  • Post類型的過濾器在請求執行完之後、將結果返回給客戶端之前執行。

在Spring Cloud Gateway中內置了很多Filter,Filter有兩種實現,分別是GatewayFilter和GlobalFilter。GlobalFilter會應用到所有的路由上,而GatewayFilter只會應用到單個路由或者一個分組的路由上。

GatewayFilter

Spring提供了一些內置的GatewayFilter,如:

  • AddRequestParameter GatewayFilter Factory:該過濾器的功能是對所有匹配的請求添加一個查詢參數。
    image

  • AddResponseHeader GatewayFilter Factory:該過濾器會對所有匹配的請求,在返回結果給客戶端之前,在Header中添加相應的數據。
    在上面這段配置中,會在Response中添加Header頭,
    image
    在上面這段配置中,會在Response中添加Header頭,key=X-Response-Foo,Value=Bar。

  • RequestRateLimiter GatewayFilter Factory:該過濾器會對訪問到當前網關的所有請求執行限流過濾,如果被限流,默認情況下會響應HTTP 429-Too Many Requests。
    RequestRateLimiterGatewayFilterFactory默認提供了RedisRateLimiter的限流實現,它採用令牌桶算法來實現限流功能。
    image
    redis-rate-limiter過濾器有兩個配置屬性:
    image

  • Retry GatewayFilter Factory:Retry GatewayFilter Factory爲請求重試過濾器,當後端服務不可用時,網關會根據配置參數來發起重試請求。
    image
    RetryGatewayFilter提供4個參數來控制重試請求,參數說明如下。
    image

GlobalFilter

GlobalFilter和GatewayFilter的作用是相同的,只是GlobalFilter針對所有的路由配置生效。Spring Cloud Gateway內置的全局過濾器也有很多,比如:

image

全局過濾鏈的執行順序是,當Gateway接收到請求時,Filtering Web Handler處理器會將所有的GlobalFilter實例及所有路由上所配置的GatewayFilter實例添加到一條過濾器鏈中。該過濾器鏈裏的所有過濾器都會按照@Order註解所指定的數字大小進行排序。

  • LoadBalancerClientFilter:LoadBalancerClientFilter是用於實現請求負載均衡的全局過濾器,配置如下。
    image
    如果URI配置的是lb://example_service,那麼這個過濾器會識別到lb://,並且使用Spring Cloud LoadBalancerClient將example_service名稱解析成實際訪問的主機和端口地址。

  • GatewayMetricsFilter:GatewayMetricsFilter是網關指標過濾器,這個過濾器會添加name=gateway.requests的timer metrics,其中包含以下數據。
    image
    這些指標通過http://ip:port/actuator/metrics/gateway.requests獲得,前提是需要添加Spring Boot Actuator依賴。

自定義過濾器

Spring Cloud Gateway提供了過濾器的擴展功能,開發者可以根據實際業務需求來自定義過濾器。同樣,自定義過濾器也支持GlobalFilter和GatewayFilter兩種。

  • 自定義GatewayFilter:自定義過濾器類GpDefineGatewayFilterFactory,繼承AbstractGatewayFilterFactory。

  • 自定義GlobalFilter:GlobalFilter的實現比較簡單,它不需要額外的配置,只需要實現GlobalFilter接口,自動會過濾所有的Route。

集成

Spring Cloud Gateway支持與其他解決方案集成,實現更強大的功能,比如Spring Cloud Alibaba系列。

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