Java 200+ 面試題補充② Netty 模組

王磊的部落格發表於2019-03-08

讓我們每天都能看到自己的進步。老王帶你打造最全的 Java 面試清單,認真把一件事做到最好。

本文是前文《Java 最常見的 200+ 面試題》的第二個補充模組,第一模組為:《Java 200+ 面試題補充 ThreadLocal 模組》

1.Netty 是什麼?

Netty 是一款基於 NIO(Nonblocking I/O,非阻塞IO)開發的網路通訊框架,對比於 BIO(Blocking I/O,阻塞IO),他的併發效能得到了很大提高。難能可貴的是,在保證快速和易用性的同時,並沒有喪失可維護性和效能等優勢。

2.Netty 的特點是什麼?

  • 高併發:Netty 是一款基於 NIO(Nonblocking IO,非阻塞IO)開發的網路通訊框架,對比於 BIO(Blocking I/O,阻塞IO),他的併發效能得到了很大提高。
  • 傳輸快:Netty 的傳輸依賴於零拷貝特性,儘量減少不必要的記憶體拷貝,實現了更高效率的傳輸。
  • 封裝好:Netty 封裝了 NIO 操作的很多細節,提供了易於使用呼叫介面。

3.什麼是 Netty 的零拷貝?

Netty 的零拷貝主要包含三個方面:

  • Netty 的接收和傳送 ByteBuffer 採用 DIRECT BUFFERS,使用堆外直接記憶體進行 Socket 讀寫,不需要進行位元組緩衝區的二次拷貝。如果使用傳統的堆記憶體(HEAP BUFFERS)進行 Socket 讀寫,JVM 會將堆記憶體 Buffer 拷貝一份到直接記憶體中,然後才寫入 Socket 中。相比於堆外直接記憶體,訊息在傳送過程中多了一次緩衝區的記憶體拷貝。
  • Netty 提供了組合 Buffer 物件,可以聚合多個 ByteBuffer 物件,使用者可以像操作一個 Buffer 那樣方便的對組合 Buffer 進行操作,避免了傳統通過記憶體拷貝的方式將幾個小 Buffer 合併成一個大的 Buffer。
  • Netty 的檔案傳輸採用了 transferTo 方法,它可以直接將檔案緩衝區的資料傳送到目標 Channel,避免了傳統通過迴圈 write 方式導致的記憶體拷貝問題。

4.Netty 的優勢有哪些?

  • 使用簡單:封裝了 NIO 的很多細節,使用更簡單。
  • 功能強大:預置了多種編解碼功能,支援多種主流協議。
  • 定製能力強:可以通過 ChannelHandler 對通訊框架進行靈活地擴充套件。
  • 效能高:通過與其他業界主流的 NIO 框架對比,Netty 的綜合效能最優。
  • 穩定:Netty 修復了已經發現的所有 NIO 的 bug,讓開發人員可以專注於業務本身。
  • 社群活躍:Netty 是活躍的開源專案,版本迭代週期短,bug 修復速度快。

5.Netty 的應用場景有哪些?

典型的應用有:阿里分散式服務框架 Dubbo,預設使用 Netty 作為基礎通訊元件,還有 RocketMQ 也是使用 Netty 作為通訊的基礎。

6.Netty 高效能表現在哪些方面?

  • IO 執行緒模型:同步非阻塞,用最少的資源做更多的事。
  • 記憶體零拷貝:儘量減少不必要的記憶體拷貝,實現了更高效率的傳輸。
  • 記憶體池設計:申請的記憶體可以重用,主要指直接記憶體。內部實現是用一顆二叉查詢樹管理記憶體分配情況。
  • 串形化處理讀寫:避免使用鎖帶來的效能開銷。
  • 高效能序列化協議:支援 protobuf 等高效能序列化協議。

7.Netty 和 Tomcat 的區別?

  • 作用不同:Tomcat 是 Servlet 容器,可以視為 Web 伺服器,而 Netty 是非同步事件驅動的網路應用程式框架和工具用於簡化網路程式設計,例如TCP和UDP套接字伺服器。
  • 協議不同:Tomcat 是基於 http 協議的 Web 伺服器,而 Netty 能通過程式設計自定義各種協議,因為 Netty 本身自己能編碼/解碼位元組流,所有 Netty 可以實現,HTTP 伺服器、FTP 伺服器、UDP 伺服器、RPC 伺服器、WebSocket 伺服器、Redis 的 Proxy 伺服器、MySQL 的 Proxy 伺服器等等。

8.Netty 中有那種重要元件?

  • Channel:Netty 網路操作抽象類,它除了包括基本的 I/O 操作,如 bind、connect、read、write 等。
  • EventLoop:主要是配合 Channel 處理 I/O 操作,用來處理連線的生命週期中所發生的事情。
  • ChannelFuture:Netty 框架中所有的 I/O 操作都為非同步的,因此我們需要 ChannelFuture 的 addListener()註冊一個 ChannelFutureListener 監聽事件,當操作執行成功或者失敗時,監聽就會自動觸發返回結果。
  • ChannelHandler:充當了所有處理入站和出站資料的邏輯容器。ChannelHandler 主要用來處理各種事件,這裡的事件很廣泛,比如可以是連線、資料接收、異常、資料轉換等。
  • ChannelPipeline:為 ChannelHandler 鏈提供了容器,當 channel 建立時,就會被自動分配到它專屬的 ChannelPipeline,這個關聯是永久性的。

9.Netty 傳送訊息有幾種方式?

Netty 有兩種傳送訊息的方式:

  • 直接寫入 Channel 中,訊息從 ChannelPipeline 當中尾部開始移動;
  • 寫入和 ChannelHandler 繫結的 ChannelHandlerContext 中,訊息從 ChannelPipeline 中的下一個 ChannelHandler 中移動。

10.預設情況 Netty 起多少執行緒?何時啟動?

Netty 預設是 CPU 處理器數的兩倍,bind 完之後啟動。

11.Netty 支援哪些心跳型別設定?

  • readerIdleTime:為讀超時時間(即測試端一定時間內未接受到被測試端訊息)。
  • writerIdleTime:為寫超時時間(即測試端一定時間內向被測試端傳送訊息)。
  • allIdleTime:所有型別的超時時間。

最後

  • 如果大家想更深入的瞭解 Netty,推薦一本很不錯的掘金小冊給大家(掃描二維碼八折優惠)。

netty小冊

參考文件

blog.csdn.net/chenssy/art…

blog.csdn.net/summerZBH12…

blog.csdn.net/thinking_fi…

www.jianshu.com/p/a199ca28e…

blog.csdn.net/linuu/artic…

公眾號二維碼

往期文章推薦

Java 最常見的 200+ 面試題

程式設計師專屬精美簡歷合集——第二彈

相關文章