当前位置: 首页 > article >正文

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 类型(长/短连接)、编程成本综合权衡。

相关文章:

Netty前置基础知识之BIO、NIO以及AIO理论详细解析和实战案例

前言 Netty是什么? Netty 是一个基于 Java 的 ​高性能异步事件驱动网络应用框架,主要用于快速开发可维护的协议服务器和客户端。它简化了网络编程的复杂性,特别适合构建需要处理海量并发连接、低延迟和高吞吐量的分布式系统。 1)Netty 是…...

开源身份和访问管理(IAM)解决方案:Keycloak

一、Keycloak介绍 1、什么是 Keycloak? Keycloak 是一个开源的身份和访问管理(Identity and Access Management - IAM)解决方案。它旨在为现代应用程序和服务提供安全保障,简化身份验证和授权过程。Keycloak 提供了集中式的用户…...

深入理解 TCP 协议 | 流量、拥塞及错误控制机制

注:本文为 “TCP 协议” 相关文章合辑。 原文为繁体,注意术语描述差异。 略作重排,如有内容异常,请看原文。 作者在不同的文章中互相引用其不同文章,一并汇总于此。 可从本文右侧目录直达本文主题相关的部分&#xff…...

VSCode远程图形化GDB

VSCode远程图形化GDB 摘要一、安装VSCode1、使用.exe安装包安装VSCode2、VSCode 插件安装3、VSCode建立远程连接 二、core dump找bug1、开启core文件2、永久生效的方法3、编写测试程序4、运行结果5、查看core段错误位置6、在程序中开启core dump并二者core文件大小 三、gdbserv…...

软件工程师中级考试-上午知识点总结(上)

我总结的这些都是每年的考点,必须要记下来的。 1. 计算机系统基础 1.1 码 符号位0表示正数,符号位1表示负数。补码:简化运算部件的设计,最适合进行数字加减运算。移码:与前几种不同,1表示,0表…...

Python+CoppeliaSim+ZMQ remote API控制机器人跳舞

这是一个使用Python和CoppeliaSim(V-REP)控制ASTI人型机器人进行舞蹈动作的演示项目。 项目描述 本项目展示了如何使用Python通过ZeroMQ远程API与CoppeliaSim仿真环境进行交互,控制ASTI人型机器人执行预定义的舞蹈动作序列。项目包含完整的机…...

基于FreeRTOS和STM32的微波炉

一、项目简介 使用STM32F103C8T6、舵机、继电器、加热片、蜂鸣器、两个按键、LCD及DHT11传感器等硬件。进一步,结合FreeRTOS和状态机等软件实现了一个微波炉系统;实现的功能包含:人机交互、时间及功率设置、异常情况处理及固件升级等。 二、…...

维度建模工具箱 提纲与总结

