netty web 容器_Netty - 高性能网络应用框架常见面试题
作者:千鋒老魏
1.Netty 是什么?
Netty 是一款基于 NIO(Nonblocking I/O,非阻塞IO)開發(fā)的網(wǎng)絡(luò)通信框架,對比于 BIO(Blocking I/O,阻塞IO),他的并發(fā)性能得到了很大提高。難能可貴的是,在保證快速和易用性的同時,并沒有喪失可維護性和性能等優(yōu)勢。
2.Netty 的特點是什么?
高并發(fā):Netty 是一款基于 NIO(Nonblocking IO,非阻塞IO)開發(fā)的網(wǎng)絡(luò)通信框架,對比于 BIO(Blocking I/O,阻塞IO),他的并發(fā)性能得到了很大提高。
傳輸快:Netty 的傳輸依賴于零拷貝特性,盡量減少不必要的內(nèi)存拷貝,實現(xiàn)了更高效率的傳輸。
封裝好:Netty 封裝了 NIO 操作的很多細(xì)節(jié),提供了易于使用調(diào)用接口。
3.什么是 Netty 的零拷貝?
Netty 的零拷貝主要包含三個方面:
Netty 的接收和發(fā)送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接內(nèi)存進行 Socket 讀寫,不需要進行字節(jié)緩沖區(qū)的二次拷貝。如果使用傳統(tǒng)的堆內(nèi)存(HEAP BUFFERS)進行 Socket 讀寫,JVM 會將堆內(nèi)存 Buffer 拷貝一份到直接內(nèi)存中,然后才寫入 Socket 中。相比于堆外直接內(nèi)存,消息在發(fā)送過程中多了一次緩沖區(qū)的內(nèi)存拷貝。
Netty 提供了組合 Buffer 對象,可以聚合多個 ByteBuffer 對象,用戶可以像操作一個 Buffer 那樣方便的對組合 Buffer 進行操作,避免了傳統(tǒng)通過內(nèi)存拷貝的方式將幾個小 Buffer 合并成一個大的 Buffer。
Netty 的文件傳輸采用了 transferTo 方法,它可以直接將文件緩沖區(qū)的數(shù)據(jù)發(fā)送到目標(biāo) Channel,避免了傳統(tǒng)通過循環(huán) write 方式導(dǎo)致的內(nèi)存拷貝問題。
4.Netty 的優(yōu)勢有哪些?
使用簡單:封裝了 NIO 的很多細(xì)節(jié),使用更簡單。
功能強大:預(yù)置了多種編解碼功能,支持多種主流協(xié)議。
定制能力強:可以通過 ChannelHandler 對通信框架進行靈活地擴展。
性能高:通過與其他業(yè)界主流的 NIO 框架對比,Netty 的綜合性能最優(yōu)。
穩(wěn)定:Netty 修復(fù)了已經(jīng)發(fā)現(xiàn)的所有 NIO 的 bug,讓開發(fā)人員可以專注于業(yè)務(wù)本身。
社區(qū)活躍:Netty 是活躍的開源項目,版本迭代周期短,bug 修復(fù)速度快。
5.Netty 的應(yīng)用場景有哪些?
典型的應(yīng)用有:阿里分布式服務(wù)框架 Dubbo,默認(rèn)使用 Netty 作為基礎(chǔ)通信組件,還有 RocketMQ 也是使用 Netty 作為通訊的基礎(chǔ)。
6.Netty 高性能表現(xiàn)在哪些方面?
IO 線程模型:同步非阻塞,用最少的資源做更多的事。
內(nèi)存零拷貝:盡量減少不必要的內(nèi)存拷貝,實現(xiàn)了更高效率的傳輸。
內(nèi)存池設(shè)計:申請的內(nèi)存可以重用,主要指直接內(nèi)存。內(nèi)部實現(xiàn)是用一顆二叉查找樹管理內(nèi)存分配情況。
串形化處理讀寫:避免使用鎖帶來的性能開銷。
高性能序列化協(xié)議:支持 protobuf 等高性能序列化協(xié)議。
7.Netty 和 Tomcat 的區(qū)別?
作用不同:Tomcat 是 Servlet 容器,可以視為 Web 服務(wù)器,而 Netty 是異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用程序框架和工具用于簡化網(wǎng)絡(luò)編程,例如TCP和UDP套接字服務(wù)器。
協(xié)議不同:Tomcat 是基于 http 協(xié)議的 Web 服務(wù)器,而 Netty 能通過編程自定義各種協(xié)議,因為 Netty 本身自己能編碼/解碼字節(jié)流,所有 Netty 可以實現(xiàn),HTTP 服務(wù)器、FTP 服務(wù)器、UDP 服務(wù)器、RPC 服務(wù)器、WebSocket 服務(wù)器、Redis 的 Proxy 服務(wù)器、MySQL 的 Proxy 服務(wù)器等等。
8.Netty 中有那種重要組件?
Channel:Netty 網(wǎng)絡(luò)操作抽象類,它除了包括基本的 I/O 操作,如 bind、connect、read、write 等。
EventLoop:主要是配合 Channel 處理 I/O 操作,用來處理連接的生命周期中所發(fā)生的事情。
ChannelFuture:Netty 框架中所有的 I/O 操作都為異步的,因此我們需要 ChannelFuture 的 addListener()注冊一個 ChannelFutureListener 監(jiān)聽事件,當(dāng)操作執(zhí)行成功或者失敗時,監(jiān)聽就會自動觸發(fā)返回結(jié)果。
ChannelHandler:充當(dāng)了所有處理入站和出站數(shù)據(jù)的邏輯容器。ChannelHandler 主要用來處理各種事件,這里的事件很廣泛,比如可以是連接、數(shù)據(jù)接收、異常、數(shù)據(jù)轉(zhuǎn)換等。
ChannelPipeline:為 ChannelHandler 鏈提供了容器,當(dāng) channel 創(chuàng)建時,就會被自動分配到它專屬的 ChannelPipeline,這個關(guān)聯(lián)是永久性的。
9.Netty 發(fā)送消息有幾種方式?
Netty 有兩種發(fā)送消息的方式:
直接寫入 Channel 中,消息從 ChannelPipeline 當(dāng)中尾部開始移動;
寫入和 ChannelHandler 綁定的 ChannelHandlerContext 中,消息從 ChannelPipeline 中的下一個 ChannelHandler 中移動。
10.默認(rèn)情況 Netty 起多少線程?何時啟動?
Netty 默認(rèn)是 CPU 處理器數(shù)的兩倍,bind 完之后啟動。
11.Netty 支持哪些心跳類型設(shè)置?
readerIdleTime:為讀超時時間(即測試端一定時間內(nèi)未接受到被測試端消息)。
writerIdleTime:為寫超時時間(即測試端一定時間內(nèi)向被測試端發(fā)送消息)。
allIdleTime:所有類型的超時時間。
總結(jié)
以上是生活随笔為你收集整理的netty web 容器_Netty - 高性能网络应用框架常见面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flutter 图片路径_【Flutte
- 下一篇: easyui分页查询为什么会有下拉框_做