Java I/O模型发展以及Netty网络模型的设计思想

news2024/11/29 7:53:17

Java I/O模型发展以及Netty网络模型的设计思想

  • I/O模型
    • Java BIO
    • Java NIO
    • Java AIO
  • NIO Reactor网络模型
    • 单Reactor单线程模型
    • 单Reactor多线程模型
    • 主从Reactor多线程模型
  • Netty通信框架

前言:
BIO、NIO的代码实践参考:Java分别用BIO、NIO实现简单的客户端服务器通信

I/O模型

  • I/O:I和O指inputoutput,输入输出
  • 通俗理解:用怎么样的通道进行数据的发送和接收
  • 很大程度上决定程序通信的性能

Java共支持三种I/O模型:BIO,NIO,AIO

  • BIO:同步阻塞,一个线程处理一个连接。只要有一个客户端连接到服务器就需要开一个线程。同一个线程的连接和读写操作会阻塞
  • NIO:同步非阻塞,一个线程处理多个连接。实现方式是客户端的请求事件都会注册到多路复用器(selector)上面,多路复用器进行轮询处理
  • AIO:异步非阻塞,引入异步通道概念,采用Proactor模式,有效请求事件才会启动线程,特点是先由操作系统完成后才通知服务器程序启动线程,适用于连接数多的长连接请求

Java BIO

流程:

  1. 服务器启动一个ServerSocket
  2. 客户端启动socket与服务器通信。服务器需要对每个客户端建立一个线程
  3. 客户端发出请求后,先咨询服务器有无线程响应,没有则等待
  4. 有响应,客户端会等待请求结束后再继续执行

在这里插入图片描述

Java NIO

主要概念:

  1. 三大核心:Channel(通道),Buffer(缓冲区),Selector(多路复用器)
  2. 非阻塞模式:一个线程从通道请求或读取数据时,它仅能得到能用的数据,无可用数据时,不会阻塞线程,可以继续做其他事情,非阻塞写也是一样,不需要等待写入
  3. 通俗理解:NIO可以做到用一个线程处理多个操作,假设有10000个请求,实际可能只需要开50-100个线程,不像BIO一样必须分配10000个线程
  4. HTTP2.0也使用了多路复用技术,做到了一个连接并发处理多个请求,数量比HTTP1.0大了好几个数量级

Channel(通道),Buffer(缓冲区),Selector(多路复用器)的关系:

  1. 每个Channel对应一个Buffer
  2. Selector对应一个线程,一个线程对应多个Channel
  3. Selector根据不用事件,在各个通道上切换
  4. Buffer是一个内存块,底层是数组,读写切换需要用flip()
  5. Channel是双向的,可以返回底层操作系统的情况

Channel:

  1. BIO的stream是单向的
  2. Channel是双向的,可以读也可以写
  3. 常见的Channel还有FileChannel,DatagramChannel,SocketChannel,ServerSocketChannel
  4. FileChannel:文件读写
  5. DatagramChannel:UDP读写
  6. SocketChannel,ServerSocketChannel:TCP读写

NIO编程流程:

  1. 服务器启动一个ServerSocket得到一个ServerSocketChannel
  2. 创建一个服务器的Selector
  3. ServerSocketChannel注册到Selector上,标记为连接事件,Selector监听该事件
  4. 开始循环
  5. Selector得到有事件的SelectorKey集合,并进行轮询
  6. 使用SelectorKey上绑定的Channel进行业务处理(连接,读,写)

在这里插入图片描述

Java AIO

NIO Reactor网络模型

单Reactor单线程模型

方案:

  1. Selector是网络编程API,可以实现应用程序对多路链接请求的处理
  2. 服务器用一个多路复用器即一个Reactor监听所有的客户端的请求连接、读、写事件
  3. 每次处理完连接,会创建一个Handler处理连接后的读写业务处理
  4. Handler负责完成整个读、业务处理、写业务流程

优缺点:

  1. 代码简单,只有一个线程,清晰明了
  2. 客户端连接较多时,无法支撑
  3. 一般的NIO实现样例就是用的这种模型(Java分别用BIO、NIO实现简单的客户端服务器通信)

在这里插入图片描述

单Reactor多线程模型

方案:

  1. Selector是网络编程API,可以实现应用程序对多路链接请求的处理
  2. 服务器用一个多路复用器即一个Reactor监听所有的客户端的请求连接、读、写事件
  3. 每次处理完连接,会创建一个Handler处理连接后的读写业务处理
  4. Handler只响应事件,读取数据,不做业务处理,分发给worker线程池里面的线程处理业务
  5. worker线程池分配一个线程负责完成业务处理、回传等业务流程

