為什么要用Netty開發(fā)

為什么要用Netty開發(fā)

Netty是由JBOSS提供的基于Java NIO的開源框架,Netty提供異步非阻塞、事件驅(qū)動、高性能、高可靠、高可定制性的**應(yīng)用程序和工具,可用于開發(fā)服務(wù)端和客戶端。
JAVA原先是采用的是傳統(tǒng)的BIO,為什么后來又研發(fā)出了NIO呢?
首先看看傳統(tǒng)的基于同步阻塞IO(BIO)的線程模型圖

BIO主要存在以下缺點(diǎn):
1.從線程模型圖中可以看到,一連接一線程,由于線程數(shù)是有限的,所以這樣的模型是非常消耗資源的,
最終也導(dǎo)致它不能承受高并發(fā)連接的需求
2.性能低,因?yàn)轭l繁的進(jìn)行上下文切換,導(dǎo)致CUP利用率低
3.可靠性差,由于所有的IO操作都是同步的,即使是業(yè)務(wù)線程也如此,所以業(yè)務(wù)線程的IO操作也有可能被阻塞,
這將導(dǎo)致系統(tǒng)過分依賴**的實(shí)時(shí)情況和外部組件的處理能力,可靠性大大降低
上面的原因就是導(dǎo)致早期的高性能服務(wù)器為什么不選用JAVA開發(fā),而是選用C/C++的重要原因。

為了解決上面的問題,NIO橫空出世,下面是NIO的線程模型圖

1.NIO采用了Reactor線程模型,一個(gè)Reactor聚合了一個(gè)多路復(fù)用器Selector,它可以同時(shí)注冊、監(jiān)聽和輪詢
成百上千個(gè)Channel,這樣一個(gè)IO線程可以同時(shí)處理很多個(gè)客戶端連接,線程模型優(yōu)化為1:N(N<**句柄、數(shù)),
或M:N(M通常為CUP核數(shù)+1)
2.避免了IO線程頻繁的上下文切換,提升了CUP的效率
3.所有的IO操作都是異步的,所以業(yè)務(wù)線程的IO操作就不用擔(dān)心阻塞,系統(tǒng)降低了對**的實(shí)時(shí)情況和外部組件
的處理能力的依賴
為什么不直接用JDK原生的NIO而選用Netty框架?
先看看JDK的NIO中服務(wù)端和客戶端的時(shí)序圖
服務(wù)端:

客戶端:

從圖中我們可以看到,使用JDK原生NIO的不足之處
1.NIO的類庫和API相當(dāng)復(fù)雜,使用它來開發(fā),需要非常熟練地掌握Selector、ByteBuffer、ServerSocketChannel、SocketChannel等
2.需要很多額外的編程技能來輔助使用NIO,例如,因?yàn)镹IO涉及了Reactor線程模型,所以必須必須對多線程和**編程非常熟悉才能寫出高質(zhì)量的NIO程序
3.想要有高可靠性,工作量和難度都非常的大,因?yàn)榉?wù)端需要面臨客戶端頻繁的接入和斷開、**閃斷、半包讀寫、失敗緩存、**阻塞的問題,這些將嚴(yán)重影響我們的可靠性,而使用原生NIO解決它們的難度相當(dāng)大。

4.JDK NIO中**的BUG–epoll空輪詢,當(dāng)select返回0時(shí),會導(dǎo)致Selector空輪詢而導(dǎo)致CUP****,百科**表示JDK1.6之后修復(fù)了這個(gè)問題,其實(shí)只是發(fā)生的概率降低了,沒有根本上解決。
那么為什么要用Netty呢?
1.API使用簡單,更容易上手,開發(fā)門檻低
2.功能強(qiáng)大,預(yù)置了多種編解碼功能,支持多種主流協(xié)議
3.定制能力高,可以通過ChannelHandler對通信框架進(jìn)行靈活地拓展
4.高性能,與目前多種NIO主流框架相比,Netty綜合性能**
5.高穩(wěn)定性,解決了JDK NIO的BUG
6.經(jīng)歷了大規(guī)模的商業(yè)應(yīng)用考驗(yàn),質(zhì)量和可靠性都有很好的驗(yàn)證。

netty超時(shí)原因

1、檢查**的網(wǎng)速是否正常,局域網(wǎng)里是否有人看電影或者下載軟件等拖慢了網(wǎng)速。2、連接蘋果跟iTunes時(shí),檢查iT的設(shè)置情況,打開iTunes — 編輯 — 偏好設(shè)置 — 家長控制 — iTunes Store這一項(xiàng)勾選(把 允許訪問iTunes U 這一項(xiàng)也勾選)– 確定。

再重啟,重開iTunes,回到剛才那個(gè)步驟,把剛剛勾選的兩項(xiàng)取消,回iTunes Store登陸。

