亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Netty組件入門(mén)學(xué)習(xí)

qpal / 2378人閱讀

摘要:可以用來(lái)接收入站事件和數(shù)據(jù),隨后使用應(yīng)用程序的業(yè)務(wù)邏輯進(jìn)行處理。因?yàn)橛脩?hù)并不是關(guān)心所有的事件,因此提供了抽象類(lèi)和。抽象類(lèi)最常見(jiàn)的一個(gè)情況,你的應(yīng)用程序會(huì)利用一個(gè)來(lái)接受解碼消息,并對(duì)該數(shù)據(jù)應(yīng)用業(yè)務(wù)邏輯。

Channel、EventLoop和ChannelFuture

Channel——Socket;

EventLoop——控制流、多線(xiàn)程處理、并發(fā)

ChannelFuture異步通知

Channel接口

基于I/O操作(例如:bind()、connect()、read()和write())依賴(lài)于底層網(wǎng)絡(luò)傳輸提供的原語(yǔ)。在基于Java的網(wǎng)絡(luò)編程中,其基本構(gòu)造為類(lèi)Socket。

Netty的Channel接口所提供的API,大大降低了直接使用Socket類(lèi)的復(fù)雜性。

Channel擁有許多預(yù)定義的、專(zhuān)門(mén)化實(shí)現(xiàn)的廣泛類(lèi)層次結(jié)構(gòu)的根,如下:

EmbeddedChannel

LocalServerChannel

NioDatagramChannel

NioSctpChannel

NioSocketChannel

EventLoop接口

EventLoop定義了Netty的核心抽象,用于處理連接的生命周期中所發(fā)生的事件。

Channel、EventLoop、Thread、EventLoopGroup關(guān)系示意圖

一個(gè)EventLoopGroup包含一個(gè)或者多個(gè)EventLoop

一個(gè)EventLoop在它的生命周期內(nèi)只和一個(gè)Thread綁定

所有由EventLoop處理的I/O事件都將在它專(zhuān)有的Thread上被處理

一個(gè)Channel在它的生命周期內(nèi)只注冊(cè)于一個(gè)EventLoop

一個(gè)EventLoop可能會(huì)被分配一個(gè)或多個(gè)Channel

一個(gè)給定Channel的I/O操作都是由相同的Thread執(zhí)行的,實(shí)際上消除了對(duì)于同步的需要

ChanneFuture接口

Netty中所有的I/O操作都是異步的,因?yàn)橐粋€(gè)操作不可能立即返回,所以我們需要一種用于在之后的某個(gè)時(shí)間點(diǎn)確定其結(jié)果的方法。

因此Netty提供了ChannelFuture接口,其addListener()方法注冊(cè)了一個(gè)ChannelFutureListener,以便在某個(gè)操作完成時(shí)(無(wú)論是否成功)得到通知。

ChannelHandler和ChannelPipeline

主要用來(lái)管理數(shù)據(jù)流已經(jīng)執(zhí)行應(yīng)用程序處理邏輯

ChannelHandler接口

ChannelHandler充當(dāng)了所有處理入站和出站數(shù)據(jù)的應(yīng)用程序邏輯的容器。

ChannelHandler可專(zhuān)門(mén)用于幾乎任何類(lèi)型的動(dòng)作,例如將數(shù)據(jù)從一種格式轉(zhuǎn)換為另外一種格式,或者處理轉(zhuǎn)換過(guò)程中所拋出的異常。

ChannelHandler可以用來(lái)接收入站事件和數(shù)據(jù),隨后使用應(yīng)用程序的業(yè)務(wù)邏輯進(jìn)行處理。當(dāng)你的客戶(hù)端需要發(fā)送響應(yīng)時(shí),可以從ChannelInboundhandler沖刷數(shù)據(jù)。

你的應(yīng)用程序的業(yè)務(wù)邏輯通常駐留在一個(gè)或者多個(gè)ChannelInboundHandler中。

ChannelPipeline

ChannelPipeline是ChannelHandler鏈的容器,并定義用于在該鏈上傳播入站和出站事件流的API。當(dāng)Channel被創(chuàng)建時(shí),它會(huì)被自動(dòng)地分配到它專(zhuān)屬的ChannelPipeline。

ChannelHandler被安裝到ChannelPipeline中過(guò)程如下:

