Netty笔记(1) - Netty概述 和 框架结构
概述
- 基于NIO 的框架,目的是简化开发NIO的工作量
- 异步的 ,基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序
- Netty 是目前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、 通信行业等获得了广泛的应用
传统线程模型 和 Reactor模式
1. 传统 阻塞I/O 模型

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

又称为 反应器模式,分发者模式 通知者模式
特点:
Reactor 模式,通过一个或多个输入同时传递给服务处理器的模式(基于事件驱动)
服务器端程序处理传入的多个请求,并将它们同步分派到相应的处理线程, 因此Reactor模式也 叫Dispatcher模式(分发)
Reactor 模式使用IO复用监听事件, 收到事件后,分发给某个线程(进程)
如图所示,只需 ServiceHandler维护连接即可,并监听客户端发出的各种请求时间,并分类交由 对应的事件处理器处理,例如 连接事件,读请求,等等. 待处理完成后 ,并释放自身占用的线程.重复使用
Reactor 模式的三种实现:
单Reactor单线程:

实现思路:
服务器端用一个线程通过多路复用搞定所有的 IO 操作(包括连接,读、写等)
多客户端过来的连接 处理还是 业务处理都是同一个线程. 编码简单,清晰明了,但是如果客户端连接数量较多,将无法支撑( 接待员和服务员 是同一个人 )
单Reactor多线程

实现思路:
Reactor 对象通过select 监控客户端请求事件, 收到事件后,通过dispatch进行分发
如果建立连接请求, 则由Acceptor 通过accept 处理连接请求, 然后创建一个Handler对象处理完成连接后的各种事件
如果不是连接请求,则由reactor分发调用连接对应的handler 来处理
handler 只负责响应事件,不做具体的业务处理, 通过read 读取数据后,会分发给后面的worker线程池的某个线程处理业务
worker 线程池会分配独立线程完成真正的业务,并将结果返回给handler
handler收到响应后,通过send 将结果返回给client
Reator 仅仅只是接受各种事件,具体的工作由Worker线程池中Worker去处理,如果请求过多,单线程的Reator还是会出现瓶颈(一个接待员 多个服务员)
主从Reactor 多线程

Reactor主线程 MainReactor 对象通过select 监听连接事件, 收到事件后,通过Acceptor 处理连接事件
当 Acceptor 处理连接事件后,MainReactor 将连接分配给SubReactor
subreactor 将连接加入到连接队列进行监听,并创建handler进行各种事件处理
当有新事件发生时, subreactor 就会调用对应的handler处理
handler 通过read 读取数据,分发给后面的worker 线程处理
worker 线程池分配独立的worker 线程进行业务处理,并返回结果
handler 收到响应的结果后,再通过send 将结果返回给client
Reactor 主线程可以对应多个Reactor 子线程, 即MainRecator 可以关联多个SubReactor
监听请求的Reactor也变成多个,由主监听连接事件 由从监听其他事件 这样的组合也有可以有多个(多个接待员 多个服务员)
Netty模型

