Netty学习四:Channel
1. Channel
Channel是Netty的核心概念之一,它是Netty網(wǎng)絡(luò)通信的主體,由它負(fù)責(zé)同對端進(jìn)行網(wǎng)絡(luò)通信、注冊和數(shù)據(jù)操作等功能。1.1 工作原理
如上圖所示:
- 一旦用戶端連接成功,將新建一個(gè)channel同該用戶端進(jìn)行綁定
- channel從EventLoopGroup獲得一個(gè)EventLoop,并注冊到該EventLoop,channel生命周期內(nèi)都和該EventLoop在一起(注冊時(shí)獲得selectionKey)
- channel同用戶端進(jìn)行網(wǎng)絡(luò)連接、關(guān)閉和讀寫,生成相對應(yīng)的event(改變selectinKey信息),觸發(fā)eventloop調(diào)度線程進(jìn)行執(zhí)行
- 如果是讀事件,執(zhí)行線程調(diào)度pipeline來處理用戶業(yè)務(wù)邏輯
1.2 狀態(tài)轉(zhuǎn)換
如上圖所示,Channel包含注冊、活躍、非活躍和非注冊狀態(tài),在一般情況下是從注冊->活躍->非活躍->非注冊,但用戶可以從eventloop取消和重注冊channel,因此在此情況下活躍->非注冊->注冊
1.3 線程
多個(gè)channel可以注冊到一個(gè)eventloop上,所有的操作都是順序執(zhí)行的,eventloop會(huì)依據(jù)channel的事件調(diào)用channel的方法進(jìn)行相關(guān)操作,每個(gè)channel的操作和處理在eventloop中都是順序的,如下圖:2. ChannelPipeline和ChannelHandler
ChannelPipeline和ChannelHandler用于channel事件的攔截和處理,Netty使用類似責(zé)任鏈的模式來設(shè)計(jì)ChannelPipeline和ChannelHandlerChannelPipeline相當(dāng)于ChannelHandler的容器,channel事件消息在ChannelPipeline中流動(dòng)和傳播,相應(yīng)的事件能夠被ChannelHandler攔截處理、傳遞、忽略或者終止,如下圖所示:2.1 INBOUD和OUTBOUND事件
inbound:當(dāng)發(fā)生某個(gè)I/O操作時(shí)由IO線程流向用戶業(yè)務(wù)處理線程的事件,如鏈路建立、鏈路關(guān)閉或者讀完成等 outbound:由用戶線程或者代碼發(fā)起的IO操作事件2.2 ChannelHandlerContext
每個(gè)ChannelHandler 被添加到ChannelPipeline 后,都會(huì)創(chuàng)建一個(gè)ChannelHandlerContext 并與之創(chuàng)建的ChannelHandler 關(guān)聯(lián)綁定。如下圖: ChannelHandler通過ChannelHandlerContext來操作channel和channelpipeline2.3 ChannelHandler
ChannelHandler負(fù)責(zé)I/O事件或者I/O操作進(jìn)行攔截和處理,用戶可以通過ChannelHandlerAdapter來選擇性的實(shí)現(xiàn)自己感興趣的事件攔截和處理。由于Channel只負(fù)責(zé)實(shí)際的I/O操作,因此數(shù)據(jù)的編解碼和實(shí)際處理都需要通過ChannelHandler進(jìn)行處理。
2.4 注意
ChannelPipeline是線程安全的,多個(gè)業(yè)務(wù)線程可以并發(fā)的操作ChannelPipeline;ChannelHandler不是線程安全的,用戶需要自己保重ChannelHandler的線程安全
3. ChannelFuture與ChannelPromise
在Netty中,所有的I/O操作都是異步的,因此調(diào)用一個(gè)I/O操作后,將繼續(xù)當(dāng)前線程的執(zhí)行,但I(xiàn)/O操作的結(jié)果怎么獲得?——ChannelFuture。如上圖,當(dāng)前線程A異步發(fā)起I/O操作后,不阻塞繼續(xù)執(zhí)行相關(guān)操作,當(dāng)IO線程B完成后,通過回調(diào)執(zhí)行A設(shè)置的回調(diào)方法。
回調(diào)方法通過監(jiān)聽的形式實(shí)現(xiàn):ChannelFutureListener。ChannelPromise是ChannelFuture的擴(kuò)展,允許設(shè)置I/O操作的結(jié)果,使ChannelFutureListener可以執(zhí)行相關(guān)操作
轉(zhuǎn)載于:https://www.cnblogs.com/TomSnail/p/6192885.html
總結(jié)
以上是生活随笔為你收集整理的Netty学习四:Channel的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lamp用户认证
- 下一篇: 消息称 Meta 计划再裁员数千人,此前