概述

  1. 基于NIO 的框架,目的是简化开发NIO的工作量
  2. 异步的 ,基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序
  3. Netty 是目前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、 通信行业等获得了广泛的应用

传统线程模型 和 Reactor模式

1. 传统 阻塞I/O 模型



写过原生java socket编程的都清楚 , client每次连接都会创建一个线程 用于维护连接,如果没有数据读取,线程也会一直保持阻塞,连接一多,及其耗费系统资源.

2.Reactor模式



又称为 反应器模式,分发者模式 通知者模式

特点:

  • Reactor 模式,通过一个或多个输入同时传递给服务处理器的模式(基于事件驱动)

  • 服务器端程序处理传入的多个请求,并将它们同步分派到相应的处理线程, 因此Reactor模式也 叫Dispatcher模式(分发)

  • Reactor 模式使用IO复用监听事件, 收到事件后,分发给某个线程(进程)

如图所示,只需 ServiceHandler维护连接即可,并监听客户端发出的各种请求时间,并分类交由 对应的事件处理器处理,例如 连接事件,读请求,等等. 待处理完成后 ,并释放自身占用的线程.重复使用

Reactor 模式的三种实现:

单Reactor单线程:



实现思路:

  1. 服务器端用一个线程通过多路复用搞定所有的 IO 操作(包括连接,读、写等)

  2. 多客户端过来的连接 处理还是 业务处理都是同一个线程. 编码简单,清晰明了,但是如果客户端连接数量较多,将无法支撑( 接待员和服务员 是同一个人 )

单Reactor多线程



实现思路:

  1. Reactor 对象通过select 监控客户端请求事件, 收到事件后,通过dispatch进行分发

  2. 如果建立连接请求, 则由Acceptor 通过accept 处理连接请求, 然后创建一个Handler对象处理完成连接后的各种事件

  3. 如果不是连接请求,则由reactor分发调用连接对应的handler 来处理

  4. handler 只负责响应事件,不做具体的业务处理, 通过read 读取数据后,会分发给后面的worker线程池的某个线程处理业务

  5. worker 线程池会分配独立线程完成真正的业务,并将结果返回给handler

  6. handler收到响应后,通过send 将结果返回给client

Reator 仅仅只是接受各种事件,具体的工作由Worker线程池中Worker去处理,如果请求过多,单线程的Reator还是会出现瓶颈(一个接待员 多个服务员)

主从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也变成多个,由主监听连接事件 由从监听其他事件 这样的组合也有可以有多个(多个接待员 多个服务员)

Netty模型

  1. Netty抽象出两组线程池 BossGroup 专门负责接收客户端的连接, WorkerGroup 专门负责网络的读写
  2. BossGroup 和 WorkerGroup 类型都是 NioEventLoopGroup
  3. NioEventLoopGroup 相当于一个事件循环组, 这个组中含有多个事件循环 ,每一个事件循环是NioEventLoop
  4. NioEventLoop 表示一个不断循环的执行处理任务的线程, 每个NioEventLoop 都有一个selector , 用于监听绑定在其上的socket的网络通讯
  5. NioEventLoopGroup 可以有多个线程, 即可以含有多个NioEventLoop
  6. 每个Boss NioEventLoop 循环执行的步骤有3步
  • 轮询连接 事件
  • 处理 连接 事件 , 与client建立连接 , 生成NioScocketChannel , 并将其注册到某个worker NIOEventLoop 上的 selector
  • 处理任务队列的任务 , 即 runAllTasks
  1. 每个 Worker NIOEventLoop 循环执行的步骤
  • 轮询read, write 事件
  • 处理i/o事件, 即read , write 事件,在对应NioScocketChannel 处理
  • 处理任务队列的任务 , 即 runAllTasks
  1. 每个Worker NIOEventLoop 处理业务时,会使用pipeline(管道), pipeline 中包含了 channel , 即通过pipeline 可以获取到对应通道, 管道中维护了很多的 处理器

Netty 将 Reactor 和 Handler 分别抽象为 BossGroup 和 WorkerGrop 其中每个Group中都维护了多个事件循环对象:NioEventLoop 每个事件循环 都保持一个for无限循环,监听其感兴趣的 事件发生 并处理 .

