Netty——BIO、NIO 与 Netty

文章目录

  • 1. 介绍
    • 1.1 BIO
      • 1.1.1 概念
      • 1.1.2 工作原理
      • 1.1.3 优缺点
    • 1.2 NIO
      • 1.2.1 概念
      • 1.2.2 工作原理
      • 1.2.3 优缺点
    • 1.3 Netty
      • 1.3.1 概念
      • 1.3.2 工作原理
      • 1.3.3 优点
  • 2. Netty 与 Java NIO 的区别
    • 2.1 抽象层次
    • 2.2 API 易用性
    • 2.3 性能优化
    • 2.4 功能扩展性
    • 2.5 线程模型
    • 2.6 适用场景
  • 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 操作
BIO 模型

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 操作,提高了系统的并发处理能力。
NIO 模型

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 是更优选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898662.shtml

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

相关文章

游戏引擎学习第175天

回顾和今天的计划 今天的主要任务是完成稀疏 Unicode 支持。之前我们已经完成了所有的思考和设计工作,但代码部分尚未完成,因为有许多内容需要调整和重构。因此,今天的目标就是把这些内容全部整理好并最终实现。 回顾当前测试资源构建器的状…

零基础上手Python数据分析 (7):Python 面向对象编程初步

写在前面 回顾一下,我们已经学习了 Python 的基本语法、数据类型、常用数据结构和文件操作、异常处理等。 到目前为止,我们主要采用的是 面向过程 (Procedural Programming) 的编程方式,即按照步骤一步一步地编写代码,解决问题。 这种方式对于简单的任务已经足够,但当程序…

CNN的空间归纳偏置(Inductive Bias):深入解析其本质与影响(与transformer的比较)

CNN的空间归纳偏置(Inductive Bias):深入解析其本质与影响 在深度学习领域,卷积神经网络(Convolutional Neural Networks, CNN)和Transformer代表了两种截然不同的设计哲学。CNN凭借其卓越的性能长期主导计…

1-4 麻雀优化深度核极限学习机超参数

本博客来源于CSDN机器鱼,未同意任何人转载。 更多内容,欢迎点击本专栏目录,查看更多内容。 目录 0.引言 1.原理 2.具体实现 3.结语 0.引言 在博客【深度核极限学习机】里我们讲述了深度核极限学习机原理,今天我们对其继续进…

miniconda安装保姆级教程|win11|深度学习环境配置

一、官网安装miniconda miniconda官网:Miniconda - Anaconda 点击Download按钮 在红框位置输入邮箱并点击submit,下载链接将会发到邮箱中 邮箱中将会收到如图所示邮件,点击下载 选择windows对应的miniconda安装包 miniconda安装包安装完成如…

AI安全、大模型安全研究(DeepSeek)

DeepSeek 点燃AI应用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1国产大模型的发布,以技术创新惊艳了全球,更是极致的性价比推动国内千行百业接入 AI,政府、企业竞速开发智能业务处理、智能客服、代码生成、营销文案等应用,“落地效率” 成为第一关键词。然而与此相…

机器学习——Numpy的神奇索引与布尔索引