这里写自定义目录标题 基本概念事实表和维度表BI(Business Intelligence) 产品 事实表事实表的粒度事实表的种类 维度表建模技术基本原则避免用自然键作为维度表的主键,而要使用类似自增的整数键避免过度规范化避免变成形同事实表的维度表 SCD(Slowly Changed Dimen…...

【沉浸式求职学习day21】【常用类分享,完结!】

沉浸式求职学习 String类(完结) 和 equals的区别 StringBuffer日期类DateCalendar File类 String类(完结) 上次讲了一些创建String类实例的方法。 今天要分享的第一个点是常考的关于String的面试题 和 equals的区别 首先是&…...

国防科大清华城市空间无人机导航推理!GeoNav:赋予多模态大模型地理空间推理能力,实现语言指令导向的空中目标导航

作者: Haotian Xu 1 ^{1} 1, Yue Hu 1 ^{1} 1, Chen Gao 2 ^{2} 2, Zhengqiu Zhu 1 ^{1} 1, Yong Zhao 1 ^{1} 1, Yong Li 2 ^{2} 2, Quanjun Yin 1 ^{1} 1单位: 1 ^{1} 1国防科技大学系统工程学院, 2 ^{2} 2清华大学论文标题:Geo…...

uniapp打ios包

uniapp在windows电脑下申请证书并打包上架 前言 该开发笔记记录了在window系统下,在苹果开发者网站生成不同证书,进行uniapp打包调试和上线发布,对window用户友好 注:苹果打包涉及到两种证书:开发证书 和 分发证书 …...

Redis 的指令执行方式:Pipeline、事务与 Lua 脚本的对比

Pipeline 客户端将多条命令打包发送,服务器顺序执行并一次性返回所有结果。可以减少网络往返延迟(RTT)以提升吞吐量。 需要注意的是,Pipeline 中的命令按顺序执行,但中间可能被其他客户端的命令打断。 典型场景&…...

(14)VTK C++开发示例 --- 将点投影到平面上

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 计算一个点在一个平面上的投影。 vtkPlane 是 VTK(Visualization Toolkit)库中的一个类&…...

快速搭建 Cpolar 内网穿透(Mac 系统)

1、Cpolar快速入门教程(官方) 链接地址:Cpolar 快速入门 2、官方教程详解 本地安装homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"这个是从 git 上拉取的&#x…...

【Flink SQL实战】 UTC 时区格式的 ISO 时间转东八区时间

文章目录 一、原始数据格式二、解决方案三、其他要求 在实际开发中,我们常常会遇到此类情况:数据源里的时间格式是类似 2025-04-21T09:23:16.025Z 这种带 TimeZone 标识的 ISO 8601 格式,而我们需要在 Flink SQL 中将其转换成北京时间显示。 …...

动态监控进程

1.介绍: top和ps命令很相似,它们都是用来显示正在执行的进程,top和ps最大的不同之处,在于top在执行中可以更新正在执行的进程. 2.基本语法: top [选项] 选项说明 ⭐️僵死进程:内存没有释放,但是进程已经停止工作了,需要及时清理 交互操作说明 应用案…...

HADOOP 3.4.1安装和搭建(尚硅谷版~)

目录 1.配置模版虚拟机 2.克隆虚拟机 3.在hadoop102安装JDK 4.完全分布式运行模式 1.配置模版虚拟机 1.安装模板虚拟机,IP地址192.168.10.100、主机名称hadoop100、内存2G、硬盘20G(有需求的可以配置4G内存,50G硬盘) 2.hado…...

第 4 篇:平稳性 - 时间序列分析的基石

第 4 篇:平稳性 - 时间序列分析的基石 在上一篇中,我们学习了如何将时间序列分解为趋势、季节性和残差。我们看到,很多真实世界的时间序列(比如 CO2 浓度)都包含明显的趋势(长期向上或向下)和/…...

DeepSeek赋能Nuclei:打造网络安全检测的“超级助手”

引言 各位少侠,周末快乐,幸会幸会! 今天唠一个超酷的技术组合——用AI大模型给Nuclei开挂,提升漏洞检测能力! 想象一下,当出现新漏洞时,少侠们经常需要根据Nuclei模板,手动扒漏洞文章…...

分享一个python启动文件脚本(django示例)

今天给大家分享一个python启动文件脚本 在日常开发中,我们常常需要运行多条命令来完成“静态收集”“数据库迁移”“启动服务”……如果把这些命令整合到一个脚本里就好了 一、整体流程概览 #mermaid-svg-wA6UnfATaUOfJoPn {font-family:"trebuchet ms"…...

从0到1彻底掌握Trae:手把手带你实战开发AI Chatbot,提升开发效率的必备指南!

我正在参加Trae「超级体验官」创意实践征文, 本文所使用的 Trae 免费下载链接: www.trae.ai/?utm_source… 前言 大家好,我是小Q,字节跳动近期推出了一款 AI IDE—— Trae,由国人团队开发,并且限时免费体…...

3200温控板电路解析

提示:文章 文章目录 前言一、背景二、2.12.2 三、3.1 总结 前言 前期疑问: 本文目标: 一、背景 最近重温3200温控板电路设计和芯片选型 3200代码仓 二、 2.1 按照顺序整理,主要是依靠自己想到的来整理 1、传感器是pt1000&…...

opencv图片颜色识别,颜色的替换

图片颜色识别 1. RGB颜色空间2. 颜色加法2.1使用numpy对图像进行加法2.2使用opencv加法(cv2.add) 3 颜色加权加法(cv2.addWeighted())4. HSV颜色空间5. 制作掩膜4. 与运算(cv2.bitwise_and)5.颜色的替换7 R…...

B实验-12

需要注意版本、页面源代码 两个文件一个目录:phpinfo robots phpmyadmin 实验12 靶机1 一个key在phpmyadmin,一个key在回收站 用两个扫描目录的工具扫,nmap给python版 情况1:弱口令 root root root 123456 …...

Python多技术融合在生态参量估算中的创新应用—以蒸散发与植被GPP估算为例

在全球气候变化背景下,精确估算陆地生态系统水碳通量成为生态研究的关键命题。本研究创新性地整合Python编程、遥感数据处理、机器学习算法及生态过程模型,构建了一套高效可靠的蒸散发(ET)与植被总初级生产力(GPP&…...

文件有几十个T,需要做rag,用ragFlow能否快速落地呢?

一、RAGFlow的优势 1、RAGFlow处理大规模数据性能: (1)、RAGFlow支持分布式索引构建,采用分片技术,能够处理TB级数据。 (2)、它结合向量搜索和关键词搜索,提高检索效率。 &#xf…...

【网工第6版】第5章 网络互联②

目录 ■ IPV6 ▲ IPV6报文格式 ◎ IPV6扩展报头(RFC2460) ◎ IPv6相关协议 ▲ IPV6地址分类 ◎ IPv6地址基础 ◎ IPv6地址举例 ◎ IPv6地址分类 ◎ 特殊地址对比IPv4 vs IPv6 ▲ 过渡技术 本章重要程度:☆☆☆☆☆ ■ IPV6 与IPv4…...

为什么Makefile中的clean需要.PHONY

原因一:避免Makefile检查时间戳 前置知识:makefile在依赖文件没有改变时不会执行编译命令 #第一次执行,OK [rootVM-16-14-centos ~]# make g -E main.cc -o main.i g -S main.i -o main.s g -c main.s -o main.o g main.o -o main#第二…...

Vue组件库开发实战:从0到1构建可复用的微前端模块

🔥 随着前端项目越来越复杂,如何开发一个可以随处使用的组件库变得尤为重要。本文将带你从0开始,实现一个完全独立的Vue组件库,包含样式隔离、主题定制等核心功能。 前言 在日常开发中,我们经常需要在不同项目间复用组…...

相机标定(输出相机内参和畸变参数)

相机标定 这里我用笔记本电脑自带的摄像头进行相机标定 仅作示例,实际工程中要用对应的摄像头进行标定 同时代码也要相应的修改,不过修改的主要是相机的初始化 粗略的说就是打开相机那部分要修改(依据实际情况相应修改) 最终的结果…...