Netty笔记(1) - Netty概述 和 框架结构的更多相关文章

  1. Netty学习笔记(二)——netty组件及其用法

    1.Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 原生NIO存在的问题 1) NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector.Se ...

  2. netty系列之:netty架构概述

    目录 简介 netty架构图 丰富的Buffer数据机构 零拷贝 统一的API 事件驱动 其他优秀的特性 总结 简介 Netty为什么这么优秀,它在JDK本身的NIO基础上又做了什么改进呢?它的架构和 ...

  3. Netty笔记——技术点汇总

    目录 · Linux网络IO模型 · 文件描述符 · 阻塞IO模型 · 非阻塞IO模型 · IO复用模型 · 信号驱动IO模型 · 异步IO模型 · BIO编程 · 伪异步IO编程 · NIO编程 · ...

  4. netty权威指南学习笔记二——netty入门应用

    经过了前面的NIO基础知识准备,我们已经对NIO有了较大了解,现在就进入netty的实际应用中来看看吧.重点体会整个过程. 按照权威指南写程序的过程中,发现一些问题:当我们在定义handler继承Ch ...

  5. Netty 系列之 Netty 高性能之道

    1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用 Netty4 + Thrift 压缩二进制编解码技术,他们实现了 10 W TPS(1 K 的复杂 POJO 对象)的跨 ...

  6. Netty系列之Netty高性能之道

    转载自http://www.infoq.com/cn/articles/netty-high-performance 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Ne ...

  7. 转:Netty系列之Netty高性能之道

    1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用 ...

  8. OGG学习笔记01-基础概述

    OGG学习笔记01-基础概述 OGG(Oracle Golden Gate),最近几年在数据同步.容灾领域特别火,甚至比Oracle自己的原生产品DataGuard还要风光,主要是因为其跨平台.跨数据 ...

  9. Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!

    Android群英传笔记--摘要,概述,新的出发点,温故而知新,可以为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席 ...

  10. TensorFlow笔记-01-开篇概述

    人工智能实践:TensorFlow笔记-01-开篇概述 从今天开始,从零开始学习TensorFlow,有相同兴趣的同志,可以互相学习笔记,本篇是开篇介绍 Tensorflow,已经人工智能领域的一些名 ...

随机推荐

  1. Fabric区块链浏览器(2)

    本文是区块链浏览器系列的第四篇. 在上一篇文章介绍如何解析区块数据时,使用session对客户端上传的pb文件进行区分,到期后自动删除. 在这片文章中,会着重介绍下认证系统的实现,主要分为三部分: 添 ...

  2. 基于文心大模型套件ERNIEKit实现文本匹配算法,模块化方便应用落地

    文心大模型,产业级知识增强大模型介绍 官网:https://wenxin.baidu.com/ 项目链接见文末 文心大模型开发套件ERNIEKit,面向NLP工程师,提供全流程大模型开发与部署工具集, ...

  3. MakeFile文件的使用 [补档-2023-07-13]

    makefile-gdb文件 ​ 可以在文件中指定那些文件可以先进行编译,那些文件可以后进行编译,那些文件可以重新编译.他可以自动化编译程序.... 6-1 makefile基本规则 ​ 如下: ​ ...

  4. C#中DataTable数据导出为HTML格式文件

    /// <summary> /// DataTable导出为HTML的Table并保存到本地 /// </summary> /// <param name="d ...

  5. 体验 ABP 的功能和服务

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. ABP是一个全栈开发框架,它在企业解决方案的各个方面都有许多构建模块.在前面三章中 ...

  6. LeetCode组合总和I~IV和背包问题小结

    一.组合总和问题 最近在看leetcode的组合问题,一共四道,总结一下共通之处与不同之处. 原题链接: 组合总和 组合总和II 组合总和III 组合总和IV 对比如下,为了便于对比,将原题目的叙述方 ...

  7. 云计算 - 对象存储服务OSS技术全解

    本文全面深入地探讨了对象存储服务(OSS)的核心技术.基础知识和高级功能.从媒体存储到数据备份,再到数据仓库与数据湖,我们不仅解析了OSS在各种应用场景下的关键角色,还深入讨论了其与机器学习.多媒体处 ...

  8. Power BI 11 DAY

    目录 电商平台流量分析 流量相关指标 流量数量指标 流量质量指标 度量值计算公式 流量转化率重要指标 指标观测维度 电商平台流量分析 电商平台黄金公式:销售额 = 流量 + 转化率 + 客单价 流量相 ...

  9. Windows OhmGraphite 配置

    Windows OhmGraphite 配置 由于windows_exporter无法监控温度相关的指标,那么就需要使用OhmGraphite进行监控该指标. 下载 访问 https://github ...

  10. NC23803 DongDong认亲戚

    题目链接 题目 题目描述 DongDong每年过春节都要回到老家探亲,然而DongDong记性并不好,没法想起谁是谁的亲戚(定义:若A和B是亲戚,B和C是亲戚,那么A和C也是亲戚),她只好求助于会编程 ...