在 NumPy 中,神奇索引(Fancy Indexing) 和 布尔索引(Boolean Indexing) 是两种强大的索引方式,用于从数组中提取特定元素或子集。以下是它们的详细说明和示例: 1. 神奇索引(Fancy In…

Android Studio最后一个绑定JDK8的版本,但是官方下载是最新的,怎么下载Android Studio历史版本包,这篇文章帮你解决。

最近需要安装Android Studio 编辑器 发现官网最新的编辑器已经不支持 jdk8了 经过查阅资料: Android Studio最后一个绑定JDK8的版本:4.1.3 下载地址:https://developer.android.google.cn/studio/archive 如果你打开是这样的 下载页 这是因为你用的中…

Next-Auth 认证系统:用户与管理员双角色登录配置

概述 本文档介绍了如何使用 Next-Auth 配置一个同时支持普通用户和管理员用户登录的认证系统。 基本配置 首先,我们需要设置 Next-Auth 的基本配置,包括提供者、回调函数和页面路由。 import type { NextAuthConfig } from next-auth import type { …

CentOS配置永久静态IP

在 CentOS 6 中,配置永久 IP 地址需要修改网络配置文件。以下是详细步骤: 1. 找到网卡名称 首先,确定你需要配置 IP 的网卡名称,通常是 eth0 或类似的名称。 运行以下命令查看网卡信息: bash ifconfig或者&#xf…

springboot Actuator 指标分析

http.server.requests HTTP 接口性能瓶颈 http.server.requests.max system.cpu.usage 代码热点分析或横向扩容 核心接口性能指标,包含以下维度: count:请求总数 max/sum:最大及总响应时间 status:HTTP 状态码分布&a…

在K8S中挂载 Secret 到 Pod

在 Kubernetes 里,把 Secret 挂载到 Pod 中有两种主要方式:作为卷挂载和作为环境变量挂载。下面为你提供相应的代码示例。 作为卷挂载 Secret 将 Secret 作为卷挂载到 Pod 时,Secret 的每个键会成为挂载目录下的一个文件,文件内…

mac npm run dev报错 error:0308010C:digital envelope routines::unsupported

并且提示 Unsupported engine { npm WARN EBADENGINE package: achrinza/node-ipc9.2.2, npm WARN EBADENGINE required: { node: 8 || 10 || 12 || 14 || 16 || 17 }, npm WARN EBADENGINE current: { node: v18.18.0, npm: 9.8.1 } npm WARN EBADENGINE } package.jso…

「宇树科技」13家核心零部件供应商梳理!

2025年2月6日,摩根士丹利(Morgan Stanley)发布最新人形机器人研报:Humanoid 100: Mapping the Humanoid Robot Value Chain(人形机器人100:全球人形机器人产业链梳理)。 2025年2月20日&#xf…

MySQL 性能优化方向

MySQL 性能优化是一个系统性的工作,涉及数据库设计、查询优化、索引优化、硬件配置等多个方面。以下是 MySQL 性能优化的主要方向和具体优化方案: 一、数据库设计优化 1. 合理设计表结构 规范化设计:避免数据冗余,确保数据一致性。适度反规范化:在查询频繁的场景下,适当…

MyBatis plus详解

核心功能 代码生成器 它能够依据数据库表结构,自动生成涵盖实体类、Mapper 接口、Mapper XML 文件、Service 接口与实现类等在内的基础代码。开发人员只需简单配置数据库连接信息、表名以及生成代码的相关参数,即可快速生成符合项目规范的基础代码&…

背包问题——多重背包(C语言)

代码如下&#xff1a; #include<stdio.h>int knapsack(int weight[], int value[], int count[], int n, int capacity) {int* dp (int*)malloc(sizeof(int) * (capacity 1));for (int i 0; i < capacity; i){dp[i] 0;}for (int i 0; i < n; i)//核心代码{fo…

计算机技术系列博客——目录页(持续更新)

1.1 博客目录专栏 1.1.1 博客文章导航 计算机技术系列博客——目录页 1.1.2 网页资源整理 2.1 计算机科学理论 2.2 软件工程技术 2.2.1.1 编程语言 Java Java语言基础 (1) Java基础知识总结01——Java基础篇 (2) Java基础知识总结02——集合框架篇 (3) Java基础知识总结03—…

<项目> 主从Reactor模型的高并发服务器

目录 Reactor 概念 分类 单Reactor单线程 单Reactor多线程 多Reactor多线程 项目介绍 项目规划 模块关系 实现 TimerWheel -- 时间轮定时器 定时器系统调用 时间轮设计 通用类型Any Buffer Socket Channel Poller EventLoop&#xff08;核心&#xff09; eventfd 设计思路 …

车载以太网网络测试-20【传输层-DOIP协议-3】

1 摘要 本文继续对ISO 13400-2定义的节点管理报文进行介绍&#xff0c;主要对路由激活请求/响应报文以及在线检查请求/响应报文的作用、帧结构以及示例进行介绍。 上文回顾&#xff1a; 车载以太网网络测试-19【传输层-DOIP协议-2】 在进行详细介绍之前&#xff0c;还是先回顾…