Stories

Detail Return Return

Netty源碼解析-底層原理及IO模式 - Stories Detail

1、Netty源碼編譯

我們看一下版本4.1.40.Final-SNAPSHOT源碼包,可以把源碼pull到本地,用IDEA打開。

github地址:https://github.com/netty/netty

包含的模塊如下圖:

2、Netty 源碼核心包

2.1 Netty源碼核心包主要分成下面幾塊:

1、工具類

下圖紅色的模塊,如buffer、common、resolver

2、底層協議(transport)

下圖黃色的模塊,TCP的不同實現(linux(epoll)、Mac(kqueue),unix)

3、人性化協議

下圖藍色模塊,包括編解碼codec、還有handler(這是Netty好用的原因)

2.2 源碼的基本組件

學習看源碼前,我們需要了解一下源碼包含的基本機構,下面是源碼中常見的組件:

  • 1)Bootstrap/ServerBootstrap:Netty 中 Bootstrap 類是客户端程序的啓動引導類,ServerBootstrap 是服務端啓動引導類。;
  • 2)Channel:通道,代表一個連接,不同協議、不同的阻塞類型的連接都有不同的 Channel 類型與之對應。

下面是一些常用的 Channel 類型:

NioSocketChannel,異步的客户端 TCP Socket 連接。

NioServerSocketChannel,異步的服務器端 TCP Socket 連接。

NioDatagramChannel,異步的 UDP 連接。

NioSctpChannel,異步的客户端 Sctp 連接。

NioSctpServerChannel,異步的 Sctp 服務器端連接,這些通道涵蓋了 UDP 和 TCP 網絡 IO 以及文件 IO。

  • 3)ChannelPipeline:責任鏈,持有handler的責任鏈,負責handler的添加和刪除
  • 4)ChannelHandlerContext: 責任鏈上下文信息,是責任鏈的一個節點,持有一個handler
  • 5)handler:用於處理出入站消息及相應的事件,實現我們自己要的業務邏輯;
  • 6)NioEventLoop:處理任務的線程,NioEventLoop 中維護了一個線程和任務隊列,支持異步提交執行任務
  • 7)NioEventLoopGroup:EventLoop線程池
  • 8)ChannelInitializer:Channel初始化
  • 9)Future/ChannelFuture : 異步I/O無法立即獲得結果,這裏是指操作的執行結果,通過事件機制,獲取執行結果,通過添加監聽器,執行我們想要的操作;
  • 10)ByteBuf :用來操作緩衝區的字節數組

下面我們開始看源碼了,我們先看一下Netty對IO模式支持的源碼,其他的源碼解析我後續會給出來

3、Netty對三種IO模式的支持

我們看到對三種IO模式的支持,相關的類都加了不同的前綴Oio,Nio,Aio。現在其他IO模式都已棄用,只有支持NIO了。

3.1 我們看一下Channel如何實現的

進入ServeBootstrap設置Channel的方法,他的參數是一個class類型

3.1.1 ServeBootstrap.channel方法

這個方法裏面通過new ReflectiveChannelFactory來獲取Channel的一個反射工廠,參數為ChannelClass,進入ReflectiveChannelFactory

3.1.2 ReflectiveChannelFactory

ReflectiveChannelFactory構造方法通過獲取獲取Channel構造器,並將該構造器作為他的屬性,該方法參數是class,根據入參決定是哪種類型構造器(NioServerSocketChannel或者OiOServerSocketChannel)。

下面的newChannel方法是通過構造器來獲取Channel,那麼需要channel的地方就可以通過這個Facotry的newChannel方法獲取channel。

在Bootstrap初始化的階段,Channel被構造出來

4 總結

Netty通過channel的反射工廠獲取channel的構造器,channel類型通過參數傳遞(這裏實現對不同類型IO的支持),channel通過反射工廠在需要的時候構造出來(這裏是一個優化)。

我們可以看到Netty的代碼確實做了很多優化。

5 參考:

https://segmentfault.com/a/1190000038211285

http://www.52im.net/thread-2043-1-1.html

Add a new Comments

Some HTML is okay.