一個(gè)ChannelInitializer的實(shí)現(xiàn)被注冊(cè)到了ServerBootstrap中

當(dāng)ChannelInitializer.initChannel()方法被調(diào)用時(shí),ChannelInitalizer將在ChannelPipeline中安裝一組自定義的ChannelHandler

ChannelInitializer將它自己從ChannelPipeline中移除

?ChannelHandler可以讓事件流經(jīng)ChannelPipeline,它們是在應(yīng)用程序的初始化或者引導(dǎo)階段被安裝的。這些對(duì)象接收事件、執(zhí)行它們所實(shí)現(xiàn)的處理邏輯,并將數(shù)據(jù)傳遞給鏈中的下一個(gè)ChannelHandler。它們的執(zhí)行順序是由它們被添加的順序決定的。

ChannelPipeline是這些ChannelHandler的編排順序。

入站和出站ChannelHandler可以被安裝到同一個(gè)ChannelPipeline中。如果一個(gè)消息或者任何其他的入站事件被讀取,那么它會(huì)從ChannelPipeline的頭部開(kāi)始流動(dòng),并被傳遞給第一個(gè)ChannelInboundHandler。這個(gè)ChannelHandler不一定會(huì)實(shí)際地修改數(shù)據(jù),具體取決于它的具體功能,在這之后,數(shù)據(jù)將會(huì)被傳遞給鏈中的下一個(gè)ChannelInboundHandler。最終,數(shù)據(jù)會(huì)到達(dá)ChannelPipeline的尾端,屆時(shí),所有處理就都結(jié)束了。

出站數(shù)據(jù)將會(huì)從ChannelOutboundHandler鏈的尾端開(kāi)始流動(dòng),直到它到達(dá)鏈的頭部為止。在這之后,出站數(shù)據(jù)將會(huì)到達(dá)網(wǎng)絡(luò)傳輸層。

通過(guò)使用作為參數(shù)傳遞到每個(gè)方法的ChannelHandlerContext,事件可以被傳遞給當(dāng)前ChannelPipeLine中的下一個(gè)ChannelHandler。因?yàn)橛脩?hù)并不是關(guān)心所有的事件,因此Netty提供了抽象類(lèi)ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter。通過(guò)調(diào)用ChannelHandlerContext上的對(duì)應(yīng)的方法,都可以簡(jiǎn)單地將事件傳遞給下一個(gè)ChannelHandler的方法的實(shí)現(xiàn)。

當(dāng)ChannelHandler被添加到ChannelPipeline時(shí),它將會(huì)被分配一個(gè)ChannelHandlerContext,它代表了Channel和ChannelPipeline之間的綁定。雖然這個(gè)對(duì)象可以被用于獲取底層的Channel,但是它主要還是被用于出站寫(xiě)數(shù)據(jù)。

在Netty中,有兩種發(fā)送消息的方式:

直接寫(xiě)到Channel中,會(huì)導(dǎo)致消息從ChannelPipeline的尾端開(kāi)始流動(dòng)

寫(xiě)到和ChannelHandler相關(guān)聯(lián)的ChannelHandlerContext對(duì)象中,會(huì)導(dǎo)致消息從ChannelPipeline中的下一個(gè)ChannelHandler開(kāi)始流動(dòng)

如果將兩個(gè)類(lèi)別(Inboud和Outbound)的ChannelHandler都混合添加到一個(gè)ChannelPipeline會(huì)發(fā)生什么?

雖然ChannelInboundHandler和ChannelOutboundHandler都擴(kuò)展自ChannelHandler,但是Netty可以區(qū)分兩種Handler的實(shí)現(xiàn),并確保數(shù)據(jù)只會(huì)在具有相同定向類(lèi)型的兩個(gè)ChannelHandler之間傳遞。

深入了解ChannelHandler

不同類(lèi)型的ChannelHandler各自的功能主要取決于它們的超類(lèi)。Netty以適配器類(lèi)的形式提供了大量默認(rèn)的ChannelHandler實(shí)現(xiàn),其旨在簡(jiǎn)化應(yīng)用程序處理邏輯的開(kāi)發(fā)過(guò)程。

這些適配器類(lèi)可以自動(dòng)將事件轉(zhuǎn)發(fā)到ChannelPipeline中的下一個(gè)ChannelHandler,所以你可以只重寫(xiě)那些你想要特殊處理的方法和事件。

