netty的介绍和架构设计

2023-11-09

转自尚硅谷、黑马和各位大神的文章

netty是什么
Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端

Netty 高性能架构设计
线程模型基本介绍

不同的线程模式,对程序的性能有很大影响,为了搞清 Netty 线程模式,我们来系统的讲解下各个线程模式,最后看看 Netty 线程模型有什么优越性。
目前存在的线程模型有:传统阻塞 I/O 服务模型 和Reactor 模式
根据 Reactor 的数量和处理资源池线程的数量不同,有 3 种典型的实现
单 Reactor 单线程;
单 Reactor多线程;
主从 Reactor多线程:Netty 线程模式(Netty 主要基于主从 Reactor 多线程模型做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor)

主从 Reactor 多线程

在这里插入图片描述

  1. Reactor 主线程 MainReactor 对象通过 select 监听连接事件,收到事件后,通过 Acceptor 处理连接事件
  2. 当 Acceptor 处理连接事件后,MainReactor 将连接分配给 SubReactor
  3. subreactor 将连接加入到连接队列进行监听,并创建 handler 进行各种事件处理
  4. 当有新事件发生时,subreactor 就会调用对应的 handler 处理
  5. handler 通过 read 读取数据,分发给后面的 worker 线程处理
  6. worker 线程池分配独立的 worker 线程进行业务处理,并返回结果
  7. handler 收到响应的结果后,再通过 send 将结果返回给 client
  8. Reactor 主线程可以对应多个 Reactor 子线程,即 MainRecator 可以关联多个 SubReactor

Reactor 模式具有如下的优点
响应快,不必为单个同步时间所阻塞,虽然 Reactor 本身依然是同步的(比如你第一个SubReactor阻塞了,我可以调下一个 SubReactor为客户端服务)
可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销
扩展性好,可以方便的通过增加 Reactor 实例个数来充分利用 CPU 资源
复用性好,Reactor 模型本身与具体事件处理逻辑无关,具有很高的复用性

Netty工作原理示意图

在这里插入图片描述

  1. Netty 抽象出两组线程池 ,BossGroup 专门负责接收客户端的连接,WorkerGroup 专门负责网络的读写
  2. BossGroup 和 WorkerGroup 类型都是 NioEventLoopGroup
  3. NioEventLoopGroup 相当于一个事件循环组,这个组中含有多个事件循环,每一个事件循环是 NioEventLoop
  4. NioEventLoop 表示一个不断循环的执行处理任务的线程,每个 NioEventLoop 都有一个Selector,用于监听绑定在其上的 socket 的网络通讯
  5. NioEventLoopGroup 可以有多个线程,即可以含有多个 NioEventLoop
  6. 每个 BossGroup下面的NioEventLoop 循环执行的步骤有 3 步
    轮询 accept 事件
    处理 accept 事件,与 client 建立连接,生成 NioScocketChannel,并将其注册到某个 workerGroup NIOEventLoop 上的 Selector
    继续处理任务队列的任务,即 runAllTasks
  7. 每个 WorkerGroup NIOEventLoop 循环执行的步骤
    轮询 read,write 事件
    处理 I/O 事件,即 read,write 事件,在对应 NioScocketChannel 处理
    处理任务队列的任务,即 runAllTasks
  8. 每个 Worker NIOEventLoop 处理业务时,会使用 pipeline(管道),pipeline 中包含了
    channel(通道),即通过 pipeline 可以获取到对通道,管道中维护了很多的处理器。(这个点目前只是简单的讲,后面重点说)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

