Netty——BIO、NIO 與 Netty

文章目錄

  • 1. 介紹
    • 1.1 BIO
      • 1.1.1 概念
      • 1.1.2 工作原理
      • 1.1.3 優缺點
    • 1.2 NIO
      • 1.2.1 概念
      • 1.2.2 工作原理
      • 1.2.3 優缺點
    • 1.3 Netty
      • 1.3.1 概念
      • 1.3.2 工作原理
      • 1.3.3 優點
  • 2. Netty 與 Java NIO 的區別
    • 2.1 抽象層次
    • 2.2 API 易用性
    • 2.3 性能優化
    • 2.4 功能擴展性
    • 2.5 線程模型
    • 2.6 適用場景
  • 3. 總結


1. 介紹

1.1 BIO

1.1.1 概念

BIO(Blocking I/O),即 阻塞式 I/O,是 Java 最早提供的 I/O 模型。在這種模型下,當進行 I/O 操作時,線程會被阻塞,直到操作完成

1.1.2 工作原理

BIO 的服務器通常 使用一個獨立的線程來處理每個客戶端連接。當有新的客戶端連接請求時,服務器會 為該連接創建一個新的線程,該線程負責 處理該客戶端的所有 I/O 操作
BIO 模型

1.1.3 優缺點

  • 優點:編程模型簡單,易于理解和實現。
  • 缺點每個客戶端連接都需要一個獨立的線程來處理,當客戶端數量較多時,會消耗大量的系統資源,導致性能下降,可擴展性較差。

1.2 NIO

1.2.1 概念

NIO(Non-blocking I/O),即 非阻塞式 I/O,是 Java 1.4 引入的新 I/O 模型。在 NIO 中,線程在進行 I/O 操作時不會被阻塞,可以繼續執行其他任務。NIO 通過 通道 (Channel)緩沖區 (Buffer) 來進行數據的讀寫操作,使用 選擇器 (Selector) 來實現 I/O 多路復用。

1.2.2 工作原理

NIO 使用 Selector 來監控多個 Channel 的 I/O 事件,當某個 Channel 上有事件發生 時(如 可讀可寫),Selector 會通知相應的線程進行處理。這樣,一個線程可以同時處理多個 Channel 的 I/O 操作,提高了系統的并發處理能力。
NIO 模型

1.2.3 優缺點

  • 優點使用 I/O 多路復用,一個線程可以處理多個連接,減少了線程的創建和切換開銷,提高了系統的并發處理能力和資源利用率
  • 缺點:編程模型相對復雜,需要熟悉 SelectorChannelBuffer 等概念。

1.3 Netty

1.3.1 概念

Netty 是一個基于 Java NIO 構建的 高性能異步事件驅動網絡應用框架。它簡化了基于 TCP/UDP 的網絡編程,提供了對復雜 I/O 操作(如 HTTP、WebSocket 等協議)的抽象,并內置了 高效的線程模型內存管理機制。主要用于 快速開發可維護的高性能 服務器 和 客戶端

1.3.2 工作原理

Netty 基于 NIO 構建,采用了 事件驅動異步編程模型

它使用 EventLoopGroup 來管理線程,EventLoop 負責處理 Channel 上的 I/O 事件。ChannelPipeline 用于管理 ChannelHandlerChannelHandler 負責處理具體的業務邏輯。

EventLoopGroup 分為兩種,一種是 BossGroup,用于處理 建立連接事件;另一種是 WorkerGroup,用于處理 讀/寫事件

1.3.3 優點

  • 提供了簡單易用的 API,降低了開發難度。
  • 對 NIO 進行了優化,性能更高。
  • 具有豐富的功能特性,如 心跳檢測斷線重連編解碼框架 等。
  • 支持多種傳輸協議,可擴展性強。

2. Netty 與 Java NIO 的區別

2.1 抽象層次

  • Java NIO:提供 基礎的非阻塞 I/O 編程模型SelectorChannelBuffer),但需要開發者自行管理復雜的 多線程連接狀態數據編解碼異常處理
  • Netty:在 NIO 的基礎上提供更高層次的抽象,封裝了底層細節(如 線程池連接池內存管理)。開發者只需關注業務邏輯,通過 ChannelHandler 處理事件(如 連接建立數據讀寫)即可。

2.2 API 易用性

  • Java NIO
    • 需要手動管理 SelectorChannelBuffer 的注冊與監聽
    • 需處理邊界問題(如 TCP 粘包/拆包)
    • 代碼復雜度高,容易出錯(如資源泄漏)。
  • Netty
    • 提供鏈式 PipelineChannelHandler 機制,簡化事件處理
    • 內置工具類(如 ByteToMessageDecoder)解決粘包/拆包
    • 自動釋放資源,減少內存泄漏風險。

2.3 性能優化

  • Java NIO
    • 原生的 Selector 實現在 高并發 下可能存在 空輪詢 bug
    • ByteBuffer 的固定大小和內存拷貝可能影響性能。
  • Netty
    • 使用 Epoll (Linux) 或 KQueue (Mac) 等系統級高性能 I/O 模型
    • ByteBuf 支持 內存池化 (PooledByteBuf)零拷貝 (CompositeByteBuf)減少 GC 壓力
    • 主從 Reactor 線程模型(BossGroup + WorkerGroup)提升并發處理能力

2.4 功能擴展性

  • Java NIO
    • 需要 自行實現協議 支持(如 HTTP)、SSL 加密等。
    • 缺乏對異步編程的友好支持。
  • Netty
    • 內置豐富的編解碼器(如 HTTP、WebSocket)。
    • 支持通過 ChannelFuture 實現異步回調

2.5 線程模型

  • Java NIO
    • 開發者需 自行設計線程池 管理 I/O 事件業務邏輯
    • 容易因線程競爭導致性能下降。
  • Netty:支持 自定義線程模型,如:
    • 單線程模型:整個 Netty 服務端僅用一個線程來處理所有的 連接、讀寫 操作。適用于 并發量較低、業務邏輯簡單 的場景。
    • 多線程 Reactor 模式默認采用):BossGroup 負責處理連接,WorkerGroup 處理 I/O

2.6 適用場景

  • Java NIO:適合 簡單、小規模非阻塞 I/O 應用,或 需要完全控制底層細節 的場景。
  • Netty:適用于 高并發、低延遲復雜網絡應用,如:
    • 分布式 RPC 框架(如 Dubbo)。
    • 實時通信系統(如 WebSocket 服務器)。

3. 總結

  • BIO 是傳統的 阻塞式 I/O一個線程只能監聽一個客戶端的 I/O 事件,而且 讀寫操作會阻塞,不適合大量客戶端的場景。
  • NIO 是 非阻塞 I/O一個線程可以監聽多個通道的 I/O 事件讀寫操作不會阻塞,性能更高。
  • Netty 對 NIO 進行了封裝,通過 內存池化零拷貝 優化了 NIO 的性能,提供了更多的高級特性,如心跳檢測、斷線重連。如果想要 快速構建穩定、高性能的網絡應用,Netty 是更優選擇。

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

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

相關文章

游戲引擎學習第175天

回顧和今天的計劃 今天的主要任務是完成稀疏 Unicode 支持。之前我們已經完成了所有的思考和設計工作,但代碼部分尚未完成,因為有許多內容需要調整和重構。因此,今天的目標就是把這些內容全部整理好并最終實現。 回顧當前測試資源構建器的狀…

零基礎上手Python數據分析 (7):Python 面向對象編程初步

寫在前面 回顧一下,我們已經學習了 Python 的基本語法、數據類型、常用數據結構和文件操作、異常處理等。 到目前為止,我們主要采用的是 面向過程 (Procedural Programming) 的編程方式,即按照步驟一步一步地編寫代碼,解決問題。 這種方式對于簡單的任務已經足夠,但當程序…

CNN的空間歸納偏置(Inductive Bias):深入解析其本質與影響(與transformer的比較)

CNN的空間歸納偏置(Inductive Bias):深入解析其本質與影響 在深度學習領域,卷積神經網絡(Convolutional Neural Networks, CNN)和Transformer代表了兩種截然不同的設計哲學。CNN憑借其卓越的性能長期主導計…

1-4 麻雀優化深度核極限學習機超參數

本博客來源于CSDN機器魚,未同意任何人轉載。 更多內容,歡迎點擊本專欄目錄,查看更多內容。 目錄 0.引言 1.原理 2.具體實現 3.結語 0.引言 在博客【深度核極限學習機】里我們講述了深度核極限學習機原理,今天我們對其繼續進…

miniconda安裝保姆級教程|win11|深度學習環境配置

一、官網安裝miniconda miniconda官網:Miniconda - Anaconda 點擊Download按鈕 在紅框位置輸入郵箱并點擊submit,下載鏈接將會發到郵箱中 郵箱中將會收到如圖所示郵件,點擊下載 選擇windows對應的miniconda安裝包 miniconda安裝包安裝完成如…

AI安全、大模型安全研究(DeepSeek)

DeepSeek 點燃AI應用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1國產大模型的發布,以技術創新驚艷了全球,更是極致的性價比推動國內千行百業接入 AI,政府、企業競速開發智能業務處理、智能客服、代碼生成、營銷文案等應用,“落地效率” 成為第一關鍵詞。然而與此相…

機器學習——Numpy的神奇索引與布爾索引

在 NumPy 中,神奇索引(Fancy Indexing) 和 布爾索引(Boolean Indexing) 是兩種強大的索引方式,用于從數組中提取特定元素或子集。以下是它們的詳細說明和示例: 1. 神奇索引(Fancy In…

Android Studio最后一個綁定JDK8的版本,但是官方下載是最新的,怎么下載Android Studio歷史版本包,這篇文章幫你解決。

最近需要安裝Android Studio 編輯器 發現官網最新的編輯器已經不支持 jdk8了 經過查閱資料: Android Studio最后一個綁定JDK8的版本:4.1.3 下載地址:https://developer.android.google.cn/studio/archive 如果你打開是這樣的 下載頁 這是因為你用的中…

Next-Auth 認證系統:用戶與管理員雙角色登錄配置

概述 本文檔介紹了如何使用 Next-Auth 配置一個同時支持普通用戶和管理員用戶登錄的認證系統。 基本配置 首先,我們需要設置 Next-Auth 的基本配置,包括提供者、回調函數和頁面路由。 import type { NextAuthConfig } from next-auth import type { …

CentOS配置永久靜態IP

在 CentOS 6 中,配置永久 IP 地址需要修改網絡配置文件。以下是詳細步驟: 1. 找到網卡名稱 首先,確定你需要配置 IP 的網卡名稱,通常是 eth0 或類似的名稱。 運行以下命令查看網卡信息: bash ifconfig或者&#xf…

springboot Actuator 指標分析

http.server.requests HTTP 接口性能瓶頸 http.server.requests.max system.cpu.usage 代碼熱點分析或橫向擴容 核心接口性能指標,包含以下維度: count:請求總數 max/sum:最大及總響應時間 status:HTTP 狀態碼分布&a…

在K8S中掛載 Secret 到 Pod

在 Kubernetes 里,把 Secret 掛載到 Pod 中有兩種主要方式:作為卷掛載和作為環境變量掛載。下面為你提供相應的代碼示例。 作為卷掛載 Secret 將 Secret 作為卷掛載到 Pod 時,Secret 的每個鍵會成為掛載目錄下的一個文件,文件內…

mac npm run dev報錯 error:0308010C:digital envelope routines::unsupported

并且提示 Unsupported engine { npm WARN EBADENGINE package: achrinza/node-ipc9.2.2, npm WARN EBADENGINE required: { node: 8 || 10 || 12 || 14 || 16 || 17 }, npm WARN EBADENGINE current: { node: v18.18.0, npm: 9.8.1 } npm WARN EBADENGINE } package.jso…

「宇樹科技」13家核心零部件供應商梳理!

2025年2月6日,摩根士丹利(Morgan Stanley)發布最新人形機器人研報:Humanoid 100: Mapping the Humanoid Robot Value Chain(人形機器人100:全球人形機器人產業鏈梳理)。 2025年2月20日&#xf…

MySQL 性能優化方向

MySQL 性能優化是一個系統性的工作,涉及數據庫設計、查詢優化、索引優化、硬件配置等多個方面。以下是 MySQL 性能優化的主要方向和具體優化方案: 一、數據庫設計優化 1. 合理設計表結構 規范化設計:避免數據冗余,確保數據一致性。適度反規范化:在查詢頻繁的場景下,適當…

MyBatis plus詳解

核心功能 代碼生成器 它能夠依據數據庫表結構,自動生成涵蓋實體類、Mapper 接口、Mapper XML 文件、Service 接口與實現類等在內的基礎代碼。開發人員只需簡單配置數據庫連接信息、表名以及生成代碼的相關參數,即可快速生成符合項目規范的基礎代碼&…

背包問題——多重背包(C語言)

代碼如下&#xff1a; #include<stdio.h>int knapsack(int weight[], int value[], int count[], int n, int capacity) {int* dp (int*)malloc(sizeof(int) * (capacity 1));for (int i 0; i < capacity; i){dp[i] 0;}for (int i 0; i < n; i)//核心代碼{fo…

計算機技術系列博客——目錄頁(持續更新)

1.1 博客目錄專欄 1.1.1 博客文章導航 計算機技術系列博客——目錄頁 1.1.2 網頁資源整理 2.1 計算機科學理論 2.2 軟件工程技術 2.2.1.1 編程語言 Java Java語言基礎 (1) Java基礎知識總結01——Java基礎篇 (2) Java基礎知識總結02——集合框架篇 (3) Java基礎知識總結03—…

<項目> 主從Reactor模型的高并發服務器

目錄 Reactor 概念 分類 單Reactor單線程 單Reactor多線程 多Reactor多線程 項目介紹 項目規劃 模塊關系 實現 TimerWheel -- 時間輪定時器 定時器系統調用 時間輪設計 通用類型Any Buffer Socket Channel Poller EventLoop&#xff08;核心&#xff09; eventfd 設計思路 …

車載以太網網絡測試-20【傳輸層-DOIP協議-3】

1 摘要 本文繼續對ISO 13400-2定義的節點管理報文進行介紹&#xff0c;主要對路由激活請求/響應報文以及在線檢查請求/響應報文的作用、幀結構以及示例進行介紹。 上文回顧&#xff1a; 車載以太網網絡測試-19【傳輸層-DOIP協議-2】 在進行詳細介紹之前&#xff0c;還是先回顧…