SpringCloud之Gateway

挑戰者V發表於2020-11-07

一、為什麼選擇SpringCloud Gateway而不是Zuul?

Gateway和Zuul的職責一樣,都承擔著請求分發,類似Nginx分發到後端伺服器。

1.SpingCloud Gateway 和SpringCloud Zuul對比分析

(1)相同點

  • 底層都是servlet
  • 兩者均是web閘道器,處理的是http請求

(2)不同點

a.內部實現

gateway對比zuul多依賴了spring-webflux,在spring的支援下,功能更強大,內部實現了限流、負載均衡等,擴充套件性也更強,但同時也限制了僅適合於Spring Cloud套件;
zuul則可以擴充套件至其他微服務框架中,其內部沒有實現限流、負載均衡等。

b.是否支援非同步

zuul僅支援同步;
gateway支援非同步(理論上gateway則更適合於提高系統吞吐量(但不一定能有更好的效能),最終效能還需要通過嚴密的壓測來決定)。

c.框架設計的角度

gateway具有更好的擴充套件性,並且其已經發布了2.0.0的RELESE版本,穩定性也是非常好的。

d.效能

Zuul和Gateway哪個效能更好,有朋友特別做了測試並寫下了文章:
微服務閘道器選型:spring cloud gateway、zuul 1效能對比測試

e.限流

Zuul2:可通過配置檔案或者filter實現;
Gateway:可對IP、使用者、叢集進行限流,並提供擴充套件介面。

f.鑑權

Zuul2:filter中程式碼實現;
Gateway:普通鑑權、auth2.0。

g.監控

Zuul2:filter中程式碼實現;
Gateway:Gateway Metrics Filter實現。

h.易用性

Zuul2:參考較少;
Gateway:簡單易用。

(3)架構圖

a.Zuul2內部架構圖

圖一

b.Gateway內部架構圖

圖二

2.究竟該選Gateway還是Zuul?

我的看法是結合業務場景和實際情況。比方說,如果是一個新的專案可以採用Gateway,如果是二次開發某個專案,而那個專案閘道器用的是Zuul,建議不要改,保持現狀,直到真正搞懂了那個專案和框架底層,可以嘗試試驗換(最終換不換在於換的成本有多高,如果太高的話,還是不要換)。

二、SpringCloud整合Gateway

1.匯入Maven依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2.配置檔案

server:
  port: 8080

spring:
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        # 認證中心
        - id: blog-api
          uri: lb://blog-api
          predicates:
            - Path=/api/**
          filters:
            - StripPrefix=1

application:
  name: blog-gateway-server

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

3.啟動並測試

整合其實非常簡單,關鍵在於兩個:
第一,SpringCloud和SpringBoot版本要相容;
第二,配置檔案要對,否則會遇到這樣的問題,能夠正常啟動,但是通過閘道器訪問不到下面的微服務。

我的測試效果,如圖:
圖三

如果有朋友對Zuul感興趣,可以參考我的這篇文章:
SpringCloud之Zuul

本文參考資料如下:
微服務閘道器Zuul和Gateway的區別
SpringCloud Gateway 新閘道器與zuul的對比選型
微服務閘道器選型:spring cloud gateway、zuul 1效能對比測試
Zuul和Gateway對比

相關文章