成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Netty源碼解析

_Suqin / 1290人閱讀

摘要:一旦某個(gè)事件觸發(fā),相應(yīng)的則會(huì)被調(diào)用,并進(jìn)行處理。事實(shí)上,內(nèi)部的連接處理協(xié)議編解碼超時(shí)等機(jī)制,都是通過(guò)完成的。開(kāi)啟源碼之門理解了的事件驅(qū)動(dòng)機(jī)制,我們現(xiàn)在可以來(lái)研究的各個(gè)模塊了。

Netty是什么

大概用Netty的,無(wú)論新手還是老手,都知道它是一個(gè)“網(wǎng)絡(luò)通訊框架”。所謂框架,基本上都是一個(gè)作用:基于底層API,提供更便捷的編程模型。那么"通訊框架"到底做了什么事情呢?回答這個(gè)問(wèn)題并不太容易,我們不妨反過(guò)來(lái)看看,不使用netty,直接基于NIO編寫網(wǎng)絡(luò)程序,你需要做什么(以Server端TCP連接為例,這里我們使用Reactor模型):

監(jiān)聽(tīng)端口,建立Socket連接

建立線程,處理內(nèi)容

讀取Socket內(nèi)容,并對(duì)協(xié)議進(jìn)行解析

進(jìn)行邏輯處理

回寫響應(yīng)內(nèi)容

如果是多次交互的應(yīng)用(SMTP、FTP),則需要保持連接多進(jìn)行幾次交互

關(guān)閉連接

建立線程是一個(gè)比較耗時(shí)的操作,同時(shí)維護(hù)線程本身也有一些開(kāi)銷,所以我們會(huì)需要多線程機(jī)制,幸好JDK已經(jīng)有很方便的多線程框架了,這里我們不需要花很多心思。

此外,因?yàn)門CP連接的特性,我們還要使用連接池來(lái)進(jìn)行管理:

建立TCP連接是比較耗時(shí)的操作,對(duì)于頻繁的通訊,保持連接效果更好
對(duì)于并發(fā)請(qǐng)求,可能需要建立多個(gè)連接
維護(hù)多個(gè)連接后,每次通訊,需要選擇某一可用連接
連接超時(shí)和關(guān)閉機(jī)制
想想就覺(jué)得很復(fù)雜了!實(shí)際上,基于NIO直接實(shí)現(xiàn)這部分東西,即使是老手也容易出現(xiàn)錯(cuò)誤,而使用Netty之后,你只需要關(guān)注邏輯處理部分就可以了。

體驗(yàn)Netty

這里我們引用Netty的example包里的一個(gè)例子,一個(gè)簡(jiǎn)單的EchoServer,它接受客戶端輸入,并將輸入原樣返回。其主要代碼如下:

public void run() {
 // Configure the server.
 ServerBootstrap bootstrap = new ServerBootstrap(
 new NioServerSocketChannelFactory(
 Executors.newCachedThreadPool(),
 Executors.newCachedThreadPool()));
 // Set up the pipeline factory.
 bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
 public ChannelPipeline getPipeline() throws Exception {
 return Channels.pipeline(new EchoServerHandler());
 }
 });
 // Bind and start to accept incoming connections.
 bootstrap.bind(new InetSocketAddress(port));
 }
這里 EchoServerHandler 是其業(yè)務(wù)邏輯的實(shí)現(xiàn)者,大致代碼如下:

public class EchoServerHandler extends SimpleChannelUpstreamHandler {
 @Override
 public void messageReceived(
 ChannelHandlerContext ctx, MessageEvent e) {
 // Send back the received message to the remote peer.
 e.getChannel().write(e.getMessage());
 }
 }

還是挺簡(jiǎn)單的,不是嗎?

Netty背后的事件驅(qū)動(dòng)機(jī)制

完成了以上一段代碼,我們算是與Netty進(jìn)行了第一次親密接觸。如果想深入學(xué)習(xí)呢?

閱讀源碼是了解一個(gè)開(kāi)源工具非常好的手段,但是Java世界的框架大多追求大而全,功能完備,如果逐個(gè)閱讀,難免迷失方向,Netty也并不例外。相反,抓住幾個(gè)重點(diǎn)對(duì)象,理解其領(lǐng)域概念及設(shè)計(jì)思想,從而理清其脈絡(luò),相當(dāng)于打通了任督二脈,以后的閱讀就不再困難了。

