天天看點

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

傳統socket網絡程式設計

1.1 實戰

服務端:ServerBoot

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

Server 

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

ClientHandler 

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

用戶端:Client

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

先後啟動 ServerBoot、Client,分别輸出如下: 

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

1.2 傳統HTTP伺服器原理

建立一個ServerSocket

監聽并綁定一個端口一系列用戶端來請求這個端口伺服器使用Accept,獲得一個來自用戶端的Socket連接配接對象

啟動一個新線程處理連接配接讀Socket,

得到位元組流解碼協定

得到Http請求對象處理Http請求

得到一個結果

封裝成一個HttpResponse對象編碼協定

将結果序列化位元組流寫Socket

将位元組流發給用戶端

繼續循環步驟3

1.3 C/S 互動流程

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

 Netty版socket網絡程式設計

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

下面分别介紹圖中對應元件。

 Netty核心元件

3.1 NioEventLoop

3.1.1 簡介

EventLoop,其實一個 eventloop 就是一個 eventexecutor 

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

NioEventLoopGroup 是一個處理 I/O 操作的多線程事件循環。Netty 為不同類型傳輸提供各種 EventLoopGroup 實作。在此示例中,我們實作伺服器端應用程式,是以将使用兩個 NioEventLoopGroup。第一個,通常稱為'boss',接受傳入的連接配接。第二個(通常稱為'從業人員')在上司接受連接配接并登記到從業人員後處理接受連接配接的流量。使用多少線程以及如何映射到建立的通道取決于 EventLoopGroup 實作,甚至可能通過構造函數進行配置。

作為Netty的發動機 

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

Server端 

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

Client端

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

while(true)就對應一個 run 方法

NioEventLoop#run 

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

netty有不同的io程式設計模型實作。

以NIO為例,對IO事件的處理是在NioEventLoop裡做的,事件的注冊在下面的方法 

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

不同僚件調用unsafe的不同方法,netty對底層socket的操作都是通過unsafe來做的 unsafe主要由兩種不同的實作:

NioMessageUnsafe NioServerSocketChannel使用的是NioMessageUnsafe來做socket操作

NioByteUnsafe NioSocketChannel使用NioByteUnsafe來做socket操作

處理每一個連接配接

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

EventExecutorGroup

EventExecutorGroup 負責經由其使用next()方法提供EventExecutor。除此之外,還負責處理自己的生命周期,并允許在全局模式中關閉它們。

EventExecutor

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

該EventExecutor是個特殊的EventExecutorGroup,附帶一些快捷方法,看是否有Thread在事件循環執行。除此之外,它還繼承了EventExecutorGroup以允許通用的方法來通路。

eventloopGroup

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

特殊的 EventExecutorGroup,它允許注冊 Channel,即事件循環期間可以執行 channel 操作,得到處理,供以後選用

3.2 Channel

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

以服務端的NioMessageUnsafe為例來看下read()方法的實作,對應是否有新連接配接進來的情況 

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

 直接把底層的 channel 封裝成 NioSocketChannel 

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

3.3 ByteBuf

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

3.4 Pipeline

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

 netty 将其抽象成邏輯鍊,看看 netty 是怎麼把每個 pipeline 加入到用戶端連接配接的 

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件

3.5 ChannelHandler

阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件
阿裡P8架構師教你Netty原理-核心元件傳統socket網絡程式設計 Netty版socket網絡程式設計 Netty核心元件