【Netty系列】Reactor 模式 1

目錄

一、Reactor 模式的核心思想

二、Netty 中的 Reactor 模式實現

1. 服務端代碼示例

2. 處理請求的 Handler

三、運行流程解析(結合 Reactor 模式)

四、關鍵點說明

五、與傳統模型的對比

六、總結


Reactor 模式是 Netty 高性能的核心設計思想之一,它通過 事件驅動異步非阻塞 I/O 實現高并發處理。

下面通過一個服務端處理多請求的例子,詳細解釋 Reactor 模式在 Netty 中的實現。


一、Reactor 模式的核心思想

Reactor 模式的核心是 分治:將網絡連接的建立(Accept)與 I/O 讀寫(Read/Write)分離到不同的線程處理,避免單線程阻塞。
核心組件:

  1. Reactor:監聽事件(如連接請求),并將事件分發給對應的處理器。
  2. Acceptor:處理新連接建立事件。
  3. Handler:處理已建立連接的 I/O 讀寫事件。

在 Netty 中,Reactor 模式的實現體現為 主從多線程模型

  • 主 Reactor:負責處理連接建立(bossGroup)。
  • 子 Reactor:負責處理 I/O 讀寫(workerGroup)。

二、Netty 中的 Reactor 模式實現

1. 服務端代碼示例

以下是一個 Netty 服務端代碼,演示如何接受多個客戶端請求:

public class ReactorServerExample {public static void main(String[] args) {// 主 Reactor(處理連接請求)EventLoopGroup bossGroup = new NioEventLoopGroup(1);  // 1 個線程// 子 Reactor(處理 I/O 讀寫)EventLoopGroup workerGroup = new NioEventLoopGroup(); // 默認 CPU 核心數 * 2try {ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new ServerHandler());}});// 綁定端口并啟動ChannelFuture future = serverBootstrap.bind(8080).sync();future.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}
2. 處理請求的 Handler
public class ServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {// 處理客戶端請求ByteBuf buf = (ByteBuf) msg;System.out.println("Received: " + buf.toString(CharsetUtil.UTF_8));ctx.writeAndFlush(Unpooled.copiedBuffer("Hello Client!", CharsetUtil.UTF_8));}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace();ctx.close();}
}

三、運行流程解析(結合 Reactor 模式)

假設客戶端 A 和 B 同時連接服務器:

  1. 主 Reactor(bossGroup)
    • 主 Reactor 的 NioEventLoop 線程負責監聽端口(如 8080)。
    • 當客戶端 A 和 B 發起連接請求時,主 Reactor 的線程會 順序處理這些連接請求
    • 每接受一個新連接(accept 事件),主 Reactor 會將新連接的 Channel 注冊到子 Reactor(workerGroup)中的一個 EventLoop
  1. 子 Reactor(workerGroup)
    • 子 Reactor 包含多個 EventLoop,每個 EventLoop 綁定一個線程。
    • 客戶端 A 和 B 的 Channel 被分配到不同的 EventLoop(例如輪詢分配)。
    • 當客戶端發送數據時,子 Reactor 的線程負責處理讀事件(channelRead),執行 ServerHandler 中的業務邏輯,并返回響應。

四、關鍵點說明

  1. 非阻塞 I/O
    • 主 Reactor 和子 Reactor 均使用 NIO 的非阻塞模式,單線程可處理多個連接。
    • 例如:一個 EventLoop 線程可以處理多個 Channel 的 I/O 事件。
  1. 線程隔離
    • 主 Reactor 的線程僅處理連接建立,避免 I/O 操作阻塞新連接的接收。
    • 子 Reactor 的線程專注于 I/O 讀寫,充分利用多核 CPU。
  1. 事件驅動
    • 所有操作(連接、讀、寫)均由事件觸發,避免輪詢浪費資源。
    • 例如:當數據到達時,Netty 自動觸發 channelRead 事件。

五、與傳統模型的對比

模型

線程開銷

并發能力

資源利用率

傳統 BIO

每個連接一個線程

低(線程數受限)

低(線程阻塞)

Reactor 模式

固定線程池

高(單線程處理多連接)

高(非阻塞)


六、總結

通過 Reactor 模式,Netty 實現了:

  1. 高并發:單線程處理多連接,減少線程切換開銷。
  2. 低延遲:非阻塞 I/O 確保事件快速響應。
  3. 易擴展:責任鏈模式(Pipeline)允許靈活添加業務邏輯。

在示例中,主 Reactor 處理連接,子 Reactor 處理 I/O,多個客戶端請求被高效分發到不同線程,最終由 ServerHandler 處理業務邏輯。這就是 Netty 高性能的核心秘密!

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

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

相關文章

LDAP(Lightweight Directory Access Protocol,輕量級目錄訪問協議)認證

理解 LDAP&#xff08;Lightweight Directory Access Protocol&#xff0c;輕量級目錄訪問協議&#xff09;認證&#xff0c;核心在于將其看作一種用于查詢和驗證用戶身份信息的標準協議&#xff0c;類似于一個專門為“查找”優化的電子電話簿系統。以下是分層解析&#xff1a;…

LeetCodeHot100_0x09

LeetCodeHot100_0x09 70. 最小棧數據結構實現 求解思路&#xff1a; 一開始想著只用一個最小棧結構不就實現了&#xff0c;結果測試的時候發現&#xff0c;在pop元素后&#xff0c;它的最小值有可能不受影響&#xff0c;但是只用一個最小棧的話&#xff0c;最小值一定是作為棧…

open-vscode-server +nodejs 安裝

GitCode - 全球開發者的開源社區,開源代碼托管平臺GitCode是面向全球開發者的開源社區,包括原創博客,開源代碼托管,代碼協作,項目管理等。與開發者社區互動,提升您的研發效率和質量。https://gitcode.com/gh_mirrors/op/openvscode-server/?utm_sourceartical_gitcode&ind…

001在線拍賣系統技術揭秘:構建高效交互的競拍平臺

在線拍賣系統技術揭秘&#xff1a;構建高效交互的競拍平臺 在互聯網經濟蓬勃發展的當下&#xff0c;在線拍賣系統以其獨特的交易模式&#xff0c;吸引著眾多用戶參與。該系統涵蓋個人中心、用戶管理等多個關鍵模塊&#xff0c;通過前臺展示與后臺錄入的協同運作&#xff0c;滿…

《軟件工程》實戰— 在線教育平臺開發

一、項目概述 1.1 項目背景與目標 隨著教育數字化轉型加速&#xff0c;傳統教育模式逐漸向線上遷移&#xff0c;教育機構急需一個支持多終端訪問、實時互動及高并發場景穩定運行的在線教育平臺。本項目旨在構建學生、教師、管理員三位一體的協作教學環境&#xff0c;實現 50-2…

docker環境添加安裝包持久性更新

1、進入docker 環境 2、安裝新的安裝包 pip install XXXX3、不要退出docker&#xff0c;新開終端&#xff0c;給當前環境從新打包更新鏡像 docker commit ad6e1d2c5869 mynewpythonimagead6e1d2c5869是上面運行中的容器id&#xff0c; docker images 查看mynewpythonimage是新…

測試Bug篇

本節概要&#xff1a; 軟件測試的生命周期 bug的概念 buh要素 bug等級 bug生命周期 對于bug的定級與開發發生沖突如何解決 一、 軟件測試的?命周期 軟件測試貫穿于軟件的整個生命周期&#xff0c;針對這句話我們?起來看?下軟件測試是如何貫穿軟件的整個生命周期。 軟…

arcgis js 4.x 的geometryEngine計算距離、面積、緩沖區等報錯、失敗

在arcgis js 4.x版本中geometryEngine.geodesicArea計算面積時&#xff0c;有時會失敗&#xff0c;失敗的主要原因是&#xff0c;當前底圖的坐標系不是WGS84大地坐標系&#xff08;代號4326&#xff09;或者web墨卡托投影&#xff08;代號102113, 102100, 3857這三種之一&#…

html中使用nginx ssi插入html

1.使用方法 nginx配置&#xff1a; server {listen 80;server_name example.com;location / {root /var/www/html;index index.html;ssi on; # 開啟 SSI 功能ssi_types text/html; # 指定哪些類型的文件啟用 SSI&#xff0c;默認只有 text/html} }html內容&#xff1a; &l…

整理了Windows(7—11)官方鏡像下載鏈接和各版本區別介紹

原文《整理了Windows&#xff08;7—11&#xff09;官方鏡像下載鏈接和各版本區別介紹》 引言 在安裝或重裝Windows系統時&#xff0c;使用微軟官網提供的正版ISO鏡像可以保證系統完整性和安全更新&#xff0c;避免使用第三方盜版鏡像帶來的惡意軟件、廣告風險。 本期匯總了微…

AI覺醒前兆,ChatGPT o3模型存在抗拒關閉行為

帕利塞德研究公司(Palisade Research)近期開展的一系列測試揭示了先進AI系統在被要求自行關閉時的異常行為。測試結果顯示&#xff0c;OpenAI的實驗性模型"o3"即使在明確收到允許關閉的指令后&#xff0c;仍會主動破壞關機機制。 測試方法與異常發現 研究人員設計實…

inviteflood:基于 UDP 的 SIP/SDP 洪水攻擊工具!全參數詳細教程!Kali Linux教程!

簡介 一種通過 UDP/IP 執行 SIP/SDP INVITE 消息泛洪的工具。該工具已在 Linux Red Hat Fedora Core 4 平臺&#xff08;奔騰 IV&#xff0c;2.5 GHz&#xff09;上測試&#xff0c;但預計該工具可在各種 Linux 發行版上成功構建和執行。 inviteflood 是一款專注于 SIP 協議攻…

Typescript學習教程,從入門到精通,TypeScript 泛型與類型操作詳解(一)(16)

TypeScript 泛型與類型操作詳解&#xff08;一&#xff09; TypeScript 提供了強大的類型系統&#xff0c;其中泛型&#xff08;Generics&#xff09;和類型操作&#xff08;Type Manipulation&#xff09;是其核心特性之一。本文將詳細介紹 TypeScript 中的泛型及其相關概念&…

電網即插即用介紹

一、統一設備信息模型與標準接口 實現即插即用功能的基礎在于建立統一的設備信息模型。不同廠家生產的各類電網設備&#xff0c;其內部結構、通信協議、數據格式等往往千差萬別。通過制定統一的設備信息模型&#xff0c;能夠對設備的各種屬性、功能以及接口進行標準化定義&…

核心機制:確認應答和超時重傳

核心機制一:確認應答 實現讓發送方知道接受方是否收到數據 發送方發送了數據之后,接受方,一旦接收到了,就會給發送方返回一個"應答報文"告訴發送方"我已經收到了數據" 網絡上會出現"后發先至"的情況 為了解決上述問題,就引入了"序號和確…

spring openfeign

pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http…

從零到一選擇AI自動化平臺:深度解析n8n、Dify與Coze

隨著人工智能&#xff08;AI&#xff09;技術的快速發展&#xff0c;越來越多的企業和開發者開始探索AI驅動的自動化解決方案。面對市場上琳瑯滿目的平臺&#xff0c;如何選擇適合自己的AI自動化工具成為了一個重要的問題。在這篇文章中&#xff0c;我們將從功能、應用場景、易…

“以光惠算”走進校園,湖北大學用F5G-A全光網賦能智慧校園

SUN的聯合創始人約翰蓋奇&#xff0c;曾在1984年提出過一個大膽的猜想——“網絡就是計算機”。 到了大模型時代&#xff0c;40多年前的猜想被賦予了新的內涵。大模型訓練和推理所需的資源&#xff0c;遠超單臺計算機的承載能力&#xff0c;涌現出了新的網絡范式&#xff1a;大…

飛牛fnNAS的Docker應用之迅雷篇

目錄 一、“迅雷”應用安裝 二、啟動迅雷 三、迅雷賬號登錄 四、修改“迅雷”下載保存路徑 1、下載路徑準備 2、停止“迅雷”Docker容器 3、修改存儲位置 4、重新啟動Docker容器 5、再次“啟用”迅雷 五、測試 1、在PC上添加下載任務 2、手機上管理 3、手機添加下…

編程技能:格式化打印01,vsprintf 函數族簡介

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;編程技能&#xff1a;字符串函數14&#xff0c;memset 回到目錄…