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

news2025/4/22 16:38:35

前言

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.coloradmin.cn/o/2340226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源身份和访问管理(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表…

基于FreeRTOS和STM32的微波炉

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

国防科大清华城市空间无人机导航推理!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用户友好 注:苹果打包涉及到两种证书:开发证书 和 分发证书 …

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

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

动态监控进程

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模板,手动扒漏洞文章…

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

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

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 …

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

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

单页面应用的特点,什么是路由,VueRouter的下载,安装和使用,路由的封装抽离,声明式导航的介绍和使用

文章目录 一.什么是单页面应用?二.什么是路由?生活中的路由和Vue中的路由 三.VueRouter(重点)0.引出1.介绍2.下载与使用(5个基本步骤2个核心步骤)2.1 五个基本步骤2.2 两个核心步骤 四.路由的封装抽离五.声明式导航1.导航链接特点一:能跳转特点二:能高亮 2.两个高亮类名2.1.区…

STM32---外部中断EXTI

目录 一、中断向量表 二、EXTI工作原理图 三、NVIC模块 四、GPIO设置为EXTI的结构 五、C语言示例代码 在STM32中,中断是一个非常重要的结构,他能让我们在执行主函数的时候,由硬件检测一些外部或内部产生的中断信号,跳转到中断…

Itext进行PDF的编辑开发

这周写了一周的需求,是制作一个PDF生成功能,其中用到了Itext来制作PDF的视觉效果。其中一些功能不是很懂,仅作记录,若要学习请仔细甄别正确与否。 开始之前,我还是想说,这傻福需求怎么想出来的&#xff0c…

Hibernate的组件映射

在实际的开发中,使用的是非常多的,还有几种比较特殊的关系映射: 组件映射继承映射 先看一下组件映射: 组件映射中, 组件也是一个类, 但是这个类它不独立称为一个实体, 也就是说, 数据库中没有一个表格单独的和它对应, 具体情况呢, 看演示: