Netty前置基礎知識之BIO、NIO以及AIO理論詳細解析和實戰案例

前言

Netty是什么?

Netty 是一個基于 Java 的 ?高性能異步事件驅動網絡應用框架,主要用于快速開發可維護的協議服務器和客戶端。它簡化了網絡編程的復雜性,特別適合構建需要處理海量并發連接、低延遲和高吞吐量的分布式系統。

1)Netty 是由JBOSS提供的一個 Java開源框架,現為 Github上的獨立項目。

2)Netty 是一個異步的、基于事件驅動的網絡應用框架,用以快速開發高性能、高可靠性的網絡 IO程序。

3)Netty主要針對在TCP協議下,面向Clients端的高并發應用,或者Peer-to-Peer場景下的大量數據持續傳輸的應用。

4)Netty本質是一個NIO框架,適用于服務器通訊相關的多種應用場景要透徹理解Netty , 需要先學習 NIO, 這樣我們才能閱讀 Netty 的源碼5)

Netty的實現底層邏輯如下圖所示,其中底層通信協議為TCP/IP,其中JVM層主要使用到的是java的IO編程。
在這里插入圖片描述

Netty的應用場景

Netty 是一個高性能、異步事件驅動的網絡框架,憑借其靈活性和高效性,被廣泛應用于多種需要處理高并發、低延遲網絡通信的場景。以下是 Netty 的典型應用場景及實際案例:


1. RPC 框架(遠程過程調用)

Netty 是構建 RPC 框架的核心底層組件,用于實現服務間的高效通信。

  • 特點:支持自定義協議、序列化、長連接復用,滿足微服務間高性能通信需求。
  • 典型案例
    • Apache Dubbo:國內廣泛使用的 RPC 框架,基于 Netty 實現服務間的異步通信。
    • gRPC-Java:Google 的 gRPC 在 Java 生態中默認使用 Netty 作為傳輸層。
    • Elasticsearch:節點間通信和客戶端 SDK 使用 Netty 處理分布式請求。

2. 消息隊列(Message Queue)

Netty 用于消息代理(Broker)與生產/消費者之間的高效數據傳輸。

  • 特點:支持海量連接、低延遲消息投遞,適合實時消息系統。
  • 典型案例
    • Kafka:Broker 與客戶端(Producer/Consumer)的通信基于 Netty。
    • RocketMQ:NameServer 和 Broker 之間的通信依賴 Netty。
    • Pulsar:通過 Netty 實現多協議支持(如 MQTT、WebSocket)。

3. API 網關與 Web 服務

Netty 可構建高性能的 API 網關,處理 HTTP/WebSocket 等協議的高并發請求。

  • 特點:支持動態路由、負載均衡、SSL 卸載,適合入口流量轉發。
  • 典型案例
    • Spring Cloud Gateway:可通過 Netty 實現異步非阻塞的網關邏輯。
    • Netflix Zuul 2.x:基于 Netty 實現異步處理,提升吞吐量。
    • 自研網關:如電商平臺的統一接入層,處理千萬級 QPS 的 HTTP 請求。

4. 物聯網(IoT)與長連接服務

Netty 擅長管理海量設備長連接,支持低功耗協議(如 MQTT、CoAP)。

  • 特點:心跳保活、二進制協議優化、資源占用低。
  • 典型案例
    • 智能家居:設備通過 MQTT 協議上報數據,Netty 處理百萬級并發連接。
    • 車聯網(IoV):車輛與云端通信,支持 TCP/UDP 雙協議。
    • 工業物聯網:PLC 設備監控,實時傳輸傳感器數據。

5. 實時通信系統

Netty 支持 WebSocket、UDP 等協議,適用于即時聊天、音視頻傳輸等場景。

  • 特點:低延遲、高吞吐,支持自定義編解碼。
  • 典型案例
    • 即時通訊(IM):如企業微信、釘釘的消息推送服務。
    • 在線游戲:MMORPG 的實時交互(如技能釋放、位置同步)。
    • 直播彈幕:通過 WebSocket 實現實時彈幕互動。

6. 金融交易系統

