Netflix Zuul與Nginx的性能對比

這是一篇翻譯洽胶,關(guān)于大家經(jīng)常質(zhì)疑的一個問題:API網(wǎng)關(guān)Zuul的性能。
原文:NETFLIX ZUUL VS NGINX PERFORMANCE
作者:STANISLAV MIKLIK

如今你可以聽到很多關(guān)于“微服務”的信息裆馒。Spring Boot是一個用來構(gòu)建單個微服務應用的理想選擇姊氓,但是你還需要以某種方式將它們互相聯(lián)系起來。這就是Spring Cloud試圖解決的問題喷好,尤其是Spring Cloud Netflix翔横。它提供了各種組件,比如:Eureka服務發(fā)現(xiàn)與Ribbon客戶端負載均衡的結(jié)合梗搅,為內(nèi)部“微服務”提供通信支持禾唁。但是,如果你想要與外界通信時(你提供外部API无切,或只是從你的頁面使用AJAX)荡短,將各種服務隱藏在一個代理之后是一個明智的選擇。

常規(guī)的選擇我們會使用Nginx作為代理哆键。但是Netflix帶來了它自己的解決方案——智能路由Zuul掘托。它帶有許多有趣的功能,它可以用于身份驗證籍嘹、服務遷移闪盔、分級卸載以及各種動態(tài)路由選項。同時辱士,它是使用Java編寫的锭沟。如果Netflix使用它,那么它與本地反向代理相比是否足夠快呢识补?或者當我們對靈活性(或其他功能)要求更高時族淮,它是否適合與Nginx聯(lián)合使用。

免責聲明:不要認為這是一個嚴肅的基準。我只是想感受Nginx和Zuul的差異祝辣,因為我在互聯(lián)網(wǎng)上并沒有找到任何基準(也可能是我沒有搜索足夠長的時間)贴妻。它不遵循任何推薦的基準測試方法(預熱時間、測試次數(shù)……)蝙斜,我只是使用3個在不同可用區(qū)域的EC2實例(這不是最佳的)名惩。

測試

那我做了什么呢?測試是比較兩種解決方案的原始性能孕荠,沒有任何其他特殊的功能娩鹉。我只是同時發(fā)起單個HTTP請求來獲取一個HTML頁面(大小約為26KB)。我使用ApacheBench來發(fā)起200個并發(fā)線程的測試(我也嘗試了httpperf稚伍,但是它需要更高的CPU要求弯予,所以還是選擇了要求更低的ab)。

直接連接

首先个曙,我感興趣的是不通過任何反向代理直接訪問HTTP服務器的性能锈嫩。Ab在一臺機器上運行,直接訪問目標服務器垦搬。

$ ab -n 10000 -c 200 http://target/sample.html

....

Document Path: /sample.html
Document Length: 26650 bytes

Total transferred: 268940000 bytes
HTML transferred: 266500000 bytes
Requests per second: 2928.45 [#/sec] (mean)
Time per request: 68.295 [ms] (mean)
Time per request: 0.341 [ms] (mean, across all concurrent requests)
Transfer rate: 76911.96 [Kbytes/sec] received

Connection Times (ms)
 min mean[+/-sd] median max
Connect: 4 33 6.0 32 66
Processing: 20 35 7.5 35 392
Waiting: 20 35 6.4 34 266
Total: 24 68 7.8 66 423

Percentage of the requests served within a certain time (ms)
 50% 66
 66% 67
 75% 69
 80% 70
 90% 74
 95% 81
 98% 91
 99% 92
 100% 423 (longest request)

很好呼寸,幾次測試都顯示了類似的值:2928、2725猴贰、2834对雪、2648 req/s。有一些偏差米绕,但這些數(shù)字現(xiàn)在還不重要瑟捣。

通過Nginx

現(xiàn)在我可以使用Nginx的代理服務。只需要將Nginx配置更新為代理到目標服務器义郑,比如:

server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   # Make site accessible from http://localhost/
   server_name localhost;

   # allow file upload
   client_max_body_size 10M;

   location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host $host;
      proxy_pass http://target:80;
   }
}

像之前一樣運行類型的測試:

$ ab -n 50000 -c 200 http://proxy/sample.html
...
Server Software: nginx/1.4.6
Server Hostname: proxy
Server Port: 80

Document Path: /sample.html
Document Length: 26650 bytes

Concurrency Level: 200
Time taken for tests: 52.366 seconds
Complete requests: 50000
Failed requests: 0
Total transferred: 1344700000 bytes
HTML transferred: 1332500000 bytes
Requests per second: 954.81 [#/sec] (mean)
Time per request: 209.465 [ms] (mean)
Time per request: 1.047 [ms] (mean, across all concurrent requests)
Transfer rate: 25076.93 [Kbytes/sec] received

Connection Times (ms)
 min mean[+/-sd] median max
Connect: 3 50 11.7 48 114
Processing: 37 159 11.9 160 208
Waiting: 36 159 11.9 160 207
Total: 40 209 10.4 209 256

Percentage of the requests served within a certain time (ms)
 50% 209
 66% 212
 75% 214
 80% 216
 90% 220
 95% 224
 98% 232
 99% 238
 100% 256 (longest request)

測試結(jié)果為954蝶柿、954丈钙、941 req/s非驮。性能與延遲(如預期)變差了。

通過Zuul

現(xiàn)在我們在同一臺機器上安裝Zuul雏赦。它的應用本身很簡單:

@SpringBootApplication
@Controller
@EnableZuulProxy
public class DemoApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder(DemoApplication.class)
            .web(true).run(args);
    }
}

我們還需要在 application.yml中定義固定的路由規(guī)則:

zuul:
  routes:
    sodik:
      path: /sodik/**
      url: http://target

現(xiàn)在我們試試運行測試:

$ ab -n 50000 -c 200 http://proxy:8080/sodik/sample.html

Server Software: Apache-Coyote/1.1
Server Hostname: proxy
Server Port: 8080

Document Path: /sodik/sample.html
Document Length: 26650 bytes

Concurrency Level: 200
Time taken for tests: 136.164 seconds
Complete requests: 50000
Failed requests: 2
(Connect: 0, Receive: 0, Length: 2, Exceptions: 0)
Non-2xx responses: 2
Total transferred: 1343497042 bytes
HTML transferred: 1332447082 bytes
Requests per second: 367.20 [#/sec] (mean)
Time per request: 544.657 [ms] (mean)
Time per request: 2.723 [ms] (mean, across all concurrent requests)
Transfer rate: 9635.48 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 2 12 92.3 2 1010
Processing: 15 532 321.6 461 10250
Waiting: 10 505 297.2 441 9851
Total: 17 544 333.1 467 10270

Percentage of the requests served within a certain time (ms)
50% 467
66% 553
75% 626
80% 684
90% 896
95% 1163
98% 1531
99% 1864
100% 10270 (longest request)

結(jié)果比我(樂觀的)猜測更差劫笙。此外,我們還能看到兩次請求失斝歉凇(我們可以在Zuul的日志中看到有兩個相應的異常填大,這些異常引發(fā)了HTTP連接池超時)。顯然默認情況下超時時間為10秒俏橘。

我們再進一步測試允华,得到了更多的結(jié)果:

Document Path: /sodik/sample.html
Document Length: 26650 bytes

Concurrency Level: 200
Time taken for tests: 50.080 seconds
Complete requests: 50000
Failed requests: 0
Total transferred: 1343550000 bytes
HTML transferred: 1332500000 bytes
Requests per second: 998.39 [#/sec] (mean)
Time per request: 200.322 [ms] (mean)
Time per request: 1.002 [ms] (mean, across all concurrent requests)
Transfer rate: 26199.09 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 2 16 7.9 16 126
Processing: 15 184 108.1 203 1943
Waiting: 13 183 105.9 202 1934
Total: 18 200 107.8 218 1983

Percentage of the requests served within a certain time (ms)
50% 218
66% 228
75% 235
80% 239
90% 254
95% 287
98% 405
99% 450
100% 1983 (longest request)

哇,不錯的改善。我認為Java JIT編譯對于性能有一定的幫助靴寂,但是要驗證這是否只是一個巧合磷蜀,再嘗試一次:1010 req / sec。最終結(jié)果對我來說是一個驚喜百炬。

結(jié)論

Zuul的原始性能非常接近于Nginx褐隆。事實上,在啟動預測之后剖踊,我的測試結(jié)果甚至略好一些(重申免責聲明-這并非一個嚴肅的基準性能測試)庶弃。Nginx顯示出更多的可預測性能(變化較小)德澈,可悲的是在Zuul預熱期間歇攻,我們經(jīng)歷了一些小故障(150000個請求中的2個,但是您的微服務應該是容錯機制的圃验,對吧掉伏?)。

所以澳窑,如果您考慮使用一些Zuul的額外功能斧散,或者希望通過它與其他Netflix服務集成(比如Eureka)獲得更多的服務能力,Zuul看起來非常有希望作為簡單反向代理的替代產(chǎn)品摊聋。也許這也是Netflix使用的原因鸡捐,所以您也可以嘗試一下。

轉(zhuǎn)載請注明出處麻裁,原文首發(fā)于:http://blog.didispace.com/zuul-vs-nginx-performance/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箍镜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子煎源,更是在濱河造成了極大的恐慌色迂,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件手销,死亡現(xiàn)場離奇詭異歇僧,居然都是意外死亡,警方通過查閱死者的電腦和手機锋拖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門诈悍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兽埃,你說我怎么就攤上這事侥钳。” “怎么了柄错?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵舷夺,是天一觀的道長苦酱。 經(jīng)常有香客問我,道長给猾,這世上最難降的妖魔是什么躏啰? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮耙册,結(jié)果婚禮上给僵,老公的妹妹穿的比我還像新娘。我一直安慰自己详拙,他們只是感情好帝际,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饶辙,像睡著了一般蹲诀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弃揽,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天脯爪,我揣著相機與錄音,去河邊找鬼矿微。 笑死痕慢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的涌矢。 我是一名探鬼主播掖举,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼娜庇!你這毒婦竟也來了塔次?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤名秀,失蹤者是張志新(化名)和其女友劉穎励负,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匕得,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡继榆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耗跛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裕照。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡攒发,死狀恐怖调塌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惠猿,我是刑警寧澤羔砾,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響姜凄,放射性物質(zhì)發(fā)生泄漏政溃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一态秧、第九天 我趴在偏房一處隱蔽的房頂上張望董虱。 院中可真熱鬧,春花似錦申鱼、人聲如沸愤诱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淫半。三九已至,卻和暖如春匣砖,著一層夾襖步出監(jiān)牢的瞬間科吭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工猴鲫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留对人,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓拂共,卻偏偏與公主長得像规伐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匣缘,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容