Zuul1與Spring Cloud Gateway的區(qū)別及說明
Zuul1簡介
Zuul1是Netflix在2013年開源的網(wǎng)關(guān)組件,大規(guī)模的應(yīng)用在Netflix的生產(chǎn)環(huán)境中,經(jīng)受了實(shí)踐考驗(yàn)。它可以與Eureka、Ribbon、Hystrix等組件配合使用,實(shí)現(xiàn)路由轉(zhuǎn)發(fā)、負(fù)載均衡、熔斷等功能。Zuul1的核心是一系列過濾器,過濾器簡單易于擴(kuò)展,已經(jīng)有一些三方庫如spring-cloud-zuul-ratelimit等提供了過濾器支持。
Zuul1基于Servlet構(gòu)建,使用的是阻塞的IO,引入了線程池來處理請求。每個(gè)請求都需要獨(dú)立的線程來處理,從線程池中取出一個(gè)工作線程執(zhí)行,下游微服務(wù)返回響應(yīng)之前這個(gè)工作線程一直是阻塞的。
Spring Cloud Gateway簡介
Spring Cloud Gateway 是Spring Cloud的一個(gè)全新的API網(wǎng)關(guān)項(xiàng)目,目的是為了替換掉Zuul1。Gateway可以與Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等組件配合使用,實(shí)現(xiàn)路由轉(zhuǎn)發(fā)、負(fù)載均衡、熔斷等功能,并且Gateway還內(nèi)置了限流過濾器,實(shí)現(xiàn)了限流的功能。
Gateway基于Spring 5、Spring boot 2和Reactor構(gòu)建,使用Netty作為運(yùn)行時(shí)環(huán)境,比較完美的支持異步非阻塞編程。Netty使用非阻塞的IO,線程處理模型建立在主從Reactors多線程模型上。其中Boss Group輪詢到新連接后與Client建立連接,生成NioSocketChannel,將channel綁定到Worker;Worker Group輪詢并處理Read、Write事件。
產(chǎn)品對比
下邊以表格形式對Zuul1和Gateway作簡單對比:
| 對比項(xiàng) | Zuul1.x | Gateway |
|---|---|---|
| 實(shí)現(xiàn) | 基于Servlet2.x構(gòu)建,使用阻塞的API | 基于Spring 5、Project Reactor、Spring Boot 2,使用非阻塞式的API |
| 長連接 | 不支持 | 支持 |
| 不適用場景 | 后端服務(wù)響應(yīng)慢或者高并發(fā)場景下,因?yàn)榫€程數(shù)量是固定(有限)的,線程容易被耗盡,導(dǎo)致新請求被拒絕。 | 中小流量的項(xiàng)目,使用Zuul1.x更合適。 |
| 限流 | 無 | 內(nèi)置限流過濾器 |
| 上手難度 | 同步編程,上手簡單 | 門檻較高,上手難度中等 |
| Spring Cloud集成 | 是 | 是 |
| Sentinel集成 | 是 | 是 |
| 技術(shù)棧沉淀 | Zuul1開源近七年,經(jīng)受考驗(yàn),穩(wěn)定成熟。 | 未見實(shí)際落地案例 |
| Github used by | 1007 repositories | 102 repositories |
| Github issues | 88 Open / 2736 Closed | 135 Open / 850 Closed |
注:Github used by和Github issues統(tǒng)計(jì)時(shí)間截止2019/8/26。
性能對比
低并發(fā)場景
不同的tps,同樣的請求時(shí)間(50s),對兩種網(wǎng)關(guān)產(chǎn)品進(jìn)行壓力測試,結(jié)果如下:
| tps | 測試樣本Zuul1/Gateway,單位個(gè) | 平均響應(yīng)時(shí)間Zuul1/Gateway, 單位毫秒 | 99%響應(yīng)時(shí)間小于Zuul1/Gateway,單位毫秒 | 錯(cuò)誤比例Zuul1/Gateway |
|---|---|---|---|---|
| 20tps | 20977 / 20580 | 11 / 14 | 16 / 40 | 0% / 0% |
| 50tps | 42685 / 50586 | 18 / 12 | 66 / 22 | 0% / 0% |
并發(fā)較低的場景下,兩種網(wǎng)關(guān)的表現(xiàn)差不多
高并發(fā)場景
配置同樣的線程數(shù)(2000),同樣的請求時(shí)間(5分鐘),后端服務(wù)在不同的響應(yīng)時(shí)間(休眠時(shí)間),對兩種網(wǎng)關(guān)產(chǎn)品進(jìn)行壓力測試,結(jié)果如下:
| 休眠時(shí)間 | 測試樣本Zuul1/Gateway,單位個(gè) | 平均響應(yīng)時(shí)間Zuul1/Gateway, 單位毫秒 | 99%響應(yīng)時(shí)間小于Zuul1/Gateway,單位毫秒 | 錯(cuò)誤次數(shù)Zuul1/Gateway,單位個(gè) | 錯(cuò)誤比例Zuul1/Gateway |
|---|---|---|---|---|---|
| 休眠100ms | 294134 / 1059321 | 2026 / 546 | 6136 / 1774 | 104 / 0 | 0.04% / 0% |
| 休眠300ms | 101194 / 399909 | 5595 / 1489 | 15056 / 1690 | 1114 / 0 | 1.10% / 0% |
| 休眠600ms | 51732 / 201262 | 11768 / 2975 | 27217 / 3203 | 2476 / 0 | 4.79% / 0% |
| 休眠1000ms | 31896 / 120956 | 19359 / 4914 | 46259 / 5115 | 3598 / 0 | 11.28% / 0% |
Zuul網(wǎng)關(guān)的tomcat最大線程數(shù)為400,hystrix超時(shí)時(shí)間為100000。
Gateway在高并發(fā)和后端服務(wù)響應(yīng)慢的場景下比Zuul1的表現(xiàn)要好。
官方性能對比
Spring Cloud Gateway的開發(fā)者提供了benchmark項(xiàng)目用來對比Gateway和Zuul1的性能,官方提供的性能對比結(jié)果如下:
| 網(wǎng)關(guān) | Avg Req/sec/Thread | Avg Latency |
|---|---|---|
| Spring Cloud Gateway | 3.24k | 6.61ms |
| Zuul1 | 2.09k | 12.56ms |
| none | 11.77k | 2.09ms |
測試工具為wrk,測試時(shí)間30秒,線程數(shù)為10,連接數(shù)為200。
從官方的對比結(jié)果來看,Gateway的RPS是Zuul1的1.55倍,平均延遲是Zuul1的一半。
總結(jié)
Zuul1的開源時(shí)間很早,Netflix、Riot、攜程、拍拍貸等公司都已經(jīng)在生產(chǎn)環(huán)境中使用,自身經(jīng)受了實(shí)踐考驗(yàn),是生產(chǎn)級的API網(wǎng)關(guān)產(chǎn)品。
Gateway在2019年離開Spring Cloud孵化器,應(yīng)用于生產(chǎn)的案例少,穩(wěn)定性有待考證。
從性能方面比較,兩種產(chǎn)品在流量小的場景下性能表現(xiàn)差不多;并發(fā)高的場景下Gateway性能要好很多。從開發(fā)方面比較,Zuul1編程模型簡單,易于擴(kuò)展;Gateway編程模型稍難,代碼閱讀難度要比Zuul高不少,擴(kuò)展也稍復(fù)雜一些。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot項(xiàng)目啟動(dòng)時(shí)提示程序包不存在和找不到符號的處理方法
最近接手同事開發(fā)的一個(gè)Springboot工作項(xiàng)目,從svn上整體拉取下來后,構(gòu)建完成后,啟動(dòng)的時(shí)候遇到了程序包找不到的情況,所以本文記錄了SpringBoot項(xiàng)目啟動(dòng)時(shí)提示程序包不存在和找不到符號的處理方法,需要的朋友可以參考下2024-05-05
使用Java獲取html中Select,radio多選的值方法
以下是對使用Java獲取html中Select,radio多選值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-08-08
Spring Cloud 如何保證微服務(wù)內(nèi)安全
這篇文章主要介紹了Spring Cloud 如何保證微服務(wù)內(nèi)安全的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot+WebMagic+MyBaties實(shí)現(xiàn)爬蟲和數(shù)據(jù)入庫的示例
WebMagic是一個(gè)開源爬蟲框架,本項(xiàng)目通過在SpringBoot項(xiàng)目中使用WebMagic去抓取數(shù)據(jù),最后使用MyBatis將數(shù)據(jù)入庫。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
java把excel內(nèi)容上傳到mysql實(shí)例代碼
這篇文章主要介紹了java把excel內(nèi)容上傳到mysql實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化
大家好,本篇文章主要講的是關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
Java解析http協(xié)議字符串的方法實(shí)現(xiàn)
本文主要介紹了Java解析http協(xié)議字符串的方法實(shí)現(xiàn),我們探討了如何使用Java解析HTTP協(xié)議字符串,并將其封裝成了一個(gè)HttpRequest類,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
maven依賴包沖突SLF4J:?Class?path?contains?multiple?SLF4J?bi
這篇文章主要給大家介紹了關(guān)于maven依賴包沖突SLF4J:?Class?path?contains?multiple?SLF4J?bindings的處理方法,這個(gè)問題通常是因?yàn)轫?xiàng)目中存在多個(gè)SLF4J的實(shí)現(xiàn)綁定(bindings)導(dǎo)致的沖突,需要的朋友可以參考下2024-02-02