优缺点:

  1. 可以充分利用多核cpu处理能力
  2. 多线程数据访问和共享比较复杂
  3. Reactor同样是单线程,相比于单Reactor单线程模型性能好一些,但是高并发场景同样会遇到性能瓶颈

在这里插入图片描述

主从Reactor多线程模型

方案:

  1. Reactor主线程Reactor从线程,主线程负责处理连接事件,从线程负责处理读写事件
  2. 主Reactor通过Acceptor处理完连接事件后,主Reactor把连接分给从Reactor处理
  3. 从Reactor将连接的channel注册到Selector中进行监听,并创建各种Handler进行处理
  4. Handler只响应事件,读取数据,不做业务处理,分发给worker线程池里面的线程处理业务
  5. worker线程池分配一个线程负责完成业务处理、回传等业务流程

优缺点:

  1. 主线程和从线程数据交互简单,职责明确
  2. 能处理较大并发量
  3. 编程复杂度较高

在这里插入图片描述

Netty通信框架

主要基于主从Reactor多线程模型,做了一定的改进,增加了Reactor线程池,可以多个主线程和多个从线程并发处理

Netty模型图(简单版)
在这里插入图片描述
Netty模型图(复杂版)
在这里插入图片描述

工作原理:

  1. netty抽象出两种线程池BossGroupWorkGroup,分别做连接事件多路复用和网络读写事件多路复用
  2. BossGroup,WorkGroup都是NioEventLoopGroup
  3. NioEventLoopGroup相当于事件循环组,组中有多个NioEventLoop事件循环
  4. NioEventLoop表示一个不断循环的执行处理任务的线程,每个NioEventLoop都有一个多路复用器Selector
  5. 每个BossGroup中的NioEventLoop执行步骤是: a. 轮询accept事件 b. 处理accept事件,与客户端建立连接,生成channel,并将其注册到某个WorkGroup中的NioEventLoop上的Selector c. 处理任务队列的任务,即runAllTask
  6. 每个WorkGroup中的NioEventLoop执行步骤是: a. 轮询read,write事件 b. 处理read,write事件,主要是处理channel c. 处理任务队列的任务,即runAllTask
  7. 每个WorkGroup中的NioEventLoop处理业务时,会使用pipeline管道,pipeline包含了channel,pipeline维护了很多handler处理器

在这里插入图片描述

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

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

相关文章

Redis Redis介绍、安装 - Redis客户端

目录 redis是什么,他的应用场景是什么? Redis的一些主要特点和应用场景: redis的官方网站:Redis redis是键值型数据库:(也就是key-value模式)(跟python的字典很像) …

渗透测试漏洞原理之---【SSRF 服务端请求伪造】

文章目录 1、SSRF概述1.1、场景1.1.1、PHP代码实现 1.2、SSRF原理1.3、SSRF危害 2、SSRF攻防2.1、SSRF利用2.1.1、文件访问2.1.2、端口扫描2.1.3、读取本地文件2.1.4、内网应用指纹识别2.1.5、攻击内网Web应用 2.2、SSRF示例2.3、SSRF防御2.3.1、过滤输入2.3.2、过滤输出 3、SS…

【知网检索稳定】第三届社会发展与媒体传播国际学术会议(SDMC 2023)

第三届社会发展与媒体传播国际学术会议(SDMC 2023) 2023 3rd International Conference on Social Development and Media Communication 第三届社会发展与媒体传播国际学术会议 (SDMC 2023)将于2023年11月03-05日在中国杭州召开。会议主题主要围绕社会…

