天天看點

Netty初探-基本概念和相關類介紹基本概念相關類

基本概念

  • 概念

    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阻塞使用者線程。

繼續閱讀