Netty做為一款用于搭建高性能網(wǎng)絡(luò)應(yīng)用程序的高級(jí)框架,由以下幾個(gè)主要構(gòu)件組成:
一、Channel
Channel 是java NIO的一個(gè)基本構(gòu)造,可以把channel看作是傳入或者傳出的數(shù)據(jù)載體,可以被打開或者關(guān)閉,連接或者斷開連接。簡(jiǎn)單來說其實(shí)就是我們平常網(wǎng)絡(luò)編程中經(jīng)常使用的socket套接字對(duì)象。
二、EventLoop
EventLoop定義了Netty的核心對(duì)象,用于處理IO事件,多線程模型、并發(fā)。EventLoop及其相關(guān)的設(shè)計(jì)實(shí)現(xiàn),我們這里不做深入了解。只需要暫時(shí)了解以下幾點(diǎn):
1、一個(gè)EventLoopGroup包含一個(gè)或者多個(gè)EventLoop;
2、一個(gè)EventLoop在它的生命周期內(nèi)只和一個(gè)Thread綁定;
3、所有有EventLoop處理的I/O事件都將在它專有的Thread上被處理;
4、一個(gè)Channel在它的生命周期內(nèi)只注冊(cè)于一個(gè)EventLoop;
5、一個(gè)EventLoop可能會(huì)被分配給一個(gè)貨多個(gè)Channel;
其實(shí)我們可以簡(jiǎn)單的把EventLoop及其相關(guān)的實(shí)現(xiàn)NioEventLoop、NioEventLoopGroup等理解為netty針對(duì)我們網(wǎng)絡(luò)編程時(shí)創(chuàng)建的多線程進(jìn)行了封裝和優(yōu)化,構(gòu)建了自己的線程模型。
三、ChannelHandler和ChannelPipeline
ChannelHandler其實(shí)就是用于負(fù)責(zé)處理接收和發(fā)送數(shù)據(jù)的的業(yè)務(wù)邏輯,Netty中可以注冊(cè)多個(gè)handler,以鏈?zhǔn)降姆绞竭M(jìn)行處理,根據(jù)繼承接口的不同,實(shí)現(xiàn)的順序也不同。
1、ChannelInboundHandler:對(duì)接收的信息進(jìn)行處理。一般用來執(zhí)行解碼、讀取客戶端數(shù)據(jù)、進(jìn)行業(yè)務(wù)處理等。如ByteToMessageDecoder;
2、ChannelOutboundHandler:對(duì)發(fā)送的信息進(jìn)行處理,一般用來進(jìn)行編碼、發(fā)送報(bào)文到客戶端。如MessageToByteEncoder;
而ChannelPipeline為ChannelHandler鏈提供了容器。
四、ByteBuf
網(wǎng)絡(luò)數(shù)據(jù)的操作歸根到底是字節(jié)的操作,Netty的ByteBuf做為一個(gè)強(qiáng)大高效的字節(jié)容器,提供了更加豐富的API用于字節(jié)的操作,同時(shí)保持了卓越的功能性和靈活性;
總結(jié):
以上四個(gè)做為Netty的基本組件,可以理解為Netty把我們之前網(wǎng)絡(luò)編程中使用到的各部分都進(jìn)行了優(yōu)化和高性能的封裝,對(duì)比到實(shí)際的通信流程中,可以簡(jiǎn)單的用下圖直觀的表示
本章參考資料:《Netty實(shí)戰(zhàn)》