1. 程式人生 > >netty原始碼解解析(4.0)-1 核心架構

netty原始碼解解析(4.0)-1 核心架構

netty是java開源社群的一個優秀的網路框架。使用netty,我們可以迅速地開發出穩定,高效能,安全的,擴充套件性良好的伺服器應用程式。netty封裝簡化了在伺服器開發領域的一些有挑戰性的問題:jdk nio的使用;多執行緒併發;擴充套件性。它還提供了多種應用層協議的支援:http/https/websock, protobuf, 自定義協議, 簡化了伺服器協議的開發。 netty是一個基於事件驅動的框架,它把事件分成兩種型別:輸入事件(inbound)和輸出事件(outbound), 整個框架都是圍繞事件處理進行設計的,以下是netty的核心架構:

上圖中涉及到了netty的六個核心物件: Channel: 一個I/O操作的物件,所有的inbound事件都是由Channel產生,outbound事件最終都會有Channel處理(如果outbound事件沒有被使用者註冊的handler丟棄的話)。 ChannelPipeline: 有一個ChannelPipeline例項屬於一個Channel例項,它是事件傳播的管道,從Channel例項接收inbound事件,把outbound事件提交給Channel。 ChannelHandlerContext: 這是一個雙向連結串列結構,它的多個例項組成了一個雙向連結串列,並有ChannelPipeline負責維護。 在ChannelPipeline的預設實現中,這個鏈預設添加了Head和Tail節點, Head節點同時實現ChannelOutboundHandler和ChannelInboundHandler介面,Head節點比較特殊,它會最終把事件交給Channel處理。Tail節點實現了ChannelInboundHandler介面,使用Channel觸發的inbound事件會首先傳到這裡處理。 ChannelHandler
: 這裡是netty的擴充套件介面,也是真正實現伺服器通訊協議和業務功能功能的地方。ChannelHandler有兩種型別:處理輸入事件的ChannelinboundHandler和處理輸出事件的ChannelOutboundHandler。使用者的ChannelHandler要實現這兩個介面中的任意一個或全部。當用戶向ChannelPipeline註冊自己的ChannelHandler時,ChannelPipleline會建立一個相應的ChannelHandlerContext例項,並讓這個例項持有使用者註冊的ChannelHandler例項。然後把這個例項新增到雙向連結串列中。使用者註冊的ChannelHandler的型別決定了這個例項的型別,進而決定了這個例項能夠處理的事件型別。 EventLoopGroup
: 在Channel上執行I/O的執行緒組,netty把這個執行緒組中的執行緒定義為I/O執行緒,後面會講到,有些特定的事件必須在I/O執行緒中處理。 EventExecutorGroup: 用來執行ChannelHandlerContext和ChannelHandler中回撥方法的執行緒。在使用者向ChannelPipeline中註冊一個ChannelHanlder時,如果指定了一個EventExecutorGroup,那麼它和它對應的ChannelHandlerContext都會在指定的EventExecutorGroup執行,否則,在Channel的EventLoopGroup中執行。   以上是netty核心架構中的核心核心物件,netty提供的所有能力都是通過對這些核心物件的擴充套件實現的。例如: NioSocketChannel和NioServerSocketChannel擴充套件了Channel, NioEventLoopGroup擴充套件了EventLoopGroup, netty通過這一組擴充套件實現了對JDK NIO的封裝。 ProtoBufDecoer和ProtoBufEncoder擴充套件ChannelHandler實現了對potobuf協議的支援。 HttpObjectDecoder和HttpObjectEncoder擴充套件ChannelHandler實現了對http協議的支援。 此外開發者還可通過對EventLoopGroup和EventExecutorGroup擴充套件實現不一樣的執行緒模型,滿足特定業務場景的需求。 還可以對ChannelPipleline和ChannelHandlerContext擴充套件實現自定義的事件傳遞和處理流程。