3、關(guān)掉防火墻,在windows 安全中心。1.tomcat比較適合j2ee開發(fā),因?yàn)槠渫暾膶?shí)現(xiàn)了Servlet和JSP規(guī)范2.tomcat處理高并發(fā)請求性能不夠好,比如需要使用NIO時(shí)必須要安裝APR插件,確實(shí)比較麻煩。3.netty是一個(gè)性能非常好的java NIO**框架,我們已經(jīng)在諸多大項(xiàng)目中使用并驗(yàn)證。所以:如果性能要求不高,則選用tomcat 開發(fā)上更易用如果對性能有要求,選用netty,當(dāng)然其在使用上要更麻煩,最直接的啟停監(jiān)控腳本得自己來弄。

Netty 能做什么?

Netty能處理大容量數(shù)據(jù)流。
Netty是由JBOSS提供的一個(gè)java開源框架,現(xiàn)為?Github上的獨(dú)立項(xiàng)目。

Netty提供異步的、事件驅(qū)動的**應(yīng)用程序框架和工具,用以快速開發(fā)高性能、高可靠性的**服務(wù)器和客戶端程序。

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

特點(diǎn)
1、易用性
大量的 Javadoc 和 代碼實(shí)例,除了在 JDK 1.6 + 額外的限制。

2、性能
比核心 Java API 更好的吞吐量,較低的延時(shí),資源消耗更少,這個(gè)得益于共享池和重用,減少內(nèi)存拷貝。

Netty WebSocket 拆包淺析

最近項(xiàng)目中運(yùn)用 WebSocket 的場景越來越多,自然而然。踩到的坑也就越來越多,例如最經(jīng)常遇到的拆包,粘包問題。

而當(dāng)發(fā)現(xiàn)這個(gè)問題的時(shí)候,起初我認(rèn)為與我之前通過 mina 實(shí)現(xiàn)自定義協(xié)議頭,解決 socket 進(jìn)行數(shù)據(jù)傳輸時(shí)遇到拆包問題的場景是一樣的。

而當(dāng)我慢慢深入了解 WebSocket的時(shí)候才發(fā)現(xiàn),實(shí)際上,WebSocket 的出現(xiàn),就是為了解決拆包,粘包的問題的。因?yàn)檫@些事情,本身就是應(yīng)該由運(yùn)用層去解決,而不是在TCP/IP層解決。 通過**搜索,我們可以知道 WebSocket 協(xié)議是根據(jù) RFC6455 規(guī)范實(shí)現(xiàn)的,而**版本是13(距離現(xiàn)今也接近10年了)。 以下是 WebScoket 定義的協(xié)議幀片段。

通過以上的幀定義片段。我也就明白了,為什么說 WebSocket 是為了解決拆包,粘包問題等一系列應(yīng)用層問題而誕生的。從 RCF6455 規(guī)范定義第 5.3 章節(jié)中可以發(fā)現(xiàn),每次發(fā)送或者接收的幀報(bào)文中,都會有定義協(xié)議的一些信息,例如頭部大小,數(shù)據(jù)大小,以及幀類型,標(biāo)識位等信息。

看完協(xié)議定義,那么開始查看?Netty?源碼。 以下是?Netty?定義的相關(guān)幀類型以供開發(fā)者使用。當(dāng)服務(wù)端接收到協(xié)議由 HTTP 握手升級協(xié)議 WebSocket 時(shí),我們需要通過?WebSocketServerHandshakerFactory 類新建 WebSocketHandshaker ,此時(shí)會判斷 WebSocket 協(xié)議版本以及相關(guān)信息進(jìn)行校驗(yàn)。

而?WebSocketServerHandshaker 中,分別定義了?WebSocketFrameDecoder , WebSocketFrameEncoder 進(jìn)行解碼,編碼調(diào)用。那么從現(xiàn)實(shí)開始,大概也就清楚了, Netty?中?WebSocket?和?Socket?實(shí)現(xiàn),實(shí)際上都是一樣的,都是一個(gè)解碼器(負(fù)責(zé)接收數(shù)據(jù),處理成需要的類型,例如文本,二進(jìn)制),一個(gè)編碼器(負(fù)責(zé)根據(jù)協(xié)議版本,進(jìn)行幀封裝)的結(jié)構(gòu)。 從?WebSocket13FrameDecoder 我們可以得知,實(shí)際上?WebSocket13FrameDecoder 是繼承自 WebSocket08FrameDecoder (由于實(shí)現(xiàn)細(xì)節(jié)一致),而?WebSocket08FrameDecoder 是繼承自?ByteToMessageDecoder ,實(shí)際上都是通過二進(jìn)制數(shù)據(jù)進(jìn)行解碼處理的。

查看?WebSocket08FrameDecoder 我們可以了解到具體的實(shí)現(xiàn)細(xì)節(jié),就是每次解碼的時(shí)候,都會讀取首部信息,然后依次對數(shù)據(jù)進(jìn)行處理。而拆包等操作,都是已經(jīng)進(jìn)行的相應(yīng)處理和封裝。 看完 Netty 的源碼實(shí)現(xiàn),那么就可以進(jìn)行實(shí)際的編碼解決問題了。 當(dāng)服務(wù)端/客戶端發(fā)現(xiàn)包文過大時(shí),會進(jìn)行拆包。

而為每個(gè)包定義一系列的定義。 例如:當(dāng)接收一個(gè) Text 消息時(shí), Netty 首先會實(shí)例化一個(gè) TextWebSocketFrame 對象并傳遞給調(diào)用方,而通過?isFinalFragment 我們可以判斷出,這個(gè)幀對象是否已經(jīng)傳輸完畢,如果傳輸完畢,那么進(jìn)行業(yè)務(wù)處理。如果沒有傳輸完畢,那么繼續(xù)等待余下信息,進(jìn)行拼接處理。以上為服務(wù)端接收拆包信息的處理方式,反之亦然,客戶端接收消息也可以進(jìn)行相應(yīng)操作。

而根據(jù) WebSocket 1.3 版本實(shí)現(xiàn)的組件,也都根據(jù) RFC6455 規(guī)范進(jìn)行相應(yīng)實(shí)現(xiàn),可以實(shí)現(xiàn)無縫對接。

如何實(shí)現(xiàn)Netty框架中服務(wù)器端的消息推送?

netty框架是用在服務(wù)器端,客戶端是嵌入式編程,通過自定義的tcp通信協(xié)議進(jìn)行連接的,現(xiàn)在需求是這樣的,服務(wù)器端只是用來和客戶端進(jìn)行通信,現(xiàn)在有第三方如微信端進(jìn)行支付成功后在數(shù)據(jù)庫里生成了一條數(shù)據(jù),表示要往某個(gè)客戶端發(fā)送指令,以下兩種方式可供參考:1、微信端生成通訊指令后調(diào)用TCP端的接口(負(fù)責(zé)通訊程序和數(shù)據(jù)庫交互的),在接口程序中通過定義Socket連到通訊程序服務(wù)器端,根據(jù)通道編號去發(fā)送,但是這種會導(dǎo)致服務(wù)器端的tcp客戶端連接變得更多。2、直接在netty框架中定義了scheduleAtF。

當(dāng)然也可借助第三方工具來完成推送。

例如極光推送,極光推送具有以下功能:1、多種消息類型開發(fā)者可以輕松地通過極光發(fā)送各個(gè)移動平臺的系統(tǒng)通知,還可以在控制臺編輯多種富文本展示模板; 極光還提供自定義消息的透傳,客戶端接到消息內(nèi)容后根據(jù)自己的邏輯自由處理。2、用戶和推送統(tǒng)計(jì)完整的消息生命周期查詢,并且可以形成“推送報(bào)表”與“用戶統(tǒng)計(jì)報(bào)表”呈現(xiàn)給開發(fā)者,用來觀察推送的效果和應(yīng)用發(fā)展趨勢。3、短信補(bǔ)充通過極光后臺推送APP通知消息,對于一些重要又不能遺漏的信息可以調(diào)用極光短信的后臺對未收到的客戶端發(fā)送短信通知,保證消息的可靠性。4、A/B 測試合理的推送能夠激活用戶,提高用戶粘性,使用A/B分組測試的科學(xué)方法,根據(jù)測試反饋的結(jié)果,幫助開發(fā)者選擇**化的推送方案。

5、極光推送安全包為金融、**、政務(wù)及其他對推送安全要求極高的客戶提供安全嚴(yán)謹(jǐn)、穩(wěn)定可靠的信息推送解決方案6、可定制的私有云對于安全性要求更高,希望推送數(shù)據(jù)和系統(tǒng)存儲在自己服務(wù)器的客戶,及個(gè)性化需求需要定制開發(fā)的,性能更高要求的,或者想擁有自己推送平臺的甚至要求源碼授權(quán)二次開發(fā)的開發(fā)者,極光提供全功能的私有云解決方案。深圳市和訊華谷信息技術(shù)有限公司(極光 Aurora Mobile,納斯達(dá)克股票代碼:JG)成立于2011年,是**領(lǐng)先的開發(fā)者服務(wù)提供商,專注于為開發(fā)者提供穩(wěn)定高效的消息推送、一鍵認(rèn)證以及流量變現(xiàn)等服務(wù),助力開發(fā)者的運(yùn)營、增長與變現(xiàn)。同時(shí),極光的行業(yè)應(yīng)用已經(jīng)拓展至市場洞察、金融風(fēng)控與商業(yè)地理服務(wù),助力各行各業(yè)優(yōu)化決策、提升效率。