Netty网络通信模型

传统IO模型:

传统IO模型就是阻塞IO,即处理业务逻辑的线程去进行IO,当然IO操作很耗时,然后线程就得阻塞,当然CPU会回收该线程的时间片,把该线程挂起,切换到其他线程去执行,在并发量大的场景中,会造成大量的线程切换,而每一次线程切换都会消耗一定的资源,造成性能低下。

Netty是什么:

Netty是一个基于Java NIO(非阻塞IO)的异步事件驱动的网络应用框架,它提供了高性能、可扩展和易于使用的网络编程接口。

Netty做了件什么事情呢,就是把业务逻辑线程从IO操作中解放出来了,它内部搞了线程池,这个线程池里面的线程专门负责去做IO,但是对外表现出来,业务逻辑线程只要过来就立刻可以拿到它想要的内容而不需要去做IO操作了。

Netty的网络模型基于Reactor模式。首先来看看什么是Reactor模式。

Reactor模式:

Reactor模式是一种基于事件驱动的设计模式,用于处理并发I/O操作。它的核心思想是将I/O操作和事件处理解耦,使得程序能够高效地处理多个并发的I/O请求。

Reactor模式由以下几个关键组件组成:

  1. Reactor:Reactor是事件分发器,负责接收并分发事件,一般只用一个线程足矣。它会监听各种事件,如连接请求、数据到达等,并将事件分发给对应事件处理器进行处理。

  2. Handlers:Handlers是事件处理器,负责实际处理事件,也就是实际去执行IO操作的线程,一般会弄一个线程池。当Reactor将事件分发给Handlers时,Handlers会执行相应的操作,如读取数据、写入数据等。

  3. Event:Event是发生的事件,如连接建立、数据到达等。它会被封装成事件对象,传递给Reactor进行分发。

  4. Event Loop:Event Loop是一个事件循环器,一般也是一个线程足矣。在Event Loop中,这个事件循环线程会不断地监听事件,并将事件分发给对应的事件处理器进行处理。

Reactor模式的工作流程如下:

  1. Reactor监听Event,并等待Event的到达。

  2. 当Event到达时,Reactor将Event封装成事件对象。

  3. Reactor将事件对象分发给对应的Handlers。

  4. Handlers执行相应的IO操作,如读取数据、写入数据等。

  5. 处理完事件后,Handlers将控制权交还给Reactor。

Reactor模式的出现就是为了解决线程处理I/O时的阻塞和频繁线程切换所带来的性能问题。通过避免线程的阻塞和频繁的线程切换,Reactor模式能够有效地提高程序的性能。相比于传统的线程模型,它可以处理更多的并发连接,提高了系统的吞吐量和响应性能。

总结起来,Reactor模式是一种基于事件驱动的设计模式,通过解耦I/O操作和事件处理,使程序能够高效地处理多个并发的I/O请求。它由Reactor、Handlers、Event和Event Loop等组件构成,通过事件分发和处理来实现并发处理。

Netty网络通信模型:

下面是Netty的网络通讯模型概述:

  1. Boss线程池:Boss线程池负责接受客户端的连接请求,并将连接注册到Worker线程池中的某个线程上进行处理。通常情况下,Boss线程池只有一个线程。Boss线程大致对应了Reactor模式中的Reactor。

  2. Worker线程池:Worker线程池负责处理实际的网络I/O操作,包括读取、写入和处理请求等。Worker线程池中可以有多个线程,每个线程都会被分配一个或多个连接进行处理。Worker线程池对应了Reactor模式中的Handlers。

  3. Channel、EventLoop和ChannelPipeline:Netty中的核心概念是Channel、EventLoop和ChannelPipeline。一个Channel代表一个实际的网络连接,EventLoop是一个处理事件的循环,而ChannelPipeline则是一个处理事件的管道。EventLoop对应了Reactor模式中的EventLoop。

  4. 事件驱动模型:Netty的网络模型是基于事件驱动的,当有事件发生时(如连接建立、数据到达等),Netty会将事件封装成事件对象并派发给对应的事件处理器进行处理。事件处理器可以是用户自定义的处理器,也可以是Netty提供的预定义处理器。

  5. 异步和非阻塞:Netty采用异步和非阻塞的方式进行网络操作,这意味着它可以同时处理多个连接,并且不会因为某个连接的慢速操作而阻塞其他连接的处理。

总的来说,Netty的网络模型基于Reactor模式,通过Boss线程池接受连接请求并将连接注册到Worker线程池中的某个线程上进行IO处理。Netty采用异步和非阻塞的方式进行网络操作,通过事件驱动模型和ChannelPipeline来处理网络事件。这种模型使得Netty在高性能、可扩展和易于使用方面具有优势,并广泛应用于构建高性能的网络应用程序。

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

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

相关文章

我干了8年测试,告诉你现在软件测试还能不能找到工作!

观点:如果你还是以前的思维来学习测试,那你肯定是找不到工作! 我做测试工作有将近8年的时间,蚂蚁金服做过2年,因为加班太多离职了。目前在一家国企上市公司,一年能拿三四十个左右,对比头部互联…

可视化 | echarts饼图改编