理解Netty的關(guān)鍵點(diǎn)在哪呢?我覺(jué)得,除了NIO的相關(guān)知識(shí),另一個(gè)就是事件驅(qū)動(dòng)的設(shè)計(jì)思想。什么叫事件驅(qū)動(dòng)?我們回頭看看 EchoServerHandler 的代碼,其中的參數(shù): public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) ,MessageEvent就是一個(gè)事件。這個(gè)事件攜帶了一些信息,例如這里 e.getMessage() 就是消息的內(nèi)容,而 EchoServerHandler 則描述了處理這種事件的方式。一旦某個(gè)事件觸發(fā),相應(yīng)的Handler則會(huì)被調(diào)用,并進(jìn)行處理。這種事件機(jī)制在UI編程里廣泛應(yīng)用,而Netty則將其應(yīng)用到了網(wǎng)絡(luò)編程領(lǐng)域。

在Netty里,所有事件都來(lái)自 ChannelEvent 接口,這些事件涵蓋監(jiān)聽(tīng)端口、建立連接、讀寫數(shù)據(jù)等網(wǎng)絡(luò)通訊的各個(gè)階段。而事件的處理者就是 ChannelHandler ,這樣,不但是業(yè)務(wù)邏輯,連網(wǎng)絡(luò)通訊流程中底層的處理,都可以通過(guò)實(shí)現(xiàn) ChannelHandler 來(lái)完成了。事實(shí)上,Netty內(nèi)部的連接處理、協(xié)議編解碼、超時(shí)等機(jī)制,都是通過(guò)handler完成的。當(dāng)博主弄明白其中的奧妙時(shí),不得不佩服這種設(shè)計(jì)!

下圖描述了Netty進(jìn)行事件處理的流程。 Channel 是連接的通道,是ChannelEvent的產(chǎn)生者,而 ChannelPipeline 可以理解為ChannelHandler的集合。

開(kāi)啟Netty源碼之門

理解了Netty的事件驅(qū)動(dòng)機(jī)制,我們現(xiàn)在可以來(lái)研究Netty的各個(gè)模塊了。Netty的包結(jié)構(gòu)如下:

org
└── jboss
 └── netty
 ├── bootstrap 配置并啟動(dòng)服務(wù)的類
 ├── buffer 緩沖相關(guān)類,對(duì)NIO Buffer做了一些封裝
 ├── channel 核心部分,處理連接
 ├── container 連接其他容器的代碼
 ├── example 使用示例
 ├── handler 基于handler的擴(kuò)展部分,實(shí)現(xiàn)協(xié)議編解碼等附加功能
 ├── logging 日志
 └── util 工具類

在這里面, channel 和 handler 兩部分比較復(fù)雜。我們不妨與Netty官方的結(jié)構(gòu)圖對(duì)照一下,來(lái)了解其功能。

具體的解釋可以看這里: http://netty.io/3.7/guide/#ar... 。圖中可以看到,除了之前說(shuō)到的事件驅(qū)動(dòng)機(jī)制之外,Netty的核心功能還包括兩部分:

Zero-Copy-Capable Rich Byte Buffer

零拷貝的Buffer。為什么叫零拷貝?因?yàn)樵跀?shù)據(jù)傳輸時(shí),最終處理的數(shù)據(jù)會(huì)需要對(duì)單個(gè)傳輸層的報(bào)文,進(jìn)行組合或者拆分。NIO原生的ByteBuffer無(wú)法做到這件事,而Netty通過(guò)提供Composite(組合)和Slice(切分)兩種Buffer來(lái)實(shí)現(xiàn)零拷貝。這部分代碼在 org.jboss.netty.buffer 包中。

這里需要額外注意,不要和操作系統(tǒng)級(jí)別的Zero-Copy混淆了, 操作系統(tǒng)中的零拷貝主要是用戶空間和內(nèi)核空間之間的數(shù)據(jù)拷貝, NIO中通過(guò)DirectBuffer做了實(shí)現(xiàn).

Universal Communication API

