Zuul1與Spring Cloud Gateway的區(qū)別及說(shuō)明
Zuul1簡(jiǎn)介
Zuul1是Netflix在2013年開(kāi)源的網(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的核心是一系列過(guò)濾器,過(guò)濾器簡(jiǎn)單易于擴(kuò)展,已經(jīng)有一些三方庫(kù)如spring-cloud-zuul-ratelimit等提供了過(guò)濾器支持。
Zuul1基于Servlet構(gòu)建,使用的是阻塞的IO,引入了線程池來(lái)處理請(qǐng)求。每個(gè)請(qǐng)求都需要獨(dú)立的線程來(lái)處理,從線程池中取出一個(gè)工作線程執(zhí)行,下游微服務(wù)返回響應(yīng)之前這個(gè)工作線程一直是阻塞的。
Spring Cloud Gateway簡(jiǎn)介
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)置了限流過(guò)濾器,實(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)品對(duì)比
下邊以表格形式對(duì)Zuul1和Gateway作簡(jiǎn)單對(duì)比:
對(duì)比項(xiàng) | Zuul1.x | Gateway |
---|---|---|
實(shí)現(xiàn) | 基于Servlet2.x構(gòu)建,使用阻塞的API | 基于Spring 5、Project Reactor、Spring Boot 2,使用非阻塞式的API |
長(zhǎng)連接 | 不支持 | 支持 |
不適用場(chǎng)景 | 后端服務(wù)響應(yīng)慢或者高并發(fā)場(chǎng)景下,因?yàn)榫€程數(shù)量是固定(有限)的,線程容易被耗盡,導(dǎo)致新請(qǐng)求被拒絕。 | 中小流量的項(xiàng)目,使用Zuul1.x更合適。 |
限流 | 無(wú) | 內(nèi)置限流過(guò)濾器 |
上手難度 | 同步編程,上手簡(jiǎn)單 | 門檻較高,上手難度中等 |
Spring Cloud集成 | 是 | 是 |
Sentinel集成 | 是 | 是 |
技術(shù)棧沉淀 | Zuul1開(kāi)源近七年,經(jīng)受考驗(yàn),穩(wěn)定成熟。 | 未見(jià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。
性能對(duì)比
低并發(fā)場(chǎng)景
不同的tps,同樣的請(qǐng)求時(shí)間(50s),對(duì)兩種網(wǎng)關(guān)產(chǎn)品進(jìn)行壓力測(cè)試,結(jié)果如下:
tps | 測(cè)試樣本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ā)較低的場(chǎng)景下,兩種網(wǎng)關(guān)的表現(xiàn)差不多
高并發(fā)場(chǎng)景
配置同樣的線程數(shù)(2000),同樣的請(qǐng)求時(shí)間(5分鐘),后端服務(wù)在不同的響應(yīng)時(shí)間(休眠時(shí)間),對(duì)兩種網(wǎng)關(guān)產(chǎn)品進(jìn)行壓力測(cè)試,結(jié)果如下:
休眠時(shí)間 | 測(cè)試樣本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)慢的場(chǎng)景下比Zuul1的表現(xiàn)要好。
官方性能對(duì)比
Spring Cloud Gateway的開(kāi)發(fā)者提供了benchmark項(xiàng)目用來(lái)對(duì)比Gateway和Zuul1的性能,官方提供的性能對(duì)比結(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 |
測(cè)試工具為wrk,測(cè)試時(shí)間30秒,線程數(shù)為10,連接數(shù)為200。
從官方的對(duì)比結(jié)果來(lái)看,Gateway的RPS是Zuul1的1.55倍,平均延遲是Zuul1的一半。
總結(jié)
Zuul1的開(kāi)源時(shí)間很早,Netflix、Riot、攜程、拍拍貸等公司都已經(jīng)在生產(chǎn)環(huán)境中使用,自身經(jīng)受了實(shí)踐考驗(yàn),是生產(chǎn)級(jí)的API網(wǎng)關(guān)產(chǎn)品。
Gateway在2019年離開(kāi)Spring Cloud孵化器,應(yīng)用于生產(chǎn)的案例少,穩(wěn)定性有待考證。
從性能方面比較,兩種產(chǎn)品在流量小的場(chǎng)景下性能表現(xiàn)差不多;并發(fā)高的場(chǎng)景下Gateway性能要好很多。從開(kāi)發(fā)方面比較,Zuul1編程模型簡(jiǎn)單,易于擴(kuò)展;Gateway編程模型稍難,代碼閱讀難度要比Zuul高不少,擴(kuò)展也稍復(fù)雜一些。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 解決SpringCloud gateway網(wǎng)關(guān)配置MVC攔截器報(bào)錯(cuò)問(wèn)題
- springCloud Gateway StripPrefix和PrefixPath過(guò)濾器的區(qū)別及說(shuō)明
- SpringCloud Gateway之StripPrefix的使用方式
- Spring?Cloud?Gateway實(shí)現(xiàn)分布式限流和熔斷降級(jí)的示例代碼
- SpringCloudGateway?自定義局部過(guò)濾器場(chǎng)景分析
- 解決spring cloud gateway調(diào)用其他模塊出現(xiàn)的問(wèn)題
相關(guān)文章
SpringBoot項(xiàng)目啟動(dòng)時(shí)提示程序包不存在和找不到符號(hào)的處理方法
最近接手同事開(kāi)發(fā)的一個(gè)Springboot工作項(xiàng)目,從svn上整體拉取下來(lái)后,構(gòu)建完成后,啟動(dòng)的時(shí)候遇到了程序包找不到的情況,所以本文記錄了SpringBoot項(xiàng)目啟動(dòng)時(shí)提示程序包不存在和找不到符號(hào)的處理方法,需要的朋友可以參考下2024-05-05使用Java獲取html中Select,radio多選的值方法
以下是對(duì)使用Java獲取html中Select,radio多選值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08Spring Cloud 如何保證微服務(wù)內(nèi)安全
這篇文章主要介紹了Spring Cloud 如何保證微服務(wù)內(nèi)安全的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot+WebMagic+MyBaties實(shí)現(xiàn)爬蟲(chóng)和數(shù)據(jù)入庫(kù)的示例
WebMagic是一個(gè)開(kāi)源爬蟲(chóng)框架,本項(xiàng)目通過(guò)在SpringBoot項(xiàng)目中使用WebMagic去抓取數(shù)據(jù),最后使用MyBatis將數(shù)據(jù)入庫(kù)。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10java把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é)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01Java解析http協(xié)議字符串的方法實(shí)現(xiàn)
本文主要介紹了Java解析http協(xié)議字符串的方法實(shí)現(xiàn),我們探討了如何使用Java解析HTTP協(xié)議字符串,并將其封裝成了一個(gè)HttpRequest類,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09maven依賴包沖突SLF4J:?Class?path?contains?multiple?SLF4J?bi
這篇文章主要給大家介紹了關(guān)于maven依賴包沖突SLF4J:?Class?path?contains?multiple?SLF4J?bindings的處理方法,這個(gè)問(wèn)題通常是因?yàn)轫?xiàng)目中存在多個(gè)SLF4J的實(shí)現(xiàn)綁定(bindings)導(dǎo)致的沖突,需要的朋友可以參考下2024-02-02