Netty

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 的不少細節,使用更簡單。工具

功能強大:預置了多種編解碼功能,支持多種主流協議。oop

定製能力強:能夠經過 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:全部類型的超時時間。

相關文章
相關標籤/搜索