【紫光同创国产FPGA教程】——【PGL22G第七章】串口收发实验例程

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGL22G开发平台(盘古22K) 一:盘古22K开发板(紫光同创PGL22G开…

PACS三维医学影像处理系统源码

三维医学图像处理系统(PACS)源码 系统概述: 影像归档和通信系统PACS集影像存储服务器、影像诊断工作站及RIS报告系统于一身,主要有图像处理模块、影像数据管理模块、RIS报告模块、光盘存档模块、DICOM通讯模块、胶片打印输出等模块组成&…

攻防世界-easychallenge

原题 解题思路 下载下来是一个pyc文件,还是反编译python工具 final就是flag,先经过异或,又经过base32加密。倒过来操作就行。

大数据Hadoop入门之集群的搭建

hadoop的三种运行模式 本地模式:测试本地的hadoop是否能够运行,用来运行官方的代码。伪分布模式:原先有人拿来测试,目前测试都不用这个模式了。完全分布模式:多台服务器组成分布式环境,生产环境使用 分布式主机文件同步命令 sc…

如何调试 C# Emit 生成的动态代码?

首先声明一下,这是一个很深的话题,也是朋友真实遇到的,它用 DynamicMethod ILGenerator 生成了很多动态方法,然而这动态方法中有时候经常会遇到溢出异常,寻求如何调试 动态方法体,我知道如果用 visual stu…

Java---多线程

并发编程 多线程 在同一段时间内一台计算机的内部有多个线程正在运行,一台计算机一次可以处理多个任务。 多线程的优点 提高CPU的利用率:计算机中一个任务的执行不是一直都会使用CPU,也有可能在任务执行的过程中出现缺少资源的情况&#…

骨传导耳机危害有哪些?骨传导耳机值得入手吗?

事实上,只要是正常使用,骨传导耳机并不会对身体造成伤害,并且在众多耳机种类中,骨传导耳机可以说是相对健康的一种耳机,这种耳机最独特的地方便是声波不经过外耳道和鼓膜, 而是直接将人体骨骼结构作为传声介…

mysql、MHA高可用配置即故障切换

MHA概述 一套优秀的MySQL高可用环境下故障切换和主从复制的软件 MHA的出现就是解决MySQL 单点的问题 MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换 MHA能在故障切换的过程中最大程度上保证数据的一致性以达到真正意义上的高可用 MHA的组成(核…

智能手机收入和出货量双双下滑,造车成本不断增长,小米集团仍面临风险

来源:猛兽财经 作者:猛兽财经 华尔街分析师对小米集团第二季度的业绩预测 在8月29日小米集团(01810)公布其2023年第二季度财报之前,华尔街分析师曾预测该公司第二季度的业绩将超出2023年第一季度的业绩。 根据S&P …

SpringBoot2.0(Spring读取配置文件常用方法,打war包在Tomcat中启动)

目录 一,SpringBoot中读取配置文件的常用方法1.1,使用Value读取1.2,使用ConfigurationProperties1.3,使用Environment1.4,自定义配置文件读取 二,SpringBoot部署war项目到tomcat9和启动原理 一,…

RabbitMq消息模型-队列消息

队列消息分为2种: 基本模型(SimpleQueue)、工作模型(WorkQueue) 队列消息特点: 消息不会丢失 并且 有先进先出的顺序。消息接收是有顺序的,不是随机的,仅有一个消费者能拿到数据&…

代码随想录算法训练营第五十六天|583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

583. 两个字符串的删除操作 文档讲解 : 代码随想录 - 583. 两个字符串的删除操作 状态:再次回顾。 动态规划五部曲: 确定dp数组(dp table)以及下标的含义 dp[i][j]:以i-1为结尾的字符串word1,和…

肖特基二极管SBD,SOD-123封装有哪些型号?

肖特基二极管,常用二极管之一,对于电子工程师来说,并不陌生。肖特基二极管,又称肖特基势垒二极管、热载流子二极管,英文Schottky Barrier Diode,缩写SBD,是利用金属-半导体(M-S)接触特性制成&am…

C语言:扫雷小游戏

文接上一篇博文C语言:三子棋小游戏。本篇博文是使用C语言来实现扫雷小游戏的。这里不对扫雷的规则进行赘述。玩家通过键盘输入坐标来探雷。博主在实现扫雷之前从未看过扫雷实现的相关视频,所以这里实现的扫雷完全是博主的原生思路,具有逻辑性…

用python开发一个炸金花小游戏

众所周知扑克牌可谓是居家旅行、桌面交友的必备道具, 今天我们用 Python 来实现一个类似炸金花的扑克牌小游戏,先来看一下基本的游戏规则。 炸(诈)金花又叫三张牌,是在全国广泛流传的一种民间多人纸牌游戏…

乐信仍面临资产质量下降和拖欠率上升风险

来源:猛兽财经 作者:猛兽财经 公司介绍 乐信(LX)成立于2013年10月,是中国领先的新消费数字科技服务商。旗下业务包括线上分期购物商城分期乐,全场景信用消费产品乐花卡,新型分期购物平台买吖,助力金融机构…

广告、政府、IT三重合作:凭爱校对轻松搞定文本质量

在广告创意、政府政策和IT开发这三个看似不相关的领域中,有一个共同的需求:高质量的文本内容。本文将探讨如何通过使用“爱校对”工具,在这三个行业内确保文本质量,从而提高工作效率和准确性。 广告行业:语境与创意的完…