【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )
文章目錄
- 一、 NIO 原生 API 弊端
- 二、 Netty 簡(jiǎn)介
- 三、 Netty 架構(gòu)
- 四、 Netty 版本
- 五、 Netty 線程模型
- 六、 阻塞 IO 線程模型
- 七、 反應(yīng)器 ( Reactor ) 模式引入
一、 NIO 原生 API 弊端
NIO 原生 API 的弊端 :
① NIO 組件復(fù)雜 : 使用原生 NIO 開(kāi)發(fā)服務(wù)器端與客戶端 , 需要涉及到 服務(wù)器套接字通道 ( ServerSocketChannel ) , 套接字通道 ( SocketChannel ) , 選擇器 ( Selector ) , 緩沖區(qū) ( ByteBuffer ) 等組件 , 這些組件的原理 , API 都要熟悉 , 才能進(jìn)行 NIO 的開(kāi)發(fā)與調(diào)試 , 之后還需要針對(duì)應(yīng)用進(jìn)行調(diào)試 , 優(yōu)化 ;
② NIO 開(kāi)發(fā)基礎(chǔ) : NIO 門(mén)檻略高 , 需要開(kāi)發(fā)者掌握 多線程 , 網(wǎng)絡(luò)編程 , 才能開(kāi)發(fā)并且優(yōu)化 NIO 網(wǎng)絡(luò)通信的應(yīng)用程序 ;
③ 原生 API 開(kāi)發(fā)網(wǎng)絡(luò)通信模塊的基本的傳輸處理 : 網(wǎng)絡(luò)傳輸不光是實(shí)現(xiàn)服務(wù)器端和客戶端的數(shù)據(jù)傳輸功能 , 還要處理各種異常情況 , 如 連接斷開(kāi)重連機(jī)制 , 網(wǎng)絡(luò)堵塞處理 , 異常處理 , 沾包處理 , 半包拼接處理 , 緩存機(jī)制 等方面的問(wèn)題 , 這是所有成熟的網(wǎng)絡(luò)應(yīng)用程序都要具有的功能 , 否則只能說(shuō)是入門(mén)級(jí)的 Demo ;
④ NIO BUG : NIO 本身存在一些 BUG , 如 Epoll , 導(dǎo)致 選擇器 ( Selector ) 空輪詢 , 在 JDK 1.7 中還沒(méi)有解決 ;
Netty 在 NIO 的基礎(chǔ)上 , 封裝了 Java 原生的 NIO API , 解決了上述問(wèn)題 ;
二、 Netty 簡(jiǎn)介
Netty 簡(jiǎn)介 : Netty 是一個(gè)網(wǎng)絡(luò)應(yīng)用框架 ;
① Netty 特點(diǎn) :
- 異步 : 可以開(kāi)發(fā) 阻塞 / 非阻塞 網(wǎng)絡(luò)通信功能 ;
- 基于事件驅(qū)動(dòng) : 底層封裝了可擴(kuò)展的事件模型 ;
② Netty 使用場(chǎng)景 : 快速開(kāi)發(fā) 高性能 的服務(wù)器端與客戶端應(yīng)用程序 ;
③ Netty 原理 : Netty 框架 對(duì) Java 的原生 NIO API 進(jìn)行了二次封裝 , 適用于各種類型的 IO 通信 ( 阻塞 / 非阻塞 ) , 兼容各種協(xié)議 ( TCP / UDP / HTTP ) ;
④ Netty 安全性 : Netty 支持 SSL / TSL / StartTSL 等安全協(xié)議 ;
⑤ Netty 社區(qū) : Netty 社區(qū)很活躍 , 截止到當(dāng)前 , Netty 一直在持續(xù)維護(hù) , 半個(gè)月前剛發(fā)布了新的版本 ;
2 . Netty 相關(guān)網(wǎng)站 :
① Netty 官網(wǎng) : https://netty.io/
② Netty 下載頁(yè)面 : https://netty.io/downloads.html
三、 Netty 架構(gòu)
Netty 架構(gòu) :
① 底層核心 : 零拷貝字節(jié)緩沖區(qū) , 通用的交互通信 API , 擴(kuò)展的事件模型 ;
② Netty 支持的協(xié)議和功能 : HTTP 協(xié)議 , WebSocket 協(xié)議 ( 開(kāi)發(fā)瀏覽器長(zhǎng)連接程序 ) , zlib / gzip 數(shù)據(jù)壓縮功能 , SSL 安全連接功能開(kāi)發(fā) , StartTLS 協(xié)議 , Google Protobuf 編碼解碼 , 大文件傳輸 , RTSP 協(xié)議 ;
③ 支持的傳輸服務(wù) : TCP / UDP 協(xié)議傳輸 , HTTP 隧道傳輸 ;
四、 Netty 版本
Netty 版本 :
① Netty 3.x : 版本太老 , 不推薦使用 ;
② Netty 4.x : 目前正在使用的版本 ( 必須使用這個(gè)版本 ) , 目前最新的是 netty-4.1.50 版本 ( 2020-05-13 ) ;
③ Netty 5.x : 由于出現(xiàn)重大 BUG , 已經(jīng)廢棄 , 不能使用 ;
五、 Netty 線程模型
1 . 現(xiàn)有的線程模型 : 主要分為 阻塞 IO 模型 , 反應(yīng)器模式 , 兩個(gè)大的類型 ;
① 阻塞 IO 模型 : 傳統(tǒng)的 BIO 模型 , 即阻塞 IO 模型 ;
② 反應(yīng)器 ( Reactor ) 模式 : 反應(yīng)器 ( Reactor ) 模式根據(jù) 反應(yīng)器 和 處理線程 數(shù)量進(jìn)行分類 , 又可以分為以下三類 :
- 單 反應(yīng)器 ( Reactor ) 單線程 模式
- 單 反應(yīng)器 ( Reactor ) 多線程 模式
- 主從 反應(yīng)器 ( Reactor ) 多線程 模式
上述 反相器 ( Reactor ) 模型分類都有相應(yīng)的模型支撐 ;
2 . Netty 線程模型 : Netty 的線程模型是在上面的 反應(yīng)器 ( Reactor ) 模式分類下的 主從反應(yīng)器 ( Reactor ) 多線程模型 的基礎(chǔ)上 , 進(jìn)行改進(jìn)而來(lái)的 ;
Reactor 對(duì)應(yīng)的中文翻譯 : 反應(yīng)器 / 分發(fā)者 / 通知者 ;
六、 阻塞 IO 線程模型
1 . 阻塞 IO 線程模型 :
① 場(chǎng)景說(shuō)明 : 這里以服務(wù)器端為例 , 前提是連接已經(jīng)建立 , 當(dāng)前處于數(shù)據(jù)傳輸階段 ;
② 主要用途 : 使用阻塞 IO 模型 , 獲取客戶端輸入數(shù)據(jù) ;
③ 阻塞獲取數(shù)據(jù) : 服務(wù)器端開(kāi)始處于阻塞狀態(tài) , 接收到客戶端數(shù)據(jù)后 , 解除阻塞 , 處理客戶端上傳的數(shù)據(jù) ;
④ 線程模型 : 基于阻塞獲取數(shù)據(jù) , 如果沒(méi)有數(shù)據(jù)到來(lái) , 則需要一直處于阻塞狀態(tài) , 因此 每個(gè)連接都需要一個(gè)獨(dú)立的線程處理對(duì)應(yīng)客戶端連接的數(shù)據(jù)交互 ;
2 . 阻塞 IO 模型弊端 :
① 客戶端 連接 線程 對(duì)應(yīng)關(guān)系 : 該模式下 , 每個(gè)客戶端都要維持一個(gè)連接 , 每個(gè)連接都需要占用一個(gè)線程資源處理數(shù)據(jù)交互 ;
② 資源消耗 : 如果客戶端數(shù)量非常大 , 如十萬(wàn)百萬(wàn)級(jí)別 , 服務(wù)器大并發(fā)處理壓力非常大 , 創(chuàng)建很多線程 , 消耗的系統(tǒng)資源巨大 ;
③ 資源浪費(fèi) : 如果服務(wù)器端與客戶端沒(méi)有數(shù)據(jù)交互 , 那么服務(wù)器端會(huì)阻塞的 read() 方法上 , 此時(shí)線程處于阻塞狀態(tài) , 但還占用著系統(tǒng)的資源 , 造成了資源的浪費(fèi) ;
阻塞 IO 模型 , 資源消耗大 , 浪費(fèi)也大 ;
下圖是 BIO 模型的示意圖 , 在該模型中每個(gè)客戶端都要占用服務(wù)器端的一個(gè)線程 ;
七、 反應(yīng)器 ( Reactor ) 模式引入
1 . 針對(duì) BIO 模型的 資源浪費(fèi) 的解決方案 : 線程 IO 復(fù)用模型 ;
① BIO 模型中的資源浪費(fèi) : 服務(wù)器端的線程 大部分時(shí)間都處于阻塞狀態(tài) , 沒(méi)有數(shù)據(jù)交互時(shí) , 還占用著線程資源 ;
② 單個(gè)線程為多個(gè)連接服務(wù) : 多個(gè)連接共用一個(gè)線程 , 在這個(gè)線程中監(jiān)聽(tīng)多個(gè)連接是否有數(shù)據(jù)寫(xiě)入 , 不用每個(gè)連接都各自占用一個(gè)線程阻塞監(jiān)聽(tīng) ;
③ 線程解除阻塞機(jī)制 : 多個(gè)連接中如果有某個(gè)連接收到數(shù)據(jù) , 該線程就會(huì) 解除監(jiān)聽(tīng)阻塞 , 開(kāi)始為有數(shù)據(jù)寫(xiě)入的連接服務(wù) ;
該模型中 , 一個(gè)線程為多個(gè)連接服務(wù) , 類似于 NIO 模型的機(jī)制 , 該機(jī)制就是之前講過(guò)的 在單個(gè)線程中使用 單個(gè)選擇器 ( Selector ) 阻塞監(jiān)聽(tīng)多個(gè)客戶端對(duì)應(yīng)的多個(gè)套接字通道 ( SocketChannel ) ;
( 該 反應(yīng)器模式 與 NIO 模型類似 , 但不是 NIO 模型 )
2 . 針對(duì) BIO 模型的 資源消耗 的解決方案 : 使用線程池機(jī)制 , 實(shí)現(xiàn)對(duì)線程資源的復(fù)用 ;
① BIO 模型中的資源消耗 : 每個(gè)客戶端都要建立一個(gè)對(duì)應(yīng)的連接 , 每個(gè)連接都要占用一個(gè)線程 , 這樣需要?jiǎng)?chuàng)建很多線程 ;
② 線程池機(jī)制復(fù)用線程 : 每個(gè)連接不再分配單獨(dú)的線程進(jìn)行處理 , 使用線程池機(jī)制分配線程資源 ;
③ 業(yè)務(wù)與線程的對(duì)應(yīng)關(guān)系 : 每個(gè)業(yè)務(wù)邏輯都可能分配給多個(gè)線程中的一個(gè) ( 不能同時(shí)分配多個(gè) ) , 每個(gè)線程可以承擔(dān)多個(gè)連接的業(yè)務(wù) ( 不能同時(shí)承擔(dān)多個(gè) ) , 其對(duì)應(yīng)關(guān)系是多對(duì)多的 ;
( 同一時(shí)刻 , 一個(gè)線程只能對(duì)應(yīng)一個(gè)連接的業(yè)務(wù) , 一個(gè)連接的業(yè)務(wù)邏輯也只能交給一個(gè)線程處理 )
總結(jié)
以上是生活随笔為你收集整理的【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Netty】零拷贝案例 ( trans
- 下一篇: 【Netty】反应器 Reactor 模