- Netty抽象出两组线程池 BossGroup 专门负责接收客户端的连接, WorkerGroup 专门负责网络的读写
- BossGroup 和 WorkerGroup 类型都是 NioEventLoopGroup
- NioEventLoopGroup 相当于一个事件循环组, 这个组中含有多个事件循环 ,每一个事件循环是NioEventLoop
- NioEventLoop 表示一个不断循环的执行处理任务的线程, 每个NioEventLoop 都有一个selector , 用于监听绑定在其上的socket的网络通讯
- NioEventLoopGroup 可以有多个线程, 即可以含有多个NioEventLoop
- 每个Boss NioEventLoop 循环执行的步骤有3步
- 轮询连接 事件
- 处理 连接 事件 , 与client建立连接 , 生成NioScocketChannel , 并将其注册到某个worker NIOEventLoop 上的 selector
- 处理任务队列的任务 , 即 runAllTasks
- 每个 Worker NIOEventLoop 循环执行的步骤
- 轮询read, write 事件
- 处理i/o事件, 即read , write 事件,在对应NioScocketChannel 处理
- 处理任务队列的任务 , 即 runAllTasks
- 每个Worker NIOEventLoop 处理业务时,会使用pipeline(管道), pipeline 中包含了 channel , 即通过pipeline 可以获取到对应通道, 管道中维护了很多的 处理器
Netty 将 Reactor 和 Handler 分别抽象为 BossGroup 和 WorkerGrop 其中每个Group中都维护了多个事件循环对象:NioEventLoop 每个事件循环 都保持一个for无限循环,监听其感兴趣的 事件发生 并处理 .
Netty笔记(1) - Netty概述 和 框架结构的更多相关文章
- Netty学习笔记(二)——netty组件及其用法
1.Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 原生NIO存在的问题 1) NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector.Se ...
- netty系列之:netty架构概述
目录 简介 netty架构图 丰富的Buffer数据机构 零拷贝 统一的API 事件驱动 其他优秀的特性 总结 简介 Netty为什么这么优秀,它在JDK本身的NIO基础上又做了什么改进呢?它的架构和 ...
- Netty笔记——技术点汇总
目录 · Linux网络IO模型 · 文件描述符 · 阻塞IO模型 · 非阻塞IO模型 · IO复用模型 · 信号驱动IO模型 · 异步IO模型 · BIO编程 · 伪异步IO编程 · NIO编程 · ...
- netty权威指南学习笔记二——netty入门应用
经过了前面的NIO基础知识准备,我们已经对NIO有了较大了解,现在就进入netty的实际应用中来看看吧.重点体会整个过程. 按照权威指南写程序的过程中,发现一些问题:当我们在定义handler继承Ch ...
- Netty 系列之 Netty 高性能之道
1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用 Netty4 + Thrift 压缩二进制编解码技术,他们实现了 10 W TPS(1 K 的复杂 POJO 对象)的跨 ...
- Netty系列之Netty高性能之道
转载自http://www.infoq.com/cn/articles/netty-high-performance 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Ne ...
- 转:Netty系列之Netty高性能之道
1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用 ...
- OGG学习笔记01-基础概述
OGG学习笔记01-基础概述 OGG(Oracle Golden Gate),最近几年在数据同步.容灾领域特别火,甚至比Oracle自己的原生产品DataGuard还要风光,主要是因为其跨平台.跨数据 ...
- Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!
Android群英传笔记--摘要,概述,新的出发点,温故而知新,可以为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席 ...
- TensorFlow笔记-01-开篇概述
人工智能实践:TensorFlow笔记-01-开篇概述 从今天开始,从零开始学习TensorFlow,有相同兴趣的同志,可以互相学习笔记,本篇是开篇介绍 Tensorflow,已经人工智能领域的一些名 ...
随机推荐
- Vue中is属性的用法 可以动态切换组件
is 是组件的一个属性,用来展示组件的名称 is和component联用哈 vue提供了component来展示对应的组件名称 compont是一个占位符,is这个属性,用来展示对应的组件名称 三个子 ...
- 【windows Server 2019系列】 构建IIS服务器
个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying Web服务器也称为WWW(World Wide W ...
- 华为云虚拟IP申请
在上一篇文章当中我们搭建好了我们的 Nginx,这节呢,我们主要就是搭建我们的 Keepalive 与 Haproxy,搭建之前我们首先不要将我们华为云上面的弹性公网IP给取消了后续在取消,这次我介绍 ...
- React框架运行机制
React框架运行主流程 1.JSX是JS语言的扩展,被babel编译后,会转换成React.creatElement(),这个方法返回的是一个虚拟DOM. 2.将虚拟DOM渲染到真实DOM的方法是R ...
- 深入浅出Java多线程(六):Java内存模型
引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第六篇内容:Java内存模型.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在并发编程中,有两个关键问题至关 ...
- Delphi - Case 可以多条件 指定在一起,今天才知道;逗号分隔
- Linux-查看文本中第m行到n行的内容
如何查看文件第6749行到6758行? 方式一:使用sed命令 不显示行号:sed -n 'M,Np' fileName 例如:sed -n '6749,6758p' hive-default.x ...
- Hive的基本概念
一.Hive基本概念 1.什么是Hive? hive是基于Hadoop的一个数据仓库工具,用来进行数据提取.转化.加载.可以存储.查询和分析存储在Hadoop中的大规模数据. hive数据仓库工具能将 ...
- 用set做一轮无重复纯随机
前端时间面腾讯的时候,一位老师问了一个相当有趣的问题:假设存在一个音乐播放器,里面有一个100首歌的歌单.现在需要做一个随机播放功能,要求不重复的随机播放完一百首歌.当时脑子短路了没想出来,几天突然意 ...
- NC20650 可爱の星空
题目链接 题目 题目描述 "当你看向她时,有细碎星辰落入你的眼睛,真好."--小可爱 在一个繁星闪烁的夜晚,卿念和清宇一起躺在郊外的草地上,仰望星空. 星语心愿,他们,想把这片星空 ...