為什么需要適配器?

有一些適配器類(lèi)可以將編寫(xiě)自定義的ChannelHanlder所需要的努力降到最低限度,因?yàn)樗鼈兲峁┝硕x在對(duì)應(yīng)接口中的所有方法的默認(rèn)實(shí)現(xiàn)。
常用的適配器類(lèi)有:

ChannelHandlerAdapter

ChannelInboundHandlerAdapter

ChannelOutboundHandlerAdapter

ChannelDuplexHandler

編碼解碼器

所有由Netty提供的編碼/解碼適配器類(lèi)都實(shí)現(xiàn)了ChannelOutboundHandler或者ChannelInboundHandler接口。

對(duì)于入站數(shù)據(jù),channelRead方法已經(jīng)被重寫(xiě)了。對(duì)于每一個(gè)從入站Channel讀取的消息,這個(gè)方法都會(huì)被調(diào)用。隨后,它將調(diào)用由預(yù)置解碼器提供的decode()方法,并將已解碼的字節(jié)轉(zhuǎn)發(fā)給ChannelPipeline中的下一個(gè)ChannelHandler,出站相反。

抽象類(lèi)SimpleChannelInboundHandler

最常見(jiàn)的一個(gè)情況,你的應(yīng)用程序會(huì)利用一個(gè)ChannelHandler來(lái)接受解碼消息,并對(duì)該數(shù)據(jù)應(yīng)用業(yè)務(wù)邏輯。要?jiǎng)?chuàng)建一個(gè)這樣的ChannelHandler,只需要擴(kuò)展SimpleChannelInboundHandler,其中是你要處理的消息的Java類(lèi)型。

在這個(gè)ChannelHandler中,你將需要重寫(xiě)基類(lèi)的一個(gè)或者多個(gè)方法,并且獲取一個(gè)ChannelHandlerContext的引用,這個(gè)引用將作為參數(shù)傳遞給ChannelHandler的所有方法。

在這種類(lèi)型的ChannelHandler中,最重要的方法是channelRead0(ChannelHandlerContext , T)。除了要求不阻塞當(dāng)前的I/O線(xiàn)程之外,其具體實(shí)現(xiàn)完全取決于你。

引導(dǎo)

Netty的引導(dǎo)類(lèi)為應(yīng)用程序的網(wǎng)絡(luò)層配置提供了容器。

用于客戶(hù)端(Bootstrap)引導(dǎo),將一個(gè)進(jìn)程連接到另一個(gè)運(yùn)行在某個(gè)指定主機(jī)的指定端口上的進(jìn)程。

用于服務(wù)器(ServerBootstrap)引導(dǎo),將一個(gè)進(jìn)程綁定到某個(gè)指定的端口

Bootstrap類(lèi)比較

類(lèi)別 Bootstrap ServerBootstrap
網(wǎng)絡(luò)編程中的作用 連接到遠(yuǎn)程主機(jī)和端口 綁定到一個(gè)本地端口
EventLoopGroup的數(shù)目 1 2

區(qū)別分析:

ServerBootstrap將綁定到一個(gè)端口,因?yàn)榉?wù)器必須要監(jiān)聽(tīng)連接,而B(niǎo)ootstrap則是由想要連接到遠(yuǎn)程節(jié)點(diǎn)的客戶(hù)端應(yīng)用程序所使用的。

為什么服務(wù)端需要兩個(gè)EventLoopGroup(可以是同一個(gè)實(shí)例)?因?yàn)榉?wù)器需要兩組不同的Channel。第一組將只包含一個(gè)ServerChannel,代表服務(wù)器自身的已綁定到某個(gè)本地端口第二次正在監(jiān)聽(tīng)的套接字。第二組包含所有已經(jīng)創(chuàng)建的用來(lái)處理傳入客戶(hù)端連接(對(duì)于每個(gè)服務(wù)器已經(jīng)接受的連接都一個(gè))的Channel。

3.與ServerChannel相關(guān)聯(lián)的EventLoopGroup將分配一個(gè)負(fù)責(zé)為傳入連接請(qǐng)求創(chuàng)建Channel的EventLoop。一旦連接被接受,第二個(gè)EventLoopGroup就會(huì)給它的Channel分配一個(gè)EventLoop。

