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