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

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

coder style out ava 默認 mage 網絡框架 分享圖片 輸入

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擴展實現自定義的事件傳遞和處理流程。

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