【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 . 交互过程 :



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


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



目录
相关文章
|
3天前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
23 2
|
1月前
|
安全 Java 数据安全/隐私保护
有哪些场景不适合使用Java反射机制
Java反射机制虽强大,但并非万能。在性能要求极高、安全性严格控制、类结构复杂多变或对象创建频繁的场景下,使用反射可能带来性能下降、安全风险增加等问题,应谨慎选择。
42 9
|
1月前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
1月前
|
缓存 监控 Java
Java 线程池在高并发场景下有哪些优势和潜在问题?
Java 线程池在高并发场景下有哪些优势和潜在问题?
|
2月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
25 1
|
2月前
|
Java 数据处理
|
2月前
|
Java 数据处理 数据库
Java多线程的理解和应用场景
Java多线程的理解和应用场景
73 1
|
2月前
|
消息中间件 前端开发 Java
java高并发场景RabbitMQ的使用
java高并发场景RabbitMQ的使用
125 0
|
4月前
|
Java
Java数组的应用场景
Java数组的应用场景
|
4月前
|
微服务
成功解决:java.lang.NoSuchMethodError: reactor.netty.http.client.HttpClient.chunkedTransfer(Z)Lreactor/ne
这篇文章讲述了在微服务架构中整合gateway网关时遇到的`java.lang.NoSuchMethodError`错误的解决方法。问题主要是由于`spring-boot-starter-parent`的版本和`spring-cloud-starter-gateway`的版本不匹配所导致。文章提供了具体的版本不一致的错误配置,并给出了匹配的版本配置方案,以及成功测试的截图。
成功解决:java.lang.NoSuchMethodError: reactor.netty.http.client.HttpClient.chunkedTransfer(Z)Lreactor/ne