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 完成期间会被挂起,无法执行其他任务。
流程
plaintext 复制代码
客户端请求 → 服务端线程被阻塞,等待数据到达 → 数据到达后,线程读取并处理 → 返回响应。
BIO编程简单流程

1)服务器端启动一个ServerSocket

2)客户端启动Socket对服务器进行通信,默认情况下服务器端需要对每个客户 建立一个线程与之通讯

3)客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待,或者被拒绝

4)如果有响应,客户端线程会等待请求结束后,在继续执行。

源码如下所示:

如果是mac系统需要安装,telnet工具。telnet安装如下:

bash 复制代码
brew install telnet
java 复制代码
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);
            }
        }
    }
}

执行上述代码后,等于开启一个服务端等待连接,然后客户端连接的话需要执行下面的命令:

bash 复制代码
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,集中处理活跃连接。
流程
plaintext 复制代码
1. 线程注册 Channel 到 Selector,监听感兴趣的事件(如读、写)。
2. Selector 轮询就绪的 Channel,返回就绪事件列表。
3. 线程处理就绪事件(如读取数据到 Buffer,或写入数据)。
特点
  • 优点:单线程可管理大量连接(高并发),资源利用率高。
  • 缺点:编程复杂度高,需手动处理缓冲区和事件分发。
典型应用
  • Netty、Redis、Kafka 等高性能框架。
  • 聊天服务器、API 网关。

3. AIO(Asynchronous I/O)异步非阻塞模型

工作原理
  • 异步:应用程序发起 I/O 操作后,立即返回,无需等待。
  • 回调机制:I/O 操作完成后,系统主动通知应用程序。
流程
plaintext 复制代码
1. 应用程序发起异步 I/O 请求,线程立即继续执行其他任务。
2. 操作系统完成 I/O 后,通过回调函数或 Future 对象通知应用。
特点
  • 优点:真正的异步,线程完全解放,适合长耗时操作。
  • 缺点:编程复杂度高,操作系统支持有限(如 Linux AIO 不够成熟)。
典型应用
  • 文件读写(如 Java 7+ 的 AsynchronousFileChannel)。
  • 数据库驱动(如某些 NoSQL 的异步客户端)。

三者的核心区别

特性 BIO NIO AIO
同步/异步 同步 同步 异步
阻塞/非阻塞 阻塞 非阻塞 非阻塞
线程模型 一连接一线程 少量线程管理多连接 回调机制,线程不等待
资源消耗
适用场景 低并发、稳定连接 高并发、短连接 长耗时操作(如文件 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 类型(长/短连接)、编程成本综合权衡。
相关推荐
Eugene__Chen4 小时前
java IO/NIO/AIO
java·python·nio
Craaaayon1 天前
JVM虚拟机--JVM的组成
java·jvm·nio
森叶4 天前
Java NIO & Java 虚拟线程(微线程)与 Go 协程的运行原理不同 为何Go 能在低配机器上承接10万 Websocket 协议连接
java·websocket·nio
码熔burning4 天前
【Netty篇】Channel 详解
netty·nio·channel
码熔burning5 天前
【NIO番外篇】之组件 Selector
java·io·nio·selector
码熔burning8 天前
【NIO番外篇】之组件 Channel
java·nio·channel
zhangpeng4555479409 天前
用Java NIO模拟HTTPS
java·https·nio
蜗牛、Z23 天前
Java NIO之FileChannel 详解
java·nio
嘉友1 个月前
NIO ByteBuffer 总结
java·后端·nio