日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为什么选择Netty作为基础通信组件?

發(fā)布時(shí)間:2025/3/21 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么选择Netty作为基础通信组件? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以下內(nèi)容根據(jù)網(wǎng)上資料和自己整理總結(jié)而成

一、什么是Netty?

Netty是一個(gè)高性能 事件驅(qū)動、異步非堵塞的IO(NIO)Java開源框架,Jboss提供,用于建立TCP等底層的連接,基于Netty可以建立高性能的Http服務(wù)器,快速開發(fā)高性能、高可靠性的網(wǎng)絡(luò)服務(wù)器和客戶端程序。支持HTTP、 WebSocket 、Protobuf、 Binary TCP |和UDP,Netty已經(jīng)被很多高性能項(xiàng)目作為其Socket底層基礎(chǔ),如HornetQ Infinispan Vert.x Play Framework Finangle和 Cassandra。其競爭對手是:Apache MINA和 Grizzly。

也就是說,Netty 是一個(gè)基于NIO的客戶,服務(wù)器端編程框架,使用Netty 可以確保你快速和簡單的開發(fā)出一個(gè)網(wǎng)絡(luò)應(yīng)用,例如實(shí)現(xiàn)了某種協(xié)議的客戶,服務(wù)端應(yīng)用。Netty相當(dāng)簡化和流線化了網(wǎng)絡(luò)應(yīng)用的編程開發(fā)過程,例如,TCP和UDP的socket服務(wù)開發(fā)。

“快速”和“簡單”并不意味著會讓你的最終應(yīng)用產(chǎn)生維護(hù)性或性能上的問題。Netty 是一個(gè)吸收了多種協(xié)議的實(shí)現(xiàn)經(jīng)驗(yàn),這些協(xié)議包括FTP,SMTP,HTTP,各種二進(jìn)制,文本協(xié)議,并經(jīng)過相當(dāng)精心設(shè)計(jì)的項(xiàng)目,最終,Netty 成功的找到了一種方式,在保證易于開發(fā)的同時(shí)還保證了其應(yīng)用的性能,穩(wěn)定性和伸縮性。

?

二、不選擇Java原生NIO編程的原因

? ? 首先開發(fā)出高質(zhì)量的NIO程序并不是一件簡單的事情,除去NIO固有的復(fù)雜性和BUG不談,作為一個(gè)NIO服務(wù)端,還需要能夠處理網(wǎng)絡(luò)的閃斷、客戶端的重復(fù)接入、客戶端的安全認(rèn)證、消息的編解碼、半包讀寫等情況,如果你沒有足夠的NIO編程經(jīng)驗(yàn)積累,一個(gè)NIO框架的穩(wěn)定往往需要半年甚至更長的時(shí)間。更為糟糕的是,一旦在生產(chǎn)環(huán)境中發(fā)生問題,往往會導(dǎo)致跨節(jié)點(diǎn)的服務(wù)調(diào)用中斷,嚴(yán)重的可能會導(dǎo)致整個(gè)集群環(huán)境都不可用,需要重啟服務(wù)器,這種非正常停機(jī)會帶來巨大的損失。

從可維護(hù)性角度看,由于NIO采用了異步非阻塞編程模型,而且是一個(gè)I/O線程處理多條鏈路,它的調(diào)試和跟蹤非常麻煩,特別是生產(chǎn)環(huán)境中的問題,我們無法進(jìn)行有效的調(diào)試和跟蹤,往往只能靠一些日志來輔助分析,定位難度很大。

?

現(xiàn)在我們總結(jié)一下為什么不建議開發(fā)者直接使用JDK的NIO類庫進(jìn)行開發(fā),具體原因如下。

1)跨平臺與兼容性:NIO算是底層的APIs需依賴系統(tǒng)的IO APIs。但Java NIO發(fā)現(xiàn)在不同系統(tǒng)平臺會出現(xiàn)問題。大量測試也耗不少時(shí)間;NIO2只支持JDK1.7+,而且沒提供DatagramSocket,故NIO2不支持UDP協(xié)議。而Netty提供統(tǒng)一接口,同一語句無論在JDK6.X 還是JDK7.X 都可運(yùn)行,無需關(guān)心底層架構(gòu)功能!

2)JAVA NIO的ByteBuffer構(gòu)造函數(shù)私有,無法擴(kuò)展。Netty提供了自己的ByteBuffer實(shí)現(xiàn),通過簡單APIs對其進(jìn)行構(gòu)造、使用和操作,一此解決NIO的一些限制。