echarts模板来源 📚改编点 🐇基本样式 去掉legend、label:show: false背景透明:backgroundColor: "transparent"去除功能标签添加载入动态animationEasing: elasticOut, animationDelay: function (idx) {return Mat…

【数据结构】顺序表 | 详细讲解

在计算机中主要有两种基本的存储结构用于存放线性表:顺序存储结构和链式存储结构。本篇文章介绍采用顺序存储的结构实现线性表的存储。 顺序存储定义 线性表的顺序存储结构,指的是一段地址连续的存储单元依次存储链性表的数据元素。 线性表的&#xf…

MyBatis Plus—CRUD 接口

Service CRUD 接口 说明: 通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,泛型 T 为任意实体对象建议如果存在自定义通用 Servi…

10-Docker-分布式存储算法

01-哈希取余算法分区 哈希取余分区(Hash Modulus Partitioning)是一种在分布式计算和数据存储中常用的分区策略,其目的是将数据或计算任务分配到多个节点或服务器上,以实现负载均衡和提高性能。这种分区策略的核心思想是使用哈希…

通过商品ID获取到京东商品详情页面数据,京东商品详情官方开放平台API接口,京东APP详情接口,可以拿到sku价格,销售价演示案例

淘宝SKU详情接口是指,获取指定商品的SKU的详细信息。SKU是指提供不同的商品参数组合的一个机制,通过不同的SKU来标识商品的不同组合形式,如颜色、尺寸等。SKU详情接口可以帮助开发者获取指定商品的SKU列表,以及每个SKU的属性、库存…

VirtualBox网络地址转换(NAT),宿主机无法访问虚拟机的问题

问题:NAT模式下,默认只能从内访问外面,而不能从外部访问里面,所以只能单向ping通,虚拟机的ip只是内部ip。 PS:桥接则是与主机公用网卡,有独立的外部ip。 解决:NAT模式可以通过配置 …

第十八章 Swing 程序设计

目录 概述 Swing常用窗体 JFrame 窗体 JDialog 对话框 JOptionPane 小型对话框 1.自定义对话框 2.确认框 3.输入框 4.通知框 常用布局管理器 null绝对布局 FlowLayout 流布局管理器 BorderLayout 边界布局管理器 GridLayout 网络布局管理器 常用面板 JPa…

Servlet作业小练习

一.题目 利用JavaBean实现用户类,包含姓名、性别、爱好,爱好需要用多选框 实现表单1进行获取数据,表单2显示获取结果。 利用Servlet实现逻辑代码 二.实现效果 三.具体实现 1.User实体类 package com.hjj.pojo.hw9;/*** author:嘉佳 Dat…

Halcon的相机内参外参的标定

halcon标定相机内参只能使用方向标定板和圆点标定板。并且方向标定板可也可用性极高。 1.打开halcon的标定助手,选择标定板的描述文件,填写标定板的厚度,根据相机选择像元的尺寸和镜头的焦距。如果已有相机内参,只标定外参&#…

SpringMVC--@RequestMapping注解

RequestMapping注解 RequestMapping注解的功能RequestMapping注解的位置RequestMapping注解的属性1、value属性2、method属性3、params属性(了解) 补充RequestParamRequestHeaderRequestBody RequestBody获取json格式的请求参数 ResponseBodyRestControl…

设计模式(3)-结构型模式

结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则…

SpringBoot 监听机制

Java 监听机制 SpringBoot 的监听机制,其实是对Java提供的事件监听机制的封装。 Java中的事件监听机制定义了以下几个角色: 事件:Event,继承 java.util.EventObject 类的对象事件源:Source ,任意对象Obje…

计算机网络第4章-通用转发和SDN

引子: 在前面,我们将基于目的地转发的特征总结为两个步骤: 查找目的IP地址(匹配),然后将分组发送到有特定输出端口的交换结构(“动作”)。 但是这种转发特征会带来许多问题&#…

webpack babel

构建工具 简介 当我们习惯了在node中编写代码的方式后,在回到前端编写html、css、js这些东西会感觉到各种的不便。比如:不能放心的使用模块化规范(浏览器兼容性问题)、即使可以使用模块化规范也会面临模块过多时的加载问题。我们…

SQL中实现汉字的拼音首字母查询

由于汉语拼音首字母也就23个,该方法利用汉字字符按拼音字母排序的特点来生成对应的拼单首字母,只需找到这23个汉语拼音首字母中分别排序在第一的汉字生成23条临时表数据用于参照,即可简单实现汉字匹配拼音首字母 CREATE FUNCTION f_GetPyAcr…

【图论实战】Boost学习 02:基本类型

/* 顶点 */ // 描述 typedef boost::graph_traits < graph_t >::vertex_descriptor vertex_descriptor; // 迭代器方式一&#xff1a;vp中的一对迭代器分别指向第一个顶点和最后的一个顶点之后 typedef boost::graph_traits < graph_t >::vertex_iterator vi…

【Excel】函数sumif范围中符合指定条件的值求和

SUMIF函数是Excel常用函数。使用 SUMIF 函数可以对报表范围中符合指定条件的值求和。 Excel中sumif函数的用法是根据指定条件对若干单元格、区域或引用求和。 sumif函数语法是&#xff1a;SUMIF(range&#xff0c;criteria&#xff0c;sum_range) sumif函数的参数如下&#xff…

多测师肖sir___接口自动化测试框架(python+request+unittest+ddt)

接口自动化测试框架 一、接口自动化测试框架&#xff08;pythonrequestunittestddt&#xff09; 首先我们新建一个新项目:名称zdh 二、在一个项目中&#xff1a;新建6个包 第一个包conf包用来填写配置参数、地址等 第二个包data 包用来存放测试用例的表格 第三个包report 包用来…

vscode 终端进程启动失败: shell 可执行文件“C:\Windows\System32\WindowsPower

vscode 终端进程启动失败: shell 可执行文件“C:\Windows\System32\WindowsPower 第一次用vscode&#xff0c;然后遇到这个问题&#xff0c;在设置里搜索 terminal.integrated.defaultProfile.windows 将这里的null改成"Command Prompt" 重启就可以了