Spring Cloud Gateway 是 Spring Cloud 的一個全新項目,該項目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技術開發的網關,它旨在為微服務架構提供一種簡單有效的統一的 API 路由管理方式。
Spring Cloud Gateway 作為 Spring Cloud 生态系統中的網關,目标是替代 Netflix Zuul,其不僅提供統一的路由方式,并且基于 Filter 鍊的方式提供了網關基本的功能,例如:安全,監控/名額,和限流。
相關概念:
Route(路由):這是網關的基本建構塊。它由一個 ID,一個目标 URI,一組斷言和一組過濾器定義。如果斷言為真,則路由比對。
Predicate(斷言):這是一個 Java 8 的 Predicate。輸入類型是一個 ServerWebExchange。我們可以使用它來比對來自 HTTP 請求的任何内容,例如 headers 或參數。
Filter(過濾器):這是org.springframework.cloud.gateway.filter.GatewayFilter的執行個體,我們可以使用它修改請求和響應。
工作流程:
用戶端向 Spring Cloud Gateway 送出請求。如果 Gateway Handler Mapping 中找到與請求相比對的路由,将其發送到 Gateway Web Handler。Handler 再通過指定的過濾器鍊來将請求發送到我們實際的服務執行業務邏輯,然後傳回。 過濾器之間用虛線分開是因為過濾器可能會在發送代理請求之前(“pre”)或之後(“post”)執行業務邏輯。
Spring Cloud Gateway 的特征:
基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
動态路由
Predicates 和 Filters 作用于特定路由
內建 Hystrix 斷路器
內建 Spring Cloud DiscoveryClient
易于編寫的 Predicates 和 Filters
限流
路徑重寫
Spring Cloud Gateway 與 Zuul的差別:
1、Zuul 1.x,是一個基于阻塞 I/ O 的 API Gateway
2、Zuul 1.x 基于Servlet 2. 5,使用阻塞架構,它不支援任何長連接配接,如 WebSocket。 Zuul 的設計模式和Nginx較像,每次 I/ O 操作都是從工作線程中選擇一個執行,請求線程被阻塞到工作線程完成,但是差别是Nginx 用C++ 實作,Zuul 用 Java 實作,而 JVM 本身會有第一次加載較慢的情況,使得Zuul 的性能相對較差。
3、Zuul 2.x,基于 Netty 非阻塞、支援長連接配接,但 Spring Cloud 目前還沒有整合。 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 緊密內建, 擁有更好的開發體驗。