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