netty in action筆記

Netty 網絡抽象的代表:
Channel—Socket;
EventLoop—控制流、多線程處理、併發;
ChannelFuture—異步通知。


Channel 接口
基本的I/O 操作(bind()、connect()、read()和write())依賴於底層網絡傳輸所提供的原語。
Channel 也是擁有許多預定義的、專門化實現的廣泛類層次結構的根,下面是一個簡短的部分清單
EmbeddedChannel;
LocalServerChannel;
NioDatagramChannel;
NioSctpChannel;
NioSocketChannel。
    OioServerSocketChannel 允許阻塞模式(舊的I/O)


EventLoop 接口
EventLoop 定義了Netty 的核心抽象,用於處理連接的生命週期中所發生的事件。
一個EventLoopGroup 包含一個或者多個EventLoop;
一個EventLoop 在它的生命週期內只和一個Thread 綁定;
所有由EventLoop 處理的I/O 事件都將在它專有的Thread 上被處理;
一個Channel 在它的生命週期內只註冊於一個EventLoop;
一個EventLoop 可能會被分配給一個或多個Channel。


ChannelFuture 接口
Netty 中所有的I/O 操作都是異步的。Netty 提供了ChannelFuture 接口,其addListener()方法註冊了一個ChannelFutureListener,以
便在某個操作完成時(無論是否成功)得到通知。


ChannelHandler 和ChannelPipeline
管理數據流以及執行應用程序處理邏輯的組件。
ChannelHandler,它充當了所有處理入站和出站數據的應用程序邏輯的容器。


ChannelPipeline 提供了ChannelHandler 鏈的容器,並定義了用於在該鏈上傳播入站
和出站事件流的API。當Channel 被創建時,它會被自動地分配到它專屬的ChannelPipeline。
ChannelHandler 安裝到ChannelPipeline 中的過程如下所示:
一個ChannelInitializer的實現被註冊到了ServerBootstrap中①;
當ChannelInitializer.initChannel()方法被調用時,ChannelInitializer
    將在ChannelPipeline 中安裝一組自定義的ChannelHandler;
ChannelInitializer 將它自己從ChannelPipeline 中移除。


在Netty 中,有兩種發送消息的方式。你可以直接寫到Channel 中,也可以寫到和Channel-
Handler相關聯的ChannelHandlerContext 對象中。前一種方式將會導致消息從Channel-
Pipeline 的尾端開始流動,而後者將導致消息從ChannelPipeline 中的下一個Channel-
Handler 開始流動。


零拷貝
零拷貝(zero-copy)是一種目前只有在使用NIO 和Epoll 傳輸時纔可使用的特性。它使你可以快速
高效地將數據從文件系統移動到網絡接口,而不需要將其從內核空間複製到用戶空間,其在像FTP 或者
HTTP 這樣的協議中可以顯著地提升性能。但是,並不是所有的操作系統都支持這一特性。特別地,它對
於實現了數據加密或者壓縮的文件系統是不可用的——只能傳輸文件的原始內容。反過來說,傳輸已被
加密的文件則不是問題。


ChannelHandler 的典型用途包括:
將數據從一種格式轉換爲另一種格式;
提供異常的通知;
提供Channel 變爲活動的或者非活動的通知;
提供當Channel 註冊到EventLoop 或者從EventLoop 註銷時的通知;
提供有關用戶自定義事件的通知。


ChannelPipeline 實現了一種常見的設計模式—攔截過濾器


SCTP 流控制傳輸協議 /UDT 協議  /STARTTLS 協議


ByteBuf API 的優點:
它可以被用戶自定義的緩衝區類型擴展;
通過內置的複合緩衝區類型實現了透明的零拷貝;
容量可以按需增長(類似於JDK 的StringBuilder);
在讀和寫這兩種模式之間切換不需要調用ByteBuffer 的flip()方法;
讀和寫使用了不同的索引;
支持方法的鏈式調用;
  支持引用計數;
支持池化。


直接緩衝區的主要缺點是,相對於基於堆的緩衝區,它們的分配和釋放都較爲昂貴。如果你
正在處理遺留代碼,你也可能會遇到另外一個缺點:因爲數據不是在堆上,所以你不得不進行一
次複製,如代碼清單5-2 所示


表5-6 ByteBufHolder 的操作
名 稱 描 述
content()   返回由這個ByteBufHolder 所持有的ByteBuf
copy()      返回這個ByteBufHolder 的一個深拷貝,包括一個其所包含的ByteBuf 的非共享拷貝
duplicate() 返回這個ByteBufHolder 的一個淺拷貝,包括一個其所包含的ByteBuf 的共享拷貝


Netty提供了兩種ByteBufAllocator的實現:PooledByteBufAllocator和Unpooled-
ByteBufAllocator。前者池化了ByteBuf的實例以提高性能並最大限度地減少內存碎片。
後者的實現不池化ByteBuf實例,並且在每次它被調用時都會返回一個新的實例。
Netty默認使用了PooledByteBufAllocator,通過Channel-
Config API或者在引導你的應用程序時指定一個不同的分配器來更改。


ByteBufUtil 類    
hexdump(),它以十六進制的表示形式打印ByteBuf 的內容。
boolean equals(ByteBuf, ByteBuf),它被用來判斷兩個ByteBuf實例的相等性。


ChannelHandlerContext 代表了ChannelHandler 和ChannelPipeline 之間的關
聯,每當有ChannelHandler 添加到ChannelPipeline 中時,都會創建ChannelHandler-
Context。ChannelHandlerContext 的主要功能是管理它所關聯的ChannelHandler 和在
同一個ChannelPipeline 中的其他ChannelHandler 之間的交互。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章