netty的介绍和架构设计 的相关文章

  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 关于微信小程序中左上角返回键触发事件

    此时在详情页点击收藏按钮之后 点击页面左上角的返回事件 需要在列表页同时显示收藏标志 收藏是存在缓存里面的 此时如果列表页想要获取收藏的缓存 不能在onLoad函数中获取缓存 需要在onShow函数中获取 这样页面的图标才会同步显示
  • C语言 json parser - JSMN

    项目地址 GitHub zserge jsmn Jsmn is a world fastest JSON parser tokenizer This is the official repo replacing the old one at
  • python总结——对象

    目录 一 对象的知识 二 对象在内存的存储 一 对象的知识 1 python中 一切皆对象 每个对象有 标识 地址 类型 数据类型 值组成 2 对象的本质 一个内存块 拥有特定的值 支持特定类型的相关操作 3 对象存储在堆 变量存储在栈 变
  • Servlet+JDBC实战开发书店项目讲解第三篇:商品查询实现

    Servlet JDBC实战开发书店项目讲解第三篇 商品查询实现 本篇博客将介绍如何在Servlet JDBC实战开发书店项目中实现商品查询功能 我们将从设计数据库表结构和实体类开始 一步一步详细讲解代码实现过程 包括前端页面的设计和后端S
  • 使用 MCGS 脚本实现开机页面倒数三秒跳转功能

    创建窗口及组件 新建两个窗口 窗口0 与窗口1 其中 窗口0为欢迎界面 窗口1为跳转后界面 在窗口0界面中 添加一个输入框 以方便观看数据的计时情况 实际工程中 是插入图片 以显示欢迎界面 在窗口1 中 添加文本 跳转成功 创建变量 在实时
  • 【 VScode上配置c++编译环境出现报错】

    VScode上配置c 编译环境出现报错 在写好launch json代码 tasks json代码 c cpp properties json代码之后 点击运行第一个 HelloWorld cpp 代码 却出现 No such file o
  • Maven高级

    回顾 1 文件上传 fileupload MultipartFile 将上传的文件保存到硬盘上 获取文件名 2 restful url书写的一种风格 http localhost user 1 springmvc支持restful Post
  • 最小二乘法的拟合原理

    一 最小二乘法的拟合原理 根据 数学指南 书中的解释 图2 数学指南 中对最小二乘法的解释 上面这段话 枯燥且无趣 大家不用厌恶 数学向来这个样子 现在 我们来慢慢认识上面这段话的意思 这句话的意思是说 拟合有两个前提 1 要有N个不同的点
  • 机械手臂c语言如何编程,一种串联机械手臂的示教编程方法

    一种串联机械手臂的示教编程方法 技术领域 0001 本发明涉及一种串联机械手臂的示教编程方法 具体的说是通过体感设备和数据手套检测人的手臂的姿态变化 并且通过计算转换为机器人手臂关节角度的变化 并保存关节角度 完成示教编程 属于机器人及控制
  • idea的使用技巧

    idea的使用技巧 一 断点调试 1 源断点 要输出每一次的参数信息 System out print不应该使用它 它是一个同步方法 是线程安全 过多时会挤占线程 占用资源 内部实现 public void println int x sy
  • java word转pdf

    这里找了三种比较简单的工具 poi jacob和aspose poi 注意 版本不太高 版本太高有报错 依赖
  • axios 使用总结

    功能简介 axios是第三方封装库 作用是在框架中使用数据请求 安装 npm install axios S 在Vue 项目文件中的main js 文件 定义axios请求类的全局引用 核心代码如下 特点 1 它在浏览器中创建的是浏览器对象
  • IDEA查看某个类的某个方法或该类在哪里被调用或引用

    1 方法的话鼠标定位到该方法名 右键Find Usages 或直接快捷键 Alt F7 这样的话就会显示 2 类的话 也是定位到文件夹下的Java类文件 或者定位到 public class 类名这里 右键Find Usages
  • keil勾选Use MicroLIB 的作用

    MicroLib是一个针对用C编写的基于ARM的嵌入式应用程序的高度优化的库 与包含在ARM编译器工具链中的标准C库相比 MicroLib提供了许多嵌入式系统所需的代码大小的显著优势 下图对使用标准库和使用微库代码大小进行了对比 Micro
  • 联想原装系统OEM系统联想出厂系统联想原装系统 Lenovo ThinkPad ThinkBook拯救者出厂预装系统原厂系统

    系统镜像是在联想服务器下载 百分百的出厂预装正版系统 驱动完善 自带预装Office 自带一键恢复 联网即可激活系统 根据个人电脑配对的型号配置下载恢复 安装完恢复隐藏分区 带一键还原功能 和出厂时的系统状态一致 文件地址https pan
  • python好用的第三方库_如何学习使用第三方库

    如何学习使用第三方模块 得益于python强大的开源社区 我们在使用python开发项目时 可以几乎可以做到全程拿来主义 需要什么 就百度好了 总会有人已经实现了你需要的功能模块 你所需要做的仅仅是使用pip命令安装他们 虽然你不必重复造轮
  • 改变金融贷款市场营销方式 ---- 运营商大数据精准获客

    与传统的企业网络营销相比 最常见的是网络推广和硬广告推广 一些企业无法找到可靠准确的数据来源 也无法找到一些未知的总数据 这些数据大多存在持续时间长 准确性差的缺点 企业在将这些数据信息应用于商品在线营销时往往会遇到不足 在当前的数据和信息
  • 搜索引擎的小技巧:site,+,- 等指令的使用

    1 把搜索范围限定在网页标题中 intitle 网页标题通常是对网页内容提纲挈领式的归纳 把查询内容范围限定在网页标题中 有时能获得良好的效果 使用的方式 是把查询内容中 特别关键的部分 用 intitle 领起来 例如 找林青霞的写真 就
  • java springboot 项目打包成 exe应用

    前期准备 将项目打成jar包 将jdk目录中的jre和jar包放到同一个目录下 如果没有jre则需要去官网下载一份 地址 https www oracle com java technologies javase javase8u211 l
  • netty的介绍和架构设计

    转自尚硅谷 黑马和各位大神的文章 netty是什么 Netty 是一个异步的 基于事件驱动的网络应用框架 用于快速开发可维护 高性能的网络服务器和客户端 Netty 高性能架构设计 线程模型基本介绍 不同的线程模式 对程序的性能有很大影响