金融領域對低延遲、高可靠性要求極高,Netty 是關鍵基礎設施。

  • 特點:零拷貝、線程模型可控,支持毫秒級交易處理。
  • 典型案例
    • 證券交易系統:股票行情推送、訂單撮合引擎。
    • 支付系統:支付寶/微信支付的異步通知處理。
    • 風控系統:實時分析用戶行為,觸發風控規則。

7. 文件傳輸與流媒體

Netty 支持大文件分片傳輸、流媒體推送(如 HLS、RTMP)。

  • 特點:內存零拷貝、動態流控,避免 OOM。
  • 典型案例
    • 視頻直播平臺:通過 RTMP 協議傳輸音視頻流。
    • 云存儲服務:大文件斷點續傳(如阿里云 OSS)。
    • P2P 文件分發:BitTorrent 協議的服務器端實現。

8. 協議轉換與網關

Netty 可實現跨協議適配,如 HTTP 到 TCP、MQTT 到 WebSocket 的轉換。

  • 典型案例
    • 工業協議網關:將 Modbus、OPC UA 等工業協議轉換為 RESTful API。
    • 車聯網協議適配:將車輛 CAN 總線數據轉發到云端。

Netty 的適用場景總結

場景Netty 的優勢
高并發連接單機支持百萬級長連接,內存占用低。
低延遲通信異步非阻塞模型,減少線程切換開銷。
自定義協議靈活的 Pipeline 機制,輕松實現私有協議編解碼。
跨語言互通支持 HTTP/2、gRPC、WebSocket 等標準協議,兼容多語言服務。
資源可控性可配置 EventLoopGroup 和線程模型,避免資源競爭。

何時選擇 Netty?

  • 適合:需要處理海量連接、低延遲、高吞吐的場景(如物聯網、金融交易)。
  • 不適合:簡單 HTTP 服務(可直接用 Tomcat/Spring WebFlux)、非網絡密集型應用。

Netty 的靈活性和性能使其成為構建現代分布式系統的“網絡層瑞士軍刀”。如果需要進一步了解如何基于 Netty 實現某個場景(如 IoT 長連接),可以繼續提問!

三、IO模型介紹與總結

I/O 模型是操作系統處理輸入輸出操作的機制,直接影響應用程序的性能和并發能力。常見的 I/O 模型包括 BIO(同步阻塞)、NIO(同步非阻塞)和 AIO(異步非阻塞)。以下是它們的詳細對比和應用場景分析:


1. BIO(Blocking I/O)同步阻塞模型

BIO的網絡模型如下所示:
在這里插入圖片描述

工作原理
  • 同步:應用程序主動發起 I/O 操作,必須等待數據準備好并傳輸完成。
  • 阻塞:線程在等待 I/O 完成期間會被掛起,無法執行其他任務。
流程
客戶端請求 → 服務端線程被阻塞,等待數據到達 → 數據到達后,線程讀取并處理 → 返回響應。
BIO編程簡單流程

1)服務器端啟動一個ServerSocket
2)客戶端啟動Socket對服務器進行通信,默認情況下服務器端需要對每個客戶 建立一個線程與之通訊
3)客戶端發出請求后,先咨詢服務器是否有線程響應,如果沒有則會等待,或者被拒絕
4)如果有響應,客戶端線程會等待請求結束后,在繼續執行。
源碼如下所示:

如果是mac系統需要安裝,telnet工具。telnet安裝如下:

brew install telnet
package bio;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class BIOService {public static void main(String[] args) throws IOException {// 線程池機制// 1.創建線程池// 2.如果有客戶端連接,就創建一個線程與之通信(單獨寫一個方法)ExecutorService executor = Executors.newCachedThreadPool();ServerSocket serverSocket = new ServerSocket(6666);System.out.println("Listening on port 6666");while (true) {// 監聽final Socket socket = serverSocket.accept();executor.execute(new Runnable() {public void run() {// 可以和客戶端通信handler(socket);}});}}//編寫一個handler方法public static void handler(Socket socket) {byte[] bytes = new byte[1024];// 通過管道獲取輸入流try {InputStream inputStream = socket.getInputStream();// 循環讀取客戶端發送的數據while (true) {int read = inputStream.read(bytes);if (read != -1) {// 輸出客戶端發送的數據System.out.println(new String(bytes, 0, read));}else {break;}}} catch (IOException e) {throw new RuntimeException(e);}finally {System.out.println("Read bytes from socket");try {socket.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}

執行上述代碼后,等于開啟一個服務端等待連接,然后客戶端連接的話需要執行下面的命令:

telnet host[服務端地址] port[服務端端口] 
特點
  • 優點:編程簡單,適合連接數少且穩定的場景。
  • 缺點:線程資源消耗大,高并發時性能急劇下降(例如:每連接一個線程)。
典型應用
  • 傳統數據庫連接(如 JDBC)。
  • 低并發 HTTP 服務器。

2. NIO(Non-blocking I/O)同步非阻塞模型

NIO視為網絡模型如下所示,Selector可看作是一個多路復用器,模型中的通道(或者連接)是通過多路復用器維護的。Selector不斷的輪詢每個連接。Selector是一個線程連接的,所以一個線程管理多個連接。一個線程對應可以Selector,所以可以線程對應多個channel。一個Channel對應一個Buffer。
在這里插入圖片描述

核心組件
  • Channel:雙向通信管道(類似流,但可讀寫同時進行)。
    Channel是雙向的,
  • Buffer:數據容器,所有操作基于緩沖區。
  • Selector:多路復用器,監聽多個 Channel 的事件(如連接、讀、寫)。一個線程對應多個channel(連接Selector 對對應一個線程,
工作原理
  • 非阻塞:線程發起 I/O 操作后,立即返回,無需等待。
  • 事件驅動:通過 Selector 輪詢就緒的 Channel,集中處理活躍連接。
流程
1. 線程注冊 Channel 到 Selector,監聽感興趣的事件(如讀、寫)。
2. Selector 輪詢就緒的 Channel,返回就緒事件列表。
3. 線程處理就緒事件(如讀取數據到 Buffer,或寫入數據)。
特點
  • 優點:單線程可管理大量連接(高并發),資源利用率高。
  • 缺點:編程復雜度高,需手動處理緩沖區和事件分發。
典型應用
  • Netty、Redis、Kafka 等高性能框架。
  • 聊天服務器、API 網關。

3. AIO(Asynchronous I/O)異步非阻塞模型

工作原理
  • 異步:應用程序發起 I/O 操作后,立即返回,無需等待。
  • 回調機制:I/O 操作完成后,系統主動通知應用程序。
流程
1. 應用程序發起異步 I/O 請求,線程立即繼續執行其他任務。
2. 操作系統完成 I/O 后,通過回調函數或 Future 對象通知應用。
特點
  • 優點:真正的異步,線程完全解放,適合長耗時操作。
  • 缺點:編程復雜度高,操作系統支持有限(如 Linux AIO 不夠成熟)。
典型應用
  • 文件讀寫(如 Java 7+ 的 AsynchronousFileChannel)。
  • 數據庫驅動(如某些 NoSQL 的異步客戶端)。

三者的核心區別

特性BIONIOAIO
同步/異步同步同步異步
阻塞/非阻塞阻塞非阻塞非阻塞
線程模型一連接一線程少量線程管理多連接回調機制,線程不等待
資源消耗
適用場景低并發、穩定連接高并發、短連接長耗時操作(如文件 I/O)

同步 vs 異步

  • 同步:應用主動發起 I/O 操作,需等待結果(如打電話)。
  • 異步:應用發起 I/O 操作后,由系統通知結果(如發郵件)。

阻塞 vs 非阻塞

  • 阻塞:線程在等待 I/O 完成期間無法做其他事情(如等待水燒開時干等)。
  • 非阻塞:線程在等待 I/O 時可處理其他任務(如燒水時洗菜)。

—### 實際應用選擇

  1. BIO:適合連接數少且穩定的場景(如傳統企業應用)。
  2. NIO:適合高并發、短連接場景(如即時通訊、API 網關)。
  3. AIO:適合長耗時操作且需要完全異步的場景(如大文件處理)。

本章小結

  • NIO 是當前主流:通過事件驅動和多路復用,解決了 BIO 的高并發瓶頸(如 Netty)。
  • AIO 實際應用較少:因操作系統支持和編程復雜度限制,多數場景下 NIO + 多線程模型更高效。
  • 選擇依據:根據并發量、I/O 類型(長/短連接)、編程成本綜合權衡。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76999.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76999.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76999.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TIM輸入捕獲知識部分

越往左,頻率越高;越往右,頻率越低。【越緊湊,相同時間,次數越多】 計算頻率的方法:測評法、測周法、中界頻率。 頻率的定義:1s內出現了多少個重復的周期 測評法就是從頻率的定義出發的&#…

4.4 記憶機制與上下文管理:短期與長期記憶的設計與應用

記憶機制與上下文管理已成為智能代理(Agent)系統實現高效、智能化行為的核心技術。記憶機制通過短期記憶(Short-Term Memory, STM)和長期記憶(Long-Term Memory, LTM)支持Agent存儲、檢索和利用信息&#x…

深入了解遞歸、堆與棧:C#中的內存管理與函數調用

在編程中,理解如何有效地管理內存以及如何控制程序的執行流程是每個開發者必須掌握的基本概念。C#作為一種高級編程語言,其內存管理和函數調用機制包括遞歸、堆與棧。本文將詳細講解這三者的工作原理、用途以及它們在C#中的實現和應用。 1. 遞歸 (Recur…

leetcode day 35 01背包問題 416+1049

0-1背包問題 &#xff08;1&#xff09;第一種情況&#xff1a;二維dp[i][j]數組 dp[i][j]表示[0,i]的物品放入容量為j背包的最大價值 不放物品i,dp[i][j]dp[i-1][j] 放物品i,dp[i][j]dp[i-1][j-w[i]]v[i] 遞推公式為&#xff1a; dp[i][j]dp[i-1][j];//不放 if(w[i]<j)dp…

算法時代的“摩西十誡”:AI治理平臺重構數字戒律

一、引言 數字時代的狂飆突進中&#xff0c;人工智能&#xff08;AI&#xff09;正以顛覆性的力量重塑人類社會。從醫療診斷到金融決策&#xff0c;從智能制造到輿論傳播&#xff0c;AI的觸角已延伸至每個角落。 然而&#xff0c;斯坦福大學《2024年人工智能指數報告》揭示的…

上岸率85%+,25西電先進材料與納米科技學院(考研錄取情況)

1、先進材料與納米科技學院各個方向 2、先進材料與納米科技學院近三年復試分數線對比 學長、學姐分析 由表可看出&#xff1a; 1、材料科學與工程25年相較于24年上升10分&#xff0c;為290分 2、材料與化工&#xff08;專碩&#xff09;25年相較于24年下降20分&#xff0c;為…

Tomcat Web應用(Ubuntu 18.04.6 LTS)部署筆記

一、前言 本文與【MySQL 8&#xff08;Ubuntu 18.04.6 LTS&#xff09;安裝筆記】和【JDK&#xff08;Ubuntu 18.04.6 LTS&#xff09;安裝筆記】同批次&#xff1a;先搭建數據庫&#xff0c;再安裝JVM&#xff0c;后面就是部署Web應用&#xff1a;典型的單機部署。 ??本著善…

Datawhale AI春訓營——用AI幫助老人點餐

詳細內容見官網鏈接&#xff1a;用AI幫助老人點餐-活動詳情 | Datawhale

17.第二階段x64游戲實戰-人工遍歷二叉樹結構

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;16.第二階段x64游戲實戰-分析二叉樹結構 上一個內容里把二叉樹的結構寫了寫&am…

Oracle 11g RAC ASM磁盤組剔盤、加盤實施過程

環境&#xff1a;AIX6.1 Oracle RAC 11.2.0.3 前期準備&#xff1a; 1.查看DG磁盤組空間情況&#xff1a; –查看DG磁盤組空間情況&#xff1a; ASMCMD> lsdg State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Of…

Java—— 正則表達式 方法及捕獲分組

識別正則表達式的方法 方法名說明public String[] matches(String regex) 判斷字符串是否滿足 正則表達式的規則 public string replaceAll(String regex,string newstr) 按照正則表達式的 規則進行替換 public string[] split(String regex) 按照正則表達式的 規則切割字符串…

達夢并行收集統計信息

達夢收集統計信息速度如何&#xff1f; 答&#xff1a;1分鐘1G 大庫收集起來可能比較慢&#xff0c;想并行收集需要一些條件 3個參數先了解一下 我把max_parallel_degree改為16 相關說明可以看一下 對一個3G的表收集 收集方法 DBMS_STATS.GATHER_TABLE_STATS( TEST,T1,…

PyTorch 實戰:Transformer 模型搭建全解析

Transformer 作為一種強大的序列到序列模型&#xff0c;憑借自注意力機制在諸多領域大放異彩。它能并行處理序列&#xff0c;有效捕捉上下文關系&#xff0c;其架構包含編碼器與解碼器&#xff0c;各由多層組件構成&#xff0c;涉及自注意力、前饋神經網絡、歸一化和 Dropout 等…

網頁不同渲染方式的應對與反爬機制的處理——python爬蟲

文章目錄 寫在前面爬蟲習慣web 網頁渲染方式服務器渲染客戶端渲染 反爬機制使用session對象使用cookie讓請求頭信息更豐富使用代理和隨機延遲 寫在前面 本文是對前兩篇文章所介紹的內容的補充&#xff0c;在了解前兩篇文章——《爬蟲入門與requests庫的使用》和《BeautifulSou…

RK3588平臺用v4l工具調試USB攝像頭實踐(亮度,飽和度,對比度,色相等)

目錄 前言:v4l-utils簡介 一&#xff1a;查找當前的攝像頭設備 二&#xff1a;查看當前攝像頭支持的v4l2-ctl調試參數 三根據提示設置對應參數&#xff0c;在提示范圍內設置 四&#xff1a;常用調試命令 五:應用內執行命令方法 前言:v4l-utils簡介 v4l-utils工具是由Linu…

Spring Security基礎入門

本入門案例主要演示Spring Security在Spring Boot中的安全管理效果。為了更好地使用Spring Boot整合實現Spring Security安全管理功能&#xff0c;體現案例中Authentication&#xff08;認證&#xff09;和Authorization&#xff08;授權&#xff09;功能的實現&#xff0c;本案…

Trae+DeepSeek學習Python開發MVC框架程序筆記(二):使用4個文件實現MVC框架

修改上節文件&#xff0c;將test2.py拆分為4個文件&#xff0c;目錄結構如下&#xff1a; mvctest/ │── model.py # 數據模型 │── view.py # 視圖界面 │── controller.py # 控制器 │── main.py # 程序入口其中model.py代碼如下&#xff…

從認證到透傳:用 Nginx 為 EasySearch 構建一體化認證網關

在構建本地或云端搜索引擎系統時&#xff0c;EasySearch 憑借其輕量、高性能、易部署等優勢&#xff0c;逐漸成為眾多開發者和技術愛好者的首選。但在實際部署過程中&#xff0c;如何借助 Nginx 為 EasySearch 提供高效、穩定且安全的訪問入口&#xff0c;尤其是在身份認證方面…

CPU 虛擬化機制——受限直接執行 (LDE)

1. 引言&#xff1a;CPU虛擬化的核心問題 讓多個進程看似同時運行在一個物理CPU上。核心思想是時分共享 (time sharing) CPU。為了實現高效且可控的時分共享&#xff0c;本章介紹了一種關鍵機制&#xff0c;稱為受限直接執行 (Limited Direct Execution, LDE)。 1.1 LDE的基本…

linux 中斷子系統鏈式中斷編程

直接貼代碼了&#xff1a; 虛擬中斷控制器代碼&#xff0c;chained_virt.c #include<linux/kernel.h> #include<linux/module.h> #include<linux/clk.h> #include<linux/err.h> #include<linux/init.h> #include<linux/interrupt.h> #inc…