netty起步
netty簡介
1烛卧、Netty是基于Java NIO的網(wǎng)絡(luò)應(yīng)用框架晃痴。
2、Netty是一個NIO client-server(客戶端服務(wù)器)框架缰趋,使用Netty可以快速開發(fā)網(wǎng)絡(luò)應(yīng)用捧杉,例如服務(wù)器和客戶端協(xié)議。Netty提供了一種新的方式來使開發(fā)網(wǎng)絡(luò)應(yīng)用程序秘血,這種新的方式使得它很容易使用和有很強的擴展性味抖。Netty的內(nèi)部實現(xiàn)是很復(fù)雜的,但是Netty提供了簡單易用的api從網(wǎng)絡(luò)處理代碼中解耦業(yè)務(wù)邏輯灰粮。Netty是完全基于NIO實現(xiàn)的非竿,所以整個Netty都是異步的。
3谋竖、網(wǎng)絡(luò)應(yīng)用程序通常需要有較高的可擴展性红柱,無論是Netty還是其它的基于Java NIO的框架承匣,都會提供可擴展性的解決方案。Netty中一個關(guān)鍵組成部分是它的異步特性锤悄。
為什么選擇netty
netty框架圖
netty特性
TCP拆包韧骗、粘包問題
- 熟悉tcp編程的可能都知道,無論是服務(wù)器端還是客戶端零聚,當(dāng)我們讀取或者發(fā)送數(shù)據(jù)的時候袍暴,都需要考慮tcp底層的粘包/拆包機制。
- TCP是一個“流”協(xié)議隶症,所謂流就是沒有界限的傳遞數(shù)據(jù)政模。可以想象一下如果河里的水就好比數(shù)據(jù)蚂会,他們是連成一片的淋样,沒有界線,TCP底層并不了解上層的業(yè)務(wù)數(shù)據(jù)具體一個完整的包可能會被TCP分成多個包進行發(fā)送胁住,也可能把多個小包封裝成一個大的數(shù)據(jù)包發(fā)送出去趁猴,這就是所謂的TCP粘包、拆包問題彪见。
- 分析TCP粘包儡司、拆包問題的產(chǎn)生原因:
- 應(yīng)用程序write寫入的字節(jié)大小大于套接口發(fā)送緩沖區(qū)的大小余指;
- 進行MSS大小的TCP分段捕犬;
- 以太網(wǎng)幀的payload大于MTU進行IP分片。
TCP拆包酵镜、粘包解決方案
粘包拆包問題的解決方案碉碉,根據(jù)業(yè)界主流協(xié)議,有三種方案:
- 消息定長笋婿,例如每個報文的大小固定為200個字節(jié)誉裆,如果不夠顿颅,空位補空格缸濒;
- 在包尾部增加特殊字符進行分割,例如加回車等粱腻;
- 將消息分為消息頭和消息體庇配,在消息頭中包含表示消息總長度的字段,然后進行業(yè)務(wù)邏輯的處理绍些。
Netty編解碼技術(shù)
- 編解碼技術(shù)捞慌,說白了就是java序列化技術(shù),序列化目的就兩個柬批,第一進行網(wǎng)絡(luò)傳輸啸澡,第二對象持久化袖订;
- 雖然我們可以使用java進行對象序列化,netty去傳輸嗅虏,但是java序列化的硬傷太多洛姑,比如java序列化沒法跨語言、序列化后碼流太大皮服、序列化性能太低等等楞艾;
- 主流的編解碼框架:
- JBoss的Marshalling包
- google的Protobuf
- 基于Protobuf的Kyro
- MessagePack框架
JBoss Marshalling
Jboos Marshalling是一個java對象序列化包,對JDK 默認的序列化框架進行優(yōu)化龄广,但又保持跟java.io.Serializable接口的兼容硫眯,同時增加了一些可調(diào)的參數(shù)和附加特性。
類庫:jboss-marshalling-1.3.0择同、jboos-marshalling-serail-1.3.0