基本概念
-
概念
Netty是由JBOSS提供的一個java NIO開源架構。Netty提供異步的、事件驅動的網絡應用程式架構和工具,用以快速開發高性能、高可靠性的網絡伺服器和用戶端程式。可實作的功能見下圖:
Netty初探-基本概念和相關類介紹基本概念相關類 - Netty vs Mina vs Grizzly
- Mina的設計理念最為優雅,Netty和Mina的主導作者是同一人。
- Mina出自于Apache,Netty出身于商業開源大亨Jboss,而Grizzly則出身于土鼈Sun公司。
- Netty作為NIO架構的優勢
- API使用簡單
- 功能強大,預置了多種編解碼功能,支援多種主流協定
- 定制能力強,可以通過ChannelHandler對通信架構進行靈活擴充
- 性能高
- 社群活躍
相關類
-
ByteBuf
使用資料傳輸,需要使用到緩沖區。ByteBuf是個Byte數組的緩沖區,基本功能和JDK的ByteBuffer一緻。
- 兩個指針維持緩沖區的讀寫操作:readerIndex辨別讀索引,writerIndex辨別寫索引。
- 順序讀操作(read)
- 順序寫操作(write)
- Discardable bytes,重用緩沖區,因為緩沖區的配置設定和釋放是個耗時的操作。
- clear操作,并不是清空緩沖區内容本身,而是将readerIndex和writerIndex還原為初始配置設定值。
- Mark和Rest,復原操作實作,備份readerIndex、WriterIndex
- 查找操作
- Derived buffers,類似于資料庫的視圖。duplicate、copy、slice
- 轉換為标準的ByteBuffer
- 随機讀寫(set和get)
- ByteBuf類圖
Netty初探-基本概念和相關類介紹基本概念相關類 - 堆記憶體:記憶體的配置設定和回收速度快,被JVM自動回收。
- 直接記憶體:與Socket Channel通信,少了一次記憶體複制,速度比堆快。
- 基于對象池的ByteBuf和普通ByteBuf
- ByteBuf相關輔助類
- ByteBufHolder,是ByteBuf的容器,對ByteBuf進行包裝和抽象。
- ByteBufAllocator,位元組緩沖區配置設定器:基于記憶體池和普通的。
- CompositeByteBuf,将多個ByteBuf的執行個體組裝到一起,形成一個統一的視圖。
- ByteBufUtil,提供了一些靜态方法用于操作ByteBuf對象。例如字元串的編碼和解碼。
-
Channel 和 Unsafe
Channel用于異步I/O操作,Unsafe是個内部接口,聚合在Channel中協助進行網絡讀寫相關的操作。
-
ChannelPipeline和ChannelHandler
類似于Servlet和Filter過濾器,是職責鍊模式的一種變形,主要是為了友善事件的攔截和使用者業務邏輯的定制。将Channel的資料管道抽象為ChannelPipeline,消息在ChannelPipeline中流動和傳遞,ChannelPipeline持有I/O事件攔截器ChannelHandler的連結清單,由ChannelHandler對I/O事件進行攔截和處理,可以友善地通過新增和删除ChannelHandler來實作不同的業務邏輯定制。
- inbound事件通常由I/O線程觸發(fire),outbound事件通常由使用者主動發起的網絡I/O操作。
- 使用者不需要自己建立pipeline,因為使用ServerBootstrap和Bootstrap啟動後,Netty會為每個Channel連接配接建立一個獨立的pipeline,使用者隻需要将自定義的攔截器加入到pipeline中即可。
- ChannelHandlerAdapter
- ByteToMessageDecoder:ByteBuf解碼為業務POJO對象
- MessageToMessageDecoder:Netty的二次解碼器,将一個對象二次解碼為其他對象。
- LengthFieldBasedFrameDecoder:半包解碼器
- 類圖
Netty初探-基本概念和相關類介紹基本概念相關類
-
EventLoop 和EventLoopGroup
線程模型,Netty架構的主要線程就是I/O線程,被精心設計,即提升了架構的并發性性能,又在很大程度避免鎖,局部實作了無鎖化機制。
- Reactor單線程模型,異步非阻塞I/O,理論上一個線程可以獨立處理所有I/O相關的操作。
- Reactor多線程模型
Netty初探-基本概念和相關類介紹基本概念相關類 - Acceptor線程:監聽服務端,接受用戶端的TCP連接配接請求,專門的NIO線程。
- 網絡I/O操作
- 一個NIO線程可以處理N條鍊路,但是一個鍊路隻對應一個NIO線程,防止并發操作的問題。
- -
-
主從Reactor多線程模型
NIO線程池的引入。
-
Netty線程模型
并不是一成不變,取決于使用者的啟動參數配置。
Netty初探-基本概念和相關類介紹基本概念相關類 - NioEventLoop,需要處理I/O事件,是以必須聚合多路複用其Selector。
Netty初探-基本概念和相關類介紹基本概念相關類
-
Future和Promise
Future用于擷取異步操作的結果
ChannelFuture有兩種狀态:upcompleted和completed;ChannelFuture可以同時增加一個或多個GenericFutureListener。需要注意的是,不要在ChannelHandler中調用ChannelFuture的await()方法,否則會導緻死鎖。如果I/O線程和使用者線程是同一個線程,就會導緻I/O線程等待自己通知作業系統,屬于自己把自己挂死。
Promise是可寫的Future,對Future進行擴充,用于設定I/O操作的結果。強烈建議通過增加監聽器Listener的方式接受異步I/O操作結果的通知,而不是調用wait或者sync阻塞使用者線程。