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

讓咱們天天都能看到本身的進步。老王帶你打造最全的 Java 面試清單,認真把一件事作到最好。html

本文是前文《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+ 面試題

程序員專屬精美簡歷合集——第二彈

相關文章
相關標籤/搜索