您現在的位置是:網站首頁> 內容頁

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

  • 寶運萊手機版登錄
  • 2019-03-25
  • 411人已閱讀
簡介netty是java開源社區的一個優秀的網絡框架。使用netty,我們可以迅速地開發出穩定,高性能,安全的,擴展性良好的服務器應用程序。netty封裝簡化了在服務器開發領域的一些有挑戰
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擴展實現自定義的事件傳遞和處理流程。

?

文章評論

Top 大乐购群