1. 程式人生 > >Netty(一):基礎概念及訊息處理流程

Netty(一):基礎概念及訊息處理流程

1.  Netty是什麼?

  Netty是由JBOSS提供的一個java開源網路通訊框架。Netty可以提供非同步的,非阻塞的,事件驅動的網路應用程式框架和工具,非常適合用來快速開發高效能、高可靠性的網路伺服器和客戶端程式。

Netty是一個基於NIO的客戶、伺服器端程式設計框架,使用Netty 可以讓我們快速和簡單地進行網路通訊和資料傳輸。

2.  接收請求和處理流程

首先先介紹在Netty中會用到的關鍵概念:

EventLoopGroup:一個 Netty 程式啟動時, 至少要指定一個 EventLoopGroup物件,EventLoopGroup內有很多個EventLoop,負責處理事件

EventLoop: 負責處理各種事件

Channel:即通訊的通道,傳送接受資料

ChannelPipeline:Channel的資料管道

ChannelHandler:可看作是處理ChannelPipeline中傳輸的資料的工具

ChannelHandlerContext:使得ChannelHandler可以和ChannelPipeline或其他handler進行互動等。

  在Netty中,當有連線請求時,會從EventLoopGroup中拿到一個EventLoop,EventLoop會繫結一個Channel,隨後做出具體的處理。每一個請求都有一個EventLoop去處理。EventLoop在這裡扮演的角色就相當於執行緒,而EventLoopGroup就相當於執行緒池,負責管理排程EventLoop。Netty處理連線請求的結構框圖如下:


  那麼在完成繫結Channel的操作後,具體怎麼處理資料呢?Netty中,將Channel的資料管道抽象為ChannelPipeline,訊息資料會在ChannelPipeline中流動和傳遞。ChannelPipeline是ChannelHandler的容器,持有I/O事件攔截器ChannelHandler的連結串列,負責對ChannelHandler的管理和排程。ChannelHandler可以看成處理ChannelPipeline中資料的工具,可以處理I/O事件或者攔截I/O操作, 並轉發給它所在ChannelPipeline中的下一個handler。我們可以方便地新增和刪除ChannelHandler來實現不同業務邏輯的處理。但是ChannelPipeline不是直接管理ChannelHandler的,而是通過ChannelHandlerContext來間接管理。Channel處理框圖如下:


  Netty中根據事件源頭的不同將handler分為兩種:InBound和OutBound。InBound事件通常由I/O執行緒觸發,例如TCP連線建立和關閉、讀事件等等,分別會觸發相應的handler的方法。而OutBound事件則一般由使用者主動發起的網路I/O操作,例如使用者發起的連線操作,繫結操作和訊息傳送操作等,也會分別觸發相應的方法。

  可以從上圖看到,Handler由headHandler到tailHandler組成了一條雙向連結串列,Handler鏈使用了責任鏈的設計模式(類似在web開發中的filter和攔截器),當事件傳入ChannelPipeline中後,會經過一個個handler的處理。當觸發ChannelRead事件的時候,訊息將從headHandler至tailHandler依次處理;當呼叫ChannelHandlerContext的write方法傳送訊息進行通訊時,訊息先從tailHandler開始,經過一系列handler處理後傳遞至headHandler,最終被新增到訊息傳送緩衝區後重新整理輸出。

  瞭解了Netty中大致的一些概念以及原理後,下篇部落格中我們來寫一個簡單的Netty伺服器與客戶端通訊的例子~

  那麼,點個贊再走?