Netty——BIO、NIO 与 Netty

文章目录

  • [1. 介绍](#1. 介绍)
    • [1.1 BIO](#1.1 BIO)
      • [1.1.1 概念](#1.1.1 概念)
      • [1.1.2 工作原理](#1.1.2 工作原理)
      • [1.1.3 优缺点](#1.1.3 优缺点)
    • [1.2 NIO](#1.2 NIO)
      • [1.2.1 概念](#1.2.1 概念)
      • [1.2.2 工作原理](#1.2.2 工作原理)
      • [1.2.3 优缺点](#1.2.3 优缺点)
    • [1.3 Netty](#1.3 Netty)
      • [1.3.1 概念](#1.3.1 概念)
      • [1.3.2 工作原理](#1.3.2 工作原理)
      • [1.3.3 优点](#1.3.3 优点)
  • [2. Netty 与 Java NIO 的区别](#2. Netty 与 Java NIO 的区别)
    • [2.1 抽象层次](#2.1 抽象层次)
    • [2.2 API 易用性](#2.2 API 易用性)
    • [2.3 性能优化](#2.3 性能优化)
    • [2.4 功能扩展性](#2.4 功能扩展性)
    • [2.5 线程模型](#2.5 线程模型)
    • [2.6 适用场景](#2.6 适用场景)
  • [3. 总结](#3. 总结)

1. 介绍

1.1 BIO

1.1.1 概念

BIO(Blocking I/O) ,即 阻塞式 I/O ,是 Java 最早提供的 I/O 模型。在这种模型下,当进行 I/O 操作时,线程会被阻塞,直到操作完成

1.1.2 工作原理

BIO 的服务器通常 使用一个独立的线程来处理每个客户端连接 。当有新的客户端连接请求时,服务器会 为该连接创建一个新的线程 ,该线程负责 处理该客户端的所有 I/O 操作

1.1.3 优缺点

  • 优点:编程模型简单,易于理解和实现。
  • 缺点每个客户端连接都需要一个独立的线程来处理,当客户端数量较多时,会消耗大量的系统资源,导致性能下降,可扩展性较差。

1.2 NIO

1.2.1 概念

NIO(Non-blocking I/O) ,即 非阻塞式 I/O ,是 Java 1.4 引入的新 I/O 模型。在 NIO 中,线程在进行 I/O 操作时不会被阻塞,可以继续执行其他任务 。NIO 通过 通道 (Channel)缓冲区 (Buffer) 来进行数据的读写操作,使用 选择器 (Selector) 来实现 I/O 多路复用。

1.2.2 工作原理

NIO 使用 Selector 来监控多个 Channel 的 I/O 事件,当某个 Channel 上有事件发生 时(如 可读可写 ),Selector 会通知相应的线程进行处理 。这样,一个线程可以同时处理多个 Channel 的 I/O 操作 ,提高了系统的并发处理能力。

1.2.3 优缺点

  • 优点使用 I/O 多路复用,一个线程可以处理多个连接,减少了线程的创建和切换开销,提高了系统的并发处理能力和资源利用率
  • 缺点 :编程模型相对复杂,需要熟悉 SelectorChannelBuffer 等概念。

1.3 Netty

1.3.1 概念

Netty 是一个基于 Java NIO 构建的 高性能异步事件驱动网络应用框架 。它简化了基于 TCP/UDP 的网络编程,提供了对复杂 I/O 操作(如 HTTP、WebSocket 等协议)的抽象,并内置了 高效的线程模型内存管理机制 。主要用于 快速开发可维护的高性能 服务器 和 客户端

1.3.2 工作原理

Netty 基于 NIO 构建,采用了 事件驱动异步编程模型

它使用 EventLoopGroup 来管理线程,EventLoop 负责处理 Channel 上的 I/O 事件。ChannelPipeline 用于管理 ChannelHandlerChannelHandler 负责处理具体的业务逻辑。

EventLoopGroup 分为两种,一种是 BossGroup,用于处理 建立连接事件 ;另一种是 WorkerGroup,用于处理 读/写事件

1.3.3 优点

  • 提供了简单易用的 API,降低了开发难度。
  • 对 NIO 进行了优化,性能更高。
  • 具有丰富的功能特性,如 心跳检测断线重连编解码框架 等。
  • 支持多种传输协议,可扩展性强。

2. Netty 与 Java NIO 的区别

2.1 抽象层次

  • Java NIO :提供 基础的非阻塞 I/O 编程模型SelectorChannelBuffer),但需要开发者自行管理复杂的 多线程连接状态数据编解码异常处理
  • Netty :在 NIO 的基础上提供更高层次的抽象,封装了底层细节 (如 线程池连接池内存管理 )。开发者只需关注业务逻辑,通过 ChannelHandler 处理事件(如 连接建立数据读写)即可。

2.2 API 易用性

  • Java NIO
    • 需要手动管理 SelectorChannelBuffer 的注册与监听
    • 需处理边界问题(如 TCP 粘包/拆包)
    • 代码复杂度高,容易出错(如资源泄漏)。
  • Netty
    • 提供链式 PipelineChannelHandler 机制,简化事件处理
    • 内置工具类(如 ByteToMessageDecoder)解决粘包/拆包
    • 自动释放资源,减少内存泄漏风险。

2.3 性能优化

  • Java NIO
    • 原生的 Selector 实现在 高并发 下可能存在 空轮询 bug
    • ByteBuffer 的固定大小和内存拷贝可能影响性能。
  • Netty
    • 使用 Epoll (Linux) 或 KQueue (Mac) 等系统级高性能 I/O 模型
    • ByteBuf 支持 内存池化 (PooledByteBuf)零拷贝 (CompositeByteBuf)减少 GC 压力
    • 主从 Reactor 线程模型(BossGroup + WorkerGroup)提升并发处理能力

2.4 功能扩展性

  • Java NIO
    • 需要 自行实现协议 支持(如 HTTP)、SSL 加密等。
    • 缺乏对异步编程的友好支持。
  • Netty
    • 内置丰富的编解码器(如 HTTP、WebSocket)。
    • 支持通过 ChannelFuture 实现异步回调

2.5 线程模型

  • Java NIO
    • 开发者需 自行设计线程池 管理 I/O 事件业务逻辑
    • 容易因线程竞争导致性能下降。
  • Netty :支持 自定义线程模型 ,如:
    • 单线程模型:整个 Netty 服务端仅用一个线程来处理所有的 连接、读写 操作。适用于 并发量较低、业务逻辑简单 的场景。
    • 多线程 Reactor 模式默认采用 ):BossGroup 负责处理连接,WorkerGroup 处理 I/O

2.6 适用场景

  • Java NIO :适合 简单、小规模非阻塞 I/O 应用 ,或 需要完全控制底层细节 的场景。
  • Netty :适用于 高并发、低延迟复杂网络应用 ,如:
    • 分布式 RPC 框架(如 Dubbo)。
    • 实时通信系统(如 WebSocket 服务器)。

3. 总结

  • BIO 是传统的 阻塞式 I/O一个线程只能监听一个客户端的 I/O 事件 ,而且 读写操作会阻塞,不适合大量客户端的场景。
  • NIO 是 非阻塞 I/O一个线程可以监听多个通道的 I/O 事件读写操作不会阻塞,性能更高。
  • Netty 对 NIO 进行了封装,通过 内存池化零拷贝 优化了 NIO 的性能,提供了更多的高级特性,如心跳检测、断线重连。如果想要 快速构建稳定、高性能的网络应用,Netty 是更优选择。
相关推荐
wellc5 小时前
SpringBoot集成Flowable
java·spring boot·后端
Hui Baby6 小时前
springAi+MCP三种
java
hsjcjh6 小时前
【MySQL】C# 连接MySQL
java
敖正炀6 小时前
LinkedBlockingDeque详解
java
wangyadong3176 小时前
datagrip 链接mysql 报错
java
untE EADO6 小时前
Tomcat的server.xml配置详解
xml·java·tomcat
ictI CABL6 小时前
Tomcat 乱码问题彻底解决
java·tomcat
敖正炀6 小时前
DelayQueue 详解
java
敖正炀7 小时前
PriorityBlockingQueue 详解
java
shark22222227 小时前
Spring 的三种注入方式?
java·数据库·spring