分(fēn)享到:

深圳網站(zhàn)建設|Java與RESTful框架的性能比較分(fēn)析

日(rì)期:2017-05-08 19:59:00     閱讀(dú):411     文章(zhāng)來(lái)源:源美網絡     标簽:深圳網站(zhàn)建設,深圳網站(zhàn)制作(zuò)

在微服務流行的今天,我們會從(cóng)縱向和橫向分(fēn)解代碼的邏輯,将一些獨立的無狀态的代碼單元實現爲微服務,可(kě)以将它們發布到一些分(fēn)布式計(jì)算單元或者Docker中,并在性能需要的時候及時地創建更多的服務單元。

微服務是一個概念,并沒有規定服務的格式,但(dàn)是很多廠(chǎng)商和框架都(dōu)不約而同的采用RESTful的架構,盡管也有一些其它的性能很好的RPC框架。

如(rú)何在Java生(shēng)态圈選擇一個輕量級的RESTful框架?可(kě)以參考一些其他(tā)人(rén)的經驗, 比如(rú)我翻譯的: 最好的8個 Java RESTful 框架。

就(jiù)我個人(rén)而言,我選擇框架的理(lǐ)由很簡單:


簡單,輕量級

性能好

穩定,可(kě)靠

易于開發和維護

我會首選遵循Java規範(JSR339)的框架,輕量級,便于發布到Docker容器中。 所以我不會選擇Spring boot, Spring MVC, CXF等比較重的框架,也不會選擇純netty這樣的太過底層,還(hái)得(de)實現路(lù)由等基本功能框架。

因爲追求輕量級,便于發布到docker容器中,我也不會考察JBOSS, Tomcat這樣的JEE容器, 而是選用jetty, undertow這樣的嵌入式容器。


所以,這裡(lǐ)我挑選了幾個候選者:


Jersey + Grizzly

Jersey + Jetty

Dropwizard

RESTEasy + Netty

RESTEasy + Undertow

[Updated on 2015/11/18]

我增加了更多的 RESTful 框架,有些不是Jax-RS的實現,但(dàn)是也有很活躍的社區。


Jersey + Jetty4

Spring Boot

純Netty

Vert.x

你(nǐ)會發現一些有趣的測試結果。

Jersey 是Jax-RS的官方參考實現,可(kě)以很好的和其它JEE容器集成。RESTEasy是JBoss出品的框架,也很容易的和其它容器集成。Dropwizard實際上集成了Jersey, Jetty以及其它的第三方庫比如(rú)它的Metrics,提供了一站(zhàn)式的開發,略微有些厚重。


測試相(xiàng)關的代碼已經放(fàng)在了GITHUB上: 代碼


編譯代碼


測試代碼是一個多模塊的Maven項目, 你(nǐ)直接運行maven clean package就(jiù)可(kě)以生(shēng)成各個jar,而且這些jar包含了所依賴的類,執行起來(lái)相(xiàng)當簡單。

你(nǐ)也可(kě)以在每個模塊下運行mvn exec:java啓動服務,然後在浏覽器中訪問(wèn) http://localhost:8080/rest/hello (對于Jersey + Jetty,地址是http://localhost:8080/hello)


測試環境


服務器

AWS C3.2xlarge


8 cores (E5-2666 v3 @ 2.90GHz)

memory: 16G (服務隻分(fēn)配了4G内存)

Java

1.8.0_51


測試工(gōng)具

wrk

測試命令如(rú): wrk -t16 -c1000 -d30s http://127.0.0.1:8080/rest/hello.

針對每個case, 我使用16個線程,以及100/200/500/1000并發進行測試。


服務啓動命令

 

java -Xmx4g -Xms4g -jar jersey-grizzly2-1.0-SNAPSHOT.jar

java -Xmx4g -Xms4g -jar jersey-jetty-1.0-SNAPSHOT.jar

java -Xmx4g -Xms4g -jar dropwizard-1.0-SNAPSHOT.jar hello.yml 

java -Xmx4g -Xms4g -jar resteasy-netty-1.0-SNAPSHOT.jar 

java -Xmx4g -Xms4g -jar resteasy-undertow-1.0-SNAPSHOT.jar

java -Xmx4g -Xms4g -jar springboot-1.0-SNAPSHOT.jar

java -Xmx4g -Xms4g -jar resteasy-netty4-1.0-SNAPSHOT.jar 

java -Xmx4g -Xms4g -jar nativenetty-1.0-SNAPSHOT.jar

java -Xmx4g -Xms4g -jar vertx-verticles-1.0-SNAPSHOT.jar -instances 20

測試結果


測試結果數據可(kě)以查看(kàn)這裡(lǐ): 測試數據,

延遲基本在幾毫秒到10幾毫秒之間。


圖形化測試結果(y軸爲Requests/sec, x軸爲并發量):


結論


從(cóng)結果看(kàn),


RESTEasy的性能要好于 Jersey,無論哪種嵌入式JEE容器。

Jersey+Grizzly2和Jersey+Jetty, dropwizard性能差别不大(dà)

dropwizard底層實際是Jersey+Jetty,性能結果也和Jersey+Jetty一樣

RESTEasy+netty (netty3)的結果并沒有優于RESTEasy+undertow.這出乎我的意料,可(kě)能CPU和Memory占用上會好一些

RESTEasy+netty4的性能遠(yuǎn)遠(yuǎn)低于RESTEasy+netty3,這出乎我的意料。或許因爲Netty線程池的改變。

純netty的性能遠(yuǎn)遠(yuǎn)高于其它框架,一方面是由于沒有http router的邏輯,另一方面也顯示了Netty框架的優秀。如(rú)果不是實現很複雜的路(lù)由和很多的Service,不妨使用純Netty實現高性能。

Spring Boot太厚重了,使用Spring MVC的語法,性能隻有Jersey的一半。

Vert.x底層使用Netty,可(kě)以使用Java 8 Lambda語法,也提供了其它語言的支持,但(dàn)是性能看(kàn)起來(lái)不是太好,而且随着并發量增大(dà)吞吐率也随之下降。先前的vert.x測試有問(wèn)題,隻用到了單核,謝謝@Stream網友的提醒,我在代碼中增加了vertx-verticles模塊,支持多核(java -jar vertx-verticles-1.0-SNAPSHOT.jar -instances 20)。 Vert.x性能也不錯。@heng

當然測試也有一點遺憾,就(jiù)是沒有記錄測試時的CPU占用率和Memory占用率,以我個人(rén)的經驗,這方面Netty會占一些優勢。



文章(zhāng)引用:

本站(zhàn)文章(zhāng)爲深圳網站(zhàn)建設·源美網絡原創策劃,如(rú)有版權糾紛或者違規問(wèn)題,請(qǐng)聯系我們删除,謝謝!

上一篇: 解析原創内容有時不被百度收錄的原因

下一篇: 手機(jī)網站(zhàn)制作(zuò)要注意的事(shì)項

返回列表
最新案例
OUR ADVANTAGE WORKS

售後保障

承諾任何問(wèn)題1小時内解決

數據備份

更安全、更高效、更穩定

價格公道精準

項目經理(lǐ)精準報價不弄虛作(zuò)假

合作(zuò)無風(fēng)險

重合同講信譽,無效全額退款