Netty 框架介紹

1. Netty 框架介紹

Netty 是一個基于 Java NIO(Non-blocking I/O)的異步事件驅動網絡應用框架,旨在快速開發高性能、高可靠性的網絡服務器和客戶端。它簡化了 TCP/UDP 等協議的編程,并提供了高度可定制的組件,適用于高并發場景(如游戲服務器、即時通訊、分布式系統等)。

核心特性:
  • 高性能:基于事件驅動的 Reactor 線程模型,減少線程切換開銷,支持零拷貝技術。
  • 異步非阻塞:通過 Future 或回調機制處理 I/O 操作,避免線程阻塞。
  • 模塊化設計:提供可插拔的組件(如編解碼器、協議支持),支持快速擴展。
  • 健壯性:內置心跳檢測、重連機制、流量整形等容錯功能。
核心組件:
  • Channel:封裝網絡連接(如 Socket),支持讀寫操作。
  • EventLoop:事件循環,負責處理 I/O 事件和異步任務。
  • ChannelHandler:處理 I/O 事件(如數據接收、連接建立)的核心邏輯單元。
  • ByteBuf:高效的自定義字節緩沖區,支持池化內存管理。

2. Netty 與 Java I/O 庫的區別

2.1 編程模型對比

特性

Java I/O(BIO)

Java NIO

Netty

I/O 模型

阻塞式(Blocking I/O)

非阻塞式(Non-blocking I/O)

基于 NIO 的異步事件驅動

線程模型

每連接一個線程(高資源消耗)

單線程或少量線程管理多連接(Selector)

多 Reactor 線程池(EventLoopGroup)

代碼復雜度

簡單但難以擴展

復雜(需手動處理 Selector、Buffer)

簡化了 NIO 的復雜性,提供高層抽象

內存管理

基于 byte[]InputStream

使用 ByteBuffer(需手動 flip/clear)

使用 ByteBuf(自動擴容、內存池優化)

協議支持

需自行實現

需自行實現

內置 HTTP、WebSocket、Protobuf 等

適用場景

低并發、簡單協議

中高并發、需精細控制

高并發、高性能、復雜協議


2.2 示例對比:實現 Echo 服務器
Java I/O(BIO)實現
// 每個連接占用一個線程,線程數隨連接數線性增長
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {Socket clientSocket = serverSocket.accept(); // 阻塞new Thread(() -> {try {BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));String line;while ((line = in.readLine()) != null) { // 阻塞clientSocket.getOutputStream().write(line.getBytes());}} catch (IOException e) { /* 處理異常 */ }}).start();
}
Netty 實現
public class EchoServer {public static void main(String[] args) {EventLoopGroup bossGroup = new NioEventLoopGroup(); // 處理連接EventLoopGroup workerGroup = new NioEventLoopGroup(); // 處理 I/Otry {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new EchoServerHandler()); // 自定義邏輯}});ChannelFuture future = bootstrap.bind(8080).sync();future.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}// 業務邏輯(非阻塞)
public class EchoServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {ctx.write(msg); // 異步寫回數據}
}

2.3 核心區別總結
  1. 線程模型
    • Java I/O:阻塞模型導致線程資源浪費。
    • Netty:通過少量線程(EventLoop)管理大量連接,減少上下文切換。
  1. 開發效率
    • Java NIO:需手動處理 Selector、Buffer 邊界等問題。
    • Netty:提供編解碼器、粘包/拆包解決方案(如 LengthFieldBasedFrameDecoder),簡化開發。
  1. 性能優化
    • Netty 的 ByteBuf 支持內存池(減少 GC 壓力),零拷貝技術(如 FileRegion)。
  1. 擴展性
    • Netty 的 ChannelHandler 鏈式設計允許靈活添加業務邏輯(如日志、加密)。

結論

  • 選擇 Java I/O:適合簡單、低并發的場景(如本地文件操作)。
  • 選擇 Netty:適用于高并發、低延遲的網絡應用(如微服務通信、實時消息推送)。Netty 的抽象層屏蔽了底層復雜性,顯著提升開發效率和系統性能。

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

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

相關文章

Eclipse 插件開發 5.2 編輯器 獲取當前編輯器

Eclipse 插件開發 5.2 編輯器 獲取當前編輯器 1 獲取活躍編輯器2 獲取全部編輯器 Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Click1 Bundle-SymbolicName: com.xu.click1;singleton:true Bundle-Version: 1.0.0 Bundle-Activator: com.xu.click1.Activato…

完成LRU頁面調度算法的模擬

目錄 1.上代碼 2.實現思路 1.上代碼 #include<iostream> using namespace std; //內存塊類 class memory { public:void init();void alter(int a, int b);int check_full();int check_old();int check_exist(int a);void run();void refresh();friend int manage(me…

Three.js 直線拐角自動圓角化(圓弧轉彎)

目錄 前言 計算圓心坐標 計算兩條直線的角平分線 計算dir1 dir2的夾角 計算圓心到直線交點的距離 計算圓心 計算從正X軸算起曲線開始、終止的角度 計算垂足與兩直線交點距離 計算垂足 計算垂線 計算兩垂線與x軸的夾角 ?編輯 計算圓弧是否按照順時針方向來繪制 成功…

【MYSQL】mysql單表億級數據查詢優化處理

1、實踐表明mysql單表數據超過一億后&#xff0c;數據進行交并差效率會非常慢&#xff0c;所以這時候就要進行表的優化。 我這里主要是使用索引。 2、表字段精量精簡 查索引&#xff0c;建索引&#xff0c;刪索引語法 --查看索引 -- SHOW INDEX FROM 表名; -- 刪除索引 --AL…

C++基礎:模擬實現vector(有存在深層次的淺拷貝問題)

目錄 引言 一、vector的基本框架 二、尾插push_back、reserve擴容、任意位置插入insert&#xff08;增&#xff09; 1.reserve擴容 2.push_back尾插 3.深層次的淺拷貝問題 4. 任意位置插入數據insert(會使迭代器失效) 三、構造、析構、拷貝構造函數 1.構造函數 1.1無…

【力扣】關于鏈表索引

怎么才能走到目標節點呢&#xff1f; 從9走到2&#xff0c;需要2步&#xff0c;他們的索引分別是&#xff1a;0&#xff0c;2 在for循環里&#xff1a;int i 0; i < 2; i i的范圍是【0&#xff0c;2&#xff09; 有&#xff1a;2 2 - 0 如果從虛擬頭節點開始走到2&#x…

C++ ODB框架詳解:現代C++對象關系映射解決方案

目錄 框架簡介安裝與配置基礎概念實體映射數據庫操作查詢操作高級功能性能優化最佳實踐 框架簡介 ODB&#xff08;Object-Relational Database&#xff09;是一個專為C設計的對象關系映射&#xff08;ORM&#xff09;框架&#xff0c;由CodeSynthesis公司開發。它提供了一種…

Ai書簽管理工具開發全記錄(一):項目總覽與技術藍圖

文章目錄 Ai書簽管理工具開發全記錄&#xff08;一&#xff09;&#xff1a;項目總覽與技術藍圖 ?1. 項目背景與核心價值 &#x1f4a1;1.1. 核心特點 2. 技術架構分析 &#x1f3d7;?功能架構全景圖典型工作流 3. 核心技術棧選擇 &#x1f6e0;?4. 預期使用功能說明 &#…

GUI 編程——python

GUI 編程核心概念 GUI&#xff08;圖形用戶界面&#xff0c;Graphical User Interface&#xff09; 是一種通過圖形元素&#xff08;窗口、按鈕、菜單等&#xff09;與用戶交互的應用程序形式&#xff0c;相比命令行界面更直觀易用。以下是學習 GUI 編程的基礎概念和流程&…

【Doris基礎】Apache Doris 基本架構深度解析:從存儲到查詢的完整技術演進

目錄 1 引言 2 Doris 架構全景圖 2 核心組件技術解析 2.1 Frontend 層&#xff08;FE&#xff09; 2.2 Backend 層&#xff08;BE&#xff09; 3 數據存儲與復制機制 3.1 存儲架構演進 3.2 副本復制策略 4 查詢處理全流程解析 4.1 查詢生命周期 5 高可用設計 5.1 F…

光電賦能低空場景,靈途科技助力無人機持續升級

2025 UASE 主題為“步入低空經濟新時代”的“2025第九屆世界無人機大會暨國際低空經濟與無人系統博覽會/第十屆深圳國際無人機展覽會”5月23日在深圳會展中心隆重開幕。本屆展會匯聚了全球800余家企業參展&#xff0c;展示5000多款無人機及系統設備&#xff0c;全面呈現低空經…

iOS QQ抽屜式導航的實現

QQ個人中心的側滑功能(通常稱為"抽屜式導航")可以通過以下幾種方式在iOS中實現&#xff1a; 主要實現方案 使用第三方庫 最快速的方式是使用成熟的第三方庫&#xff1a; SWRevealViewController&#xff1a;最流行的側滑菜單庫MMDrawerController&#xff1a;另一…

【Pandas】pandas DataFrame drop

Pandas2.2 DataFrame Reindexing selection label manipulation 方法描述DataFrame.add_prefix(prefix[, axis])用于在 DataFrame 的行標簽或列標簽前添加指定前綴的方法DataFrame.add_suffix(suffix[, axis])用于在 DataFrame 的行標簽或列標簽后添加指定后綴的方法DataFram…

長短期記憶網絡 (LSTM) 詳解:從原理到應用

一、引言&#xff1a;序列數據處理的挑戰? 在自然語言處理、語音識別、時間序列分析等領域&#xff0c;數據通常以序列形式存在&#xff0c;前后數據點之間存在依賴關系。傳統循環神經網絡 (RNN) 雖然能捕捉序列依賴&#xff0c;但存在嚴重的梯度消失 / 爆炸問題&#xff0c;…

三天掌握PyTorch精髓:從感知機到ResNet的快速進階方法論

本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型應用開發學習視頻及資料&#xff0c;盡在聚客AI學院。 一、分析式AI基礎與深度學習核心概念 1.1 深度學習三要素 數學基礎&#xff1a; f(x;W,b)σ(Wxb)(單層感知機) 1.2 PyTorch核心組件 張量操作示例…

Linux操作系統概述

一、操作系統的作用 1、五大基本功能 &#xff08;1&#xff09;進程和線程的管理&#xff1a;進程線程的狀態、控制、同步互斥、通信調度等 (2&#xff09;存儲管理&#xff1a;分配/回收、地址轉換、存儲保護等 (3&#xff09;文件管理&#xff1a;文件目錄、文件操作、磁盤…

Python爬蟲第22節- 結合Selenium識別滑動驗證碼實戰

目錄 一、引言 二、滑動驗證碼原理與反爬機制 2.1 驗證碼原理 2.2 反爬機制 三、工程實戰&#xff1a;滑動驗證碼識別全流程 3.1 工程準備 3.1.1 環境依賴 3.1.2 目標網站與驗證碼識別案例 3.2 核心破解流程 3.2.1 自動化打開網頁與登錄 3.2.2 獲取驗證碼圖片&#…

NSSCTF-[NISACTF 2022]huaji?

下載附件得到文件 放到kali里面看看 發現是一張圖片 用binwalk命令對其進行分離 發現需要密碼 用010打開圖片進行查看 對其進行解密 分別得到 ctf_NISA_2022 nisa_2022 發現ctf_NISA_2022是密碼 得到flag NSSCTF{Nls_FumYEnnOjy}

nt!CcGetVacbMiss函數分析之設置好nt!_VACB然后調用函數nt!SetVacb

第一部分&#xff1a;MmMapViewInSystemCache函數返回 Status MmMapViewInSystemCache (SharedCacheMap->Section, &Vacb->BaseAddress, &NormalOffset, …

Uniapp+UView+Uni-star打包小程序極簡方案

一、減少主包體積 主包污染源&#xff08;全局文件依賴&#xff09;勁量獨立導入 componentsstaticmain.jsApp.vueuni.css 分包配置缺陷&#xff0c;未配置manifest.json中mp-weixin節點 "usingComponents" : true,"lazyCodeLoading" : "requiredC…