3)NIO對緩沖區(qū)的聚合與分散操作可能會導(dǎo)致內(nèi)存泄漏。直到JDK1.7才解決此問題。

4)NIO的類庫和API繁雜,使用麻煩,你需要熟練掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。

5)使用JAVA NIO需要具備其他的額外技能做鋪墊,例如熟悉Java多線程編程。這是因?yàn)镹IO編程涉及到Reactor模式,你必須對多線程和網(wǎng)路編程非常熟悉,才能編寫出高質(zhì)量的NIO程序。

6)可靠性能力補(bǔ)齊,工作量和難度都非常大。例如客戶端面臨斷連重連、網(wǎng)絡(luò)閃斷、半包讀寫、失敗緩存、網(wǎng)絡(luò)擁塞和異常碼流的處理等問題。

7)JDK NIO的BUG,例如臭名昭著的epoll bug,它會導(dǎo)致Selector空輪詢,最終導(dǎo)致CPU 100%。官方聲稱在JDK 1.6版本的update18修復(fù)了該問題,但是直到JDK 1.7版本該問題仍舊存在,只不過該BUG發(fā)生概率降低了一些而已,它并沒有得到根本性解決。該BUG以及與該BUG相關(guān)的問題單可以參見以下鏈接內(nèi)容。

◎????http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6403933

◎????http://bugs.java.com/bugdatabase/view_bug.do?bug_id=2147719

異常堆棧如下。

java.lang.Thread.State: RUNNABLEat sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210)at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)- locked <0x0000000750928190> (a sun.nio.ch.Util$2)- locked <0x00000007509281a8> (a java.util.Collections$ UnmodifiableSet)- locked <0x0000000750946098> (a sun.nio.ch.EPollSelectorImpl)at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)at net.spy.memcached.MemcachedConnection.handleIO(Memcached Connection.java:217)at net.spy.memcached.MemcachedConnection.run(MemcachedConnection. java:836)

由于上述原因,在大多數(shù)場景下,不建議大家直接使用JDK的NIO類庫,除非你精通NIO編程或者有特殊的需求。在絕大多數(shù)的業(yè)務(wù)場景中,我們可以使用NIO框架Netty來進(jìn)行NIO編程,它既可以作為客戶端也可以作為服務(wù)端,同時(shí)支持UDP和異步文件傳輸,功能非常強(qiáng)大。

?

三、選擇Netty作為基礎(chǔ)通信框架的原因

Netty是業(yè)界最流行的NIO框架之一,它的健壯性、功能、性能、可定制性和可擴(kuò)展性在同類框架中都是首屈一指的,它已經(jīng)得到成百上千的商用項(xiàng)目驗(yàn)證,例如Hadoop的RPC框架Avro就使用了Netty作為底層通信框架,其他還有業(yè)界主流的RPC框架,也使用Netty來構(gòu)建高性能的異步通信能力。

通過對Netty的分析,我們將它的優(yōu)點(diǎn)總結(jié)如下。

◎????API使用簡單,開發(fā)門檻低;

◎????功能強(qiáng)大,預(yù)置了多種編解碼功能,支持多種主流協(xié)議;

◎????定制能力強(qiáng),可以通過ChannelHandler對通信框架進(jìn)行靈活地?cái)U(kuò)展;

◎????性能高,通過與其他業(yè)界主流的NIO框架對比,Netty的綜合性能最優(yōu);

◎????成熟、穩(wěn)定,Netty修復(fù)了已經(jīng)發(fā)現(xiàn)的所有JDK NIO BUG,業(yè)務(wù)開發(fā)人員不需要再為NIO的BUG而煩惱;

◎????社區(qū)活躍,版本迭代周期短,發(fā)現(xiàn)的BUG可以被及時(shí)修復(fù),同時(shí),更多的新功能會加入;

◎????經(jīng)歷了大規(guī)模的商業(yè)應(yīng)用考驗(yàn),質(zhì)量得到驗(yàn)證。Netty在互聯(lián)網(wǎng)、大數(shù)據(jù)、網(wǎng)絡(luò)游戲、企業(yè)應(yīng)用、電信軟件等眾多行業(yè)已經(jīng)得到了成功商用,證明它已經(jīng)完全能夠滿足不同行業(yè)的商業(yè)應(yīng)用了。

正是因?yàn)檫@些優(yōu)點(diǎn),Netty逐漸成為了Java NIO編程的首選框架。

感謝作者最原始出處鏈接:http://blog.csdn.net/broadview2006/article/details/46041995

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的为什么选择Netty作为基础通信组件?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。