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 多路复用,一个线程可以处理多个连接,减少了线程的创建和切换开销,提高了系统的并发处理能力和资源利用率。
  • 缺点 :编程模型相对复杂,需要熟悉 Selector、Channel 和 Buffer 等概念。

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 用于管理 ChannelHandler,ChannelHandler 负责处理具体的业务逻辑。

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

1.3.3 优点

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

2. Netty 与 Java NIO 的区别

2.1 抽象层次

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

2.2 API 易用性

  • Java NIO :
    • 需要手动管理 Selector、Channel 和 Buffer 的注册与监听。
    • 需处理边界问题(如 TCP 粘包/拆包)。
    • 代码复杂度高,容易出错(如资源泄漏)。
  • Netty :
    • 提供链式 Pipeline 和 ChannelHandler 机制,简化事件处理。
    • 内置工具类(如 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 是更优选择。
相关推荐
金銀銅鐵2 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手2 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck4 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_32241428044 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
考虑考虑5 小时前
JDK26的JEP 500属性
java·后端·java ee
LMT流氓兔5 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
yuniko-n5 小时前
【JUC】四种内存屏障示例
java·1024程序员节
念何架构之路6 小时前
Go reflect 包:结构体反射 —Field、Tag 与 VisibleFields
java·数据库·golang
liangbo77 小时前
03-JDK 10/11 局部变量推断与 LTS:var 到底该怎么用
java
Percep_gan7 小时前
调用天翼云的对象存储ZOS,很详细
java·1024程序员节