統(tǒng)一的通訊API。這個(gè)是針對(duì)Java的Old I/O和New I/O,使用了不同的API而言。Netty則提供了統(tǒng)一的API( org.jboss.netty.channel.Channel )來(lái)封裝這兩種I/O模型。這部分代碼在 org.jboss.netty.channel 包中。

此外,Protocol Support功能通過(guò)handler機(jī)制實(shí)現(xiàn)。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/77663.html

相關(guān)文章

  • #yyds干貨盤點(diǎn)#學(xué)不懂Netty?看不懂源碼?不存在的,這篇文章手把手帶你閱讀Netty源碼

    摘要:簡(jiǎn)單來(lái)說(shuō)就是把注冊(cè)的動(dòng)作異步化,當(dāng)異步執(zhí)行結(jié)束后會(huì)把執(zhí)行結(jié)果回填到中抽象類一般就是公共邏輯的處理,而這里的處理主要就是針對(duì)一些參數(shù)的判斷,判斷完了之后再調(diào)用方法。 閱讀這篇文章之前,建議先閱讀和這篇文章關(guān)聯(lián)的內(nèi)容。 1. 詳細(xì)剖析分布式微服務(wù)架構(gòu)下網(wǎng)絡(luò)通信的底層實(shí)現(xiàn)原理(圖解) 2. (年薪60W的技巧)工作了5年,你真的理解Netty以及為什么要用嗎?(深度干貨)...

    zsirfs 評(píng)論0 收藏0
  • Netty源碼解析-EventLoopGroup

    1.EventLoopGroup類結(jié)構(gòu) showImg(https://segmentfault.com/img/bVbuL9F?w=470&h=433); 重點(diǎn):繼承了ScheduledExecutorService類 2.NioEventLoopGroup類結(jié)構(gòu) showImg(https://segmentfault.com/img/bVbuL9Y?w=537&h=699); 核心代碼Nio...

    張金寶 評(píng)論0 收藏0
  • 追蹤解析 Netty 的 FastThreadLocal 源碼

    摘要:零前期準(zhǔn)備文章異常啰嗦且繞彎。二是底層真正起作用的類,并且提供了大量的靜態(tài)方法。在普通的線程中,這個(gè)對(duì)象由于本身沒(méi)有的原生支持,所以只能附著在對(duì)象當(dāng)中。同一個(gè)線程中如果創(chuàng)建多個(gè)對(duì)象,獲取到的是同一個(gè)。 零 前期準(zhǔn)備 0 FBI WARNING 文章異常啰嗦且繞彎。 1 版本 JDK 版本 : OpenJDK 11.0.1 IDE : idea 2018.3 Netty 版本 : net...

    Anonymous1 評(píng)論0 收藏0
  • 【自己讀源碼Netty4.X系列(一) 啟動(dòng)類概覽

    摘要:一些想法這個(gè)系列想開(kāi)很久了,自己使用也有一段時(shí)間了,利用也編寫了一個(gè)簡(jiǎn)單的框架,并運(yùn)用到工作中了,感覺(jué)還不錯(cuò),趁著這段時(shí)間工作不是很忙,來(lái)分析一波源碼,提升下技術(shù)硬實(shí)力。 一些想法 這個(gè)系列想開(kāi)很久了,自己使用netty也有一段時(shí)間了,利用netty也編寫了一個(gè)簡(jiǎn)單的框架,并運(yùn)用到工作中了,感覺(jué)還不錯(cuò),趁著這段時(shí)間工作不是很忙,來(lái)分析一波源碼,提升下技術(shù)硬實(shí)力。 結(jié)構(gòu) 這里先看下net...

    qingshanli1988 評(píng)論0 收藏0
  • Netty 源碼閱讀之初始環(huán)境搭建

    摘要:版本選擇目前企業(yè)使用最多的版本,最為穩(wěn)定。例如使用的就是版本引入了內(nèi)存池等重大特性,可以有效的降低負(fù)載,使用的就是已經(jīng)被廢棄了,具體可參見(jiàn)所以這里我搭建的源碼閱讀環(huán)境是存在的版本。 showImg(https://segmentfault.com/img/remote/1460000012398550?w=1624&h=1080); Netty 簡(jiǎn)介 Netty 是由 JBOSS 提供...

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

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

0條評(píng)論

閱讀需要支付1元查看
<