具有兩個(gè)EventLoopGroup的服務(wù)器

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/69275.html

相關(guān)文章

  • 慕課網(wǎng)_《Netty入門(mén)之WebSocket初體驗(yàn)》學(xué)習(xí)總結(jié)

    時(shí)間:2018年04月11日星期三 說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:https://github.com/zccodere/s... 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是Netty 高性能、事件驅(qū)動(dòng)、異步非阻塞的IO Java開(kāi)源框架 基于NIO的客戶(hù)...

    Noodles 評(píng)論0 收藏0
  • Spring Boot 2 快速教程:WebFlux 快速入門(mén)(二)

    摘要:響應(yīng)式編程是基于異步和事件驅(qū)動(dòng)的非阻塞程序,只是垂直通過(guò)在內(nèi)啟動(dòng)少量線(xiàn)程擴(kuò)展,而不是水平通過(guò)集群擴(kuò)展。三特性常用的生產(chǎn)的特性如下響應(yīng)式編程模型適用性?xún)?nèi)嵌容器組件還有對(duì)日志消息測(cè)試及擴(kuò)展等支持。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號(hào):泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 02:WebFlux 快速入門(mén)實(shí)踐 文章工程: JDK...

    gaara 評(píng)論0 收藏0
  • Netty入門(mén)學(xué)習(xí)-ByteBuf

    摘要:使用來(lái)優(yōu)化套接字操作,盡可能消除由的緩沖區(qū)實(shí)現(xiàn)所導(dǎo)致的性能以及內(nèi)存使用率的懲罰,這種優(yōu)化發(fā)生在的核心代碼中,不會(huì)被暴露出來(lái)。當(dāng)前將會(huì)被增加所寫(xiě)入的字節(jié)數(shù)。 ByteBuf是Java NIO ByteBuffer的替代品,是網(wǎng)絡(luò)數(shù)據(jù)基本單位字節(jié)的容器。 ByteBuf的API Netty的數(shù)據(jù)處理API通過(guò)兩個(gè)組件暴漏:抽象類(lèi)ByteBuf和接口ByteBufHolder ByteBuf...

    beanlam 評(píng)論0 收藏0
  • Java學(xué)習(xí)必備書(shū)籍推薦終極版!

    摘要:實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)推薦豆瓣評(píng)分書(shū)的質(zhì)量沒(méi)的說(shuō),推薦大家好好看一下。推薦,豆瓣評(píng)分,人評(píng)價(jià)本書(shū)介紹了在編程中條極具實(shí)用價(jià)值的經(jīng)驗(yàn)規(guī)則,這些經(jīng)驗(yàn)規(guī)則涵蓋了大多數(shù)開(kāi)發(fā)人員每天所面臨的問(wèn)題的解決方案。 很早就想把JavaGuide的書(shū)單更新一下了,昨晚加今天早上花了幾個(gè)時(shí)間對(duì)之前的書(shū)單進(jìn)行了分類(lèi)和補(bǔ)充完善。雖是終極版,但一定還有很多不錯(cuò)的 Java 書(shū)籍我沒(méi)有添加進(jìn)去,會(huì)繼續(xù)完善下去。希望這篇...

    Steve_Wang_ 評(píng)論0 收藏0
  • 從Java Socket非阻塞到Netty入門(mén)流程

    摘要:事件循環(huán)新連接接入連接上的數(shù)據(jù)讀取抽象連接抽象業(yè)務(wù)邏輯處理讀寫(xiě)數(shù)據(jù)期間的業(yè)務(wù)層動(dòng)態(tài)鏈處理多個(gè)組成,讓消息可以層層處理數(shù)據(jù)接收基本的數(shù)據(jù)處理基于公眾號(hào)貓說(shuō)學(xué)習(xí)交流群現(xiàn)架構(gòu)設(shè)計(jì)碼農(nóng)兼創(chuàng)業(yè)技術(shù)顧問(wèn),不羈平庸,熱愛(ài)開(kāi)源,雜談程序人生與不定期干貨。 本博客 貓叔的博客,轉(zhuǎn)載請(qǐng)申明出處閱讀本文約 4分鐘 適讀人群:同學(xué) Java IO,Socket非阻塞通信流程 這里我們使用一個(gè)內(nèi)嵌的永久循環(huán),...

    fsmStudy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

qpal

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<