【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )(一)

简介: 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )(一)

I . Netty 简介


1 . Netty 是网络开发框架 , 其有如下特点 ;



① 异步 : 与同步相对 , 操作之间 不产生阻塞 , 发出请求后可以不等待回应 , 继续执行后面的代码逻辑 ;


② 事件驱动 : 任何操作 , 都需要一个触发事件 , 如按钮点击 , 回调操作等 ;



2 . Netty 作用 :



① 用途 : 开发 高并发 的 网络 IO 程序 , 其性能 与 可靠性都很高 ;


② 服务器程序 : Netty 网络应用部署在服务器中 , 主要是与客户端进行高并发交互 ;


③ 点对点 ( P2P ) 程序 : 点对点数据传输 ;



3 . Netty 层次 : Netty 最底层是基于 TCP/IP 协议 , 然后封装了原生的网络编程及并发编程 , 在之上使用了 NIO 进行进一步封装 , 最上层才是 Netty 提供的服务 ;



① 底层协议 : TCP 协议 ;


② 原生 API 封装 : 该框架对原生的网络编程及并发操作进行了封装和优化 ;


③ 本质 : Netty 的本质是在 Java NIO 基础上封装的框架 , 适合开发网络服务器 , 如游戏服务器等 ;






II . Netty 应用场景


1 . 远程过程调用 ( RPC ) 框架 : 分布式系统中的远程过程调用框架 , 看重 Netty 的 高并发 , 高性能 的能力 , 将其作为分布式远程调用的网络通信组件 ; 这些框架的底层都是使用 Netty 实现的 ;



2 . 游戏服务器 : 手游 / 大型网游 等后台服务器基本都是基于 Netty 开发 , Netty 作为服务器 高性能 高并发 的通信模块 , 提供了 TCP / UDP / HTTP 协议通信底层功能 , 在这个基础上开发交互的业务逻辑 ;






III . Java I/O 模型


1 . Java IO 模型 : 收发数据的通道模式 , 工作模式 是 同步 还是 异步 , 等待机制是 阻塞 还是 非阻塞 ;



① IO 模型分类 : 根据上述特点可将 Java 中的网络 IO 模型分为 BIO , NIO , AIO , 3 33 类 ;


② 三种模型性能对比 : 三种模型性能依次从低到高排列为 BIO < << NIO < << AIO ;




2 . BIO 模型 : 同步阻塞模型 , 在服务器端 , 针对每个客户端的连接请求 , 都要启动一个线程处理相关的业务逻辑 ;



① 适用场景 : 连接数 少 ;


② 最小 JDK 支持版本 : 1.4 ;


③ 弊端 : 对服务器资源占用高 , 如果客户端只是连接 , 不做任何操作 , 那么也占用了服务器的资源 ;


④ 优点 : 程序简单 , 容易理解 ;


⑤ 瓶颈 : 传统的 BIO 处理大并发数据量时 , 有瓶颈 ;


⑥ BIO 模型中 客户端 与 服务器端 交互 图示 : 服务器端的线程数 与 客户端一样 ;

image.png


上图中 , 如果有 1 万个客户端 , 那么对应的服务器端就会有 1 万个线程 ;




3 . NIO 模型 : 同步非阻塞模型 , 在服务器端 , 一个线程处理多个客户端连接 , 客户端连接服务器时 , 会在多路复用器上注册 , 多路复用器会一直轮训是否有连接请求 , 如果有就处理 , 如果没有不做任何操作 ;



① 适用场景 : 连接数 多 , 都是短连接 ; 如 : 聊天室 , 游戏服务器 等 ;


② 最小 JDK 支持版本 : 1.4 ;


③ 多路复用器 Selector : 可以理解成一个选择器 ;


④ NIO 实现基础 : 客户端与服务器端不是时刻都在进行数据交互 , 而是间歇性的 , 大部分时间都是出于静默 ( 非活动 ) 状态 ;


⑤ NIO 模型中 客户端 与 服务器端 交互 图示 : 服务器端启动一个线程 , 线程中维护 Selector 选择器 , 该选择器会维护多个通道 , 当某个通道有事件发生 , 即客户端有请求进来 , 那么处理该事件 ;


image.png




4 . AIO 模型 : 异步非阻塞模型 , 引入异步通道概念 , 并调用操作系统参与并发任务 ;



① 适用场景 : 连接 的个数多 , 并且都是 长连接 ;


② 最小 JDK 支持版本 : 1.7 ;


③ 工作流程 : 先判定客户端请求的有效性 , 有效请求才启动线程 ;


④ 当前状态 : NIO 的进阶版 , 该技术是 JDK 1.7 引入 , 目前应用不是很广 ; Netty 是基于 NIO 模型的 ;






IV . BIO 概念


BIO 简介 : Blocking IO , 阻塞 IO , 传统 Java IO 编程 ;



① 特点 : 同步阻塞 ;


② 连接 对应 线程 : 服务器端 每维护 一个连接 , 都要启动一个相应的线程 ; 这样就会造成性能浪费 ;


③ BIO 改进方案 : 使用线程池机制改进 BIO , 每个线程可以处理客户端连接 ;


④ NIO 基础 : BIO 是 NIO 的基础 ;






V . BIO 开发流程


1 . 连接流程 : 以 TCP 连接为例 ;



① 服务器端 监听 : 服务器端创建 ServerSocket , 监听接口 ;


② 客户端 连接 : 创建 Socket , 向服务器端申请连接 ;


③ 服务器端 线程 : 接受客户端连接 , 创建一个线程 , 专门与该客户端进行通信 ;




2 . 交互过程 :



① 客户端请求 : 客户端通过建立的连接 , 向服务器端发送请求 , 服务器端如果有线程响应该请求 , 那么处理该请求 , 如果没有线程响应 , 那么等待 , 之后进行超时处理 ;


② 服务器端响应 : 服务器端响应了客户端请求 , 客户端在请求返回后 , 继续执行后面的代码逻辑 ;



目录
相关文章
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
453 1
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
330 3
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
454 0
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
760 24
|
人工智能 Java
java中static关键字简介
`static`关键字用于修饰类的成员变量和方法,使其属于类而非对象。静态成员可通过类名直接访问,无需实例化对象。静态方法只能访问静态成员,不能直接访问非静态成员或使用`this`关键字。此外,静态代码块在类首次加载时执行且仅执行一次,适用于初始化操作。
353 0
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
缓存 移动开发 网络协议
Netty基础—5.Netty的使用简介
本文详细介绍了Netty服务端和客户端的启动流程、IO事件处理类及TCP粘包拆包问题。服务端启动通过ServerBootstrap配置线程模型、IO模型等,客户端通过Bootstrap完成连接配置。IO事件处理类关注关键方法如channelRead、channelActive等。针对TCP粘包拆包,分析了其原因与解决策略,包括消息定长、加分割符和带上长度字段等方式,并介绍了多种解码器如LineBasedFrameDecoder、DelimiterBasedFrameDecoder等。最后对比了Netty组件与传统BIO模型的对应关系,以及Java序列化的不足。