前言
Spring Cloud從一開始最受大家質(zhì)疑的就是網(wǎng)關(guān)性能,那是由于Spring Cloud最初選擇了使用Netflix幾年前開源的Zuul作為基礎(chǔ),而高性能版的Zuul 2在經(jīng)過了多次跳票之后,對(duì)于Spring這樣的整合專家可能也不愿意再繼續(xù)等待,Spring Cloud Gateway應(yīng)運(yùn)而生,那么這個(gè)由Spring社區(qū)自己開發(fā)推出的網(wǎng)關(guān)又如何呢?最近一篇《實(shí)測(cè) | 轉(zhuǎn)型微服務(wù),這4大工具誰是API網(wǎng)關(guān)性能最優(yōu)?》的翻譯中對(duì)比了NGINX、ZUUL、Spring Cloud Gateway、Linkerd,得出的結(jié)論讓不少讀者感到詫異,Spring Cloud Gateway是否真的有這么差?不妨通過下文來進(jìn)一步了解(以下內(nèi)容轉(zhuǎn)載自來《Spring Cloud與Docker微服務(wù)實(shí)戰(zhàn)》作者周立的博文,原文地址:http://www.itmuch.com/spring-cloud-sum/performance-zuul-and-gateway-linkerd/)。
動(dòng)機(jī)
已經(jīng)不止一次看到“Spring Cloud Gateway性能比Zuul更差”的言論了,不少人人云亦云,來問我,既然如此,那Spring官方還開發(fā)Spring Cloud Gateway干嘛?難道僅僅是為了支持Zuul 1.x不支持的長(zhǎng)連接、Web Socket嗎?
故而寫篇博客,糾正一下大家的錯(cuò)誤觀點(diǎn)。
開端
網(wǎng)上搜索了一下,說Spring Cloud Gateway性能比Zuul差的言論來自:http://www.servicemesh.cn/?/article/45
作者使用ab進(jìn)行benchmark,操作非常標(biāo)準(zhǔn)。從結(jié)果來看,確實(shí)Spring Cloud Gateway比Zuul差了一大截。
但,讓我們打開官方的Issue:Throughput problems when compared with Netflix Zuul and Nginx?,里面官方人員回答道:
reactor-netty has issues with http 1.0 and hence ab.?reactor/reactor-netty#21
不妨跟蹤到reactor/reactor-netty#21?,看看說了啥:
As discussed recently about the issue raised on?https://jira.spring.io/browse/SPR-14964, a very simpleab-n1-c1http://localhost:8082/items/10on Spring + Reactor Netty based server block forever likely because Reactor Netty does not support HTTP 1.0.
里面說了,Reactor Netty不支持HTTP 1.0,而Spring Cloud Gateway依賴了reactor-netty。
也就是說——由于reactor-netty的bug,使用ab壓測(cè)結(jié)果并不準(zhǔn)確!
正確姿勢(shì)
官方建議使用wrk進(jìn)行benchmark測(cè)試。不僅如此,官方人員還十(喪)分(心)貼(?。┬模瘢┑貏?chuàng)建了一個(gè)benchmark的項(xiàng)目:spring-cloud-gateway-bench,其中對(duì)比了:
Spring Cloud Gateway
Zuul
Linkerd
三者的性能。
思路非常簡(jiǎn)單:static?項(xiàng)目是一個(gè)使用Go語言編寫的簡(jiǎn)單服務(wù)器;然后分別使用Gateway/Zuul/Linkerd來代理該服務(wù)的端點(diǎn),并對(duì)比。
最終結(jié)果:
組件RPS(request per second)
Spring Cloud GatewayRequests/sec: 32213.38
ZuulRequests/sec: 20800.13
LinkerdRequests/sec: 28050.76
從結(jié)果可知,Spring Cloud Gateway的RPS是Zuul1的1.6倍!比Linkerd性能還好!
展望
本文的Zuul,指的是Zuul 1.x,是一個(gè)基于阻塞io的API Gateway。
Spring Cloud Gateway是一個(gè)很有前途的項(xiàng)目,上手簡(jiǎn)單,功能也比較強(qiáng)大。
Linkerd也是一個(gè)非常有前途的項(xiàng)目,是基于Scala實(shí)現(xiàn)的、目前市面上僅有的生產(chǎn)級(jí)別的Service Mesh(其他諸如Istio、Conduit暫時(shí)還不能用于生產(chǎn))。
Zuul已經(jīng)發(fā)布了Zuul 2.x,基于Netty,也是非阻塞的,支持長(zhǎng)連接,但Spring Cloud暫時(shí)還沒有整合計(jì)劃。
在這里順便給大家推薦一個(gè)架構(gòu)交流群:617434785,里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化這些成為架構(gòu)師必備的知識(shí)體系。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源。相信對(duì)于已經(jīng)工作和遇到技術(shù)瓶頸的碼友,在這個(gè)群里會(huì)有你需要的內(nèi)容。