資料內(nèi)容:
模型解釋:
1) Netty 抽象出兩組線程池BossGroup和WorkerGroup,BossGroup專門負(fù)責(zé)接收客戶端的連接, WorkerGroup專
門負(fù)責(zé)網(wǎng)絡(luò)的讀寫
2) BossGroup和WorkerGroup類型都是NioEventLoopGroup
3) NioEventLoopGroup 相當(dāng)于一個(gè)事件循環(huán)線程組, 這個(gè)組中含有多個(gè)事件循環(huán)線程 , 每一個(gè)事件循環(huán)線程是
NioEventLoop
4) 每個(gè)NioEventLoop都有一個(gè)selector , 用于監(jiān)聽注冊(cè)在其上的socketChannel的網(wǎng)絡(luò)通訊
5) 每個(gè)Boss NioEventLoop線程內(nèi)部循環(huán)執(zhí)行的步驟有 3 步
處理accept事件 , 與client 建立連接 , 生成 NioSocketChannel
將NioSocketChannel注冊(cè)到某個(gè)worker NIOEventLoop上的selector
處理任務(wù)隊(duì)列的任務(wù) , 即runAllTasks
6) 每個(gè)worker NIOEventLoop線程循環(huán)執(zhí)行的步驟
輪詢注冊(cè)到自己selector上的所有NioSocketChannel 的read, write事件
處理 I/O 事件, 即read , write 事件, 在對(duì)應(yīng)NioSocketChannel 處理業(yè)務(wù)
runAllTasks處理任務(wù)隊(duì)列TaskQueue的任務(wù) ,一些耗時(shí)的業(yè)務(wù)處理一般可以放入TaskQueue中慢慢處
理,這樣不影響數(shù)據(jù)在 pipeline 中的流動(dòng)處理
7) 每個(gè)worker NIOEventLoop處理NioSocketChannel業(yè)務(wù)時(shí),會(huì)使用 pipeline (管道),管道中維護(hù)了很多 handler
處理器用來處理 channel 中的數(shù)據(jù)
Netty模塊組件
【Bootstrap、ServerBootstrap】:
Bootstrap 意思是引導(dǎo),一個(gè) Netty 應(yīng)用通常由一個(gè) Bootstrap 開始,主要作用是配置整個(gè) Netty 程序,串聯(lián)各個(gè)組
件,Netty 中 Bootstrap 類是客戶端程序的啟動(dòng)引導(dǎo)類,ServerBootstrap 是服務(wù)端啟動(dòng)引導(dǎo)類。
【Future、ChannelFuture】:
正如前面介紹,在 Netty 中所有的 IO 操作都是異步的,不能立刻得知消息是否被正確處理。
但是可以過一會(huì)等它執(zhí)行完成或者直接注冊(cè)一個(gè)監(jiān)聽,具體的實(shí)現(xiàn)就是通過 Future 和 ChannelFutures,他們可以注
冊(cè)一個(gè)監(jiān)聽,當(dāng)操作執(zhí)行成功或失敗時(shí)監(jiān)聽會(huì)自動(dòng)觸發(fā)注冊(cè)的監(jiān)聽事件。
【Channel】:
Netty 網(wǎng)絡(luò)通信的組件,能夠用于執(zhí)行網(wǎng)絡(luò) I/O 操作。Channel 為用戶提供:
1)當(dāng)前網(wǎng)絡(luò)連接的通道的狀態(tài)(例如是否打開?是否已連接?)
2)網(wǎng)絡(luò)連接的配置參數(shù) (例如接收緩沖區(qū)大小)
3)提供異步的網(wǎng)絡(luò) I/O 操作(如建立連接,讀寫,綁定端口),異步調(diào)用意味著任何 I/O 調(diào)用都將立即返回,并且不保
證在調(diào)用結(jié)束時(shí)所請(qǐng)求的 I/O 操作已完成。
4)調(diào)用立即返回一個(gè) ChannelFuture 實(shí)例,通過注冊(cè)監(jiān)聽器到 ChannelFuture 上,可以 I/O 操作成功、失敗或取
消時(shí)回調(diào)通知調(diào)用方。
5)支持關(guān)聯(lián) I/O 操作與對(duì)應(yīng)的處理程序。
不同協(xié)議、不同的阻塞類型的連接都有不同的 Channel 類型與之對(duì)應(yīng)。
下面是一些常用的 Channel 類型: