目录
-
- 一、Neety官网简介
- 二、Netty的优点
-
- 1、设计优雅
- 2、使用方便
- 3、性能高,吞吐量高
- 4、安全
- 5.社区活跃,不断更新
- 三、线程模型基本介绍
- 四、Reactor 模式
-
- 1、基于 I/O 复用模型
- 2.基于线程池复用线程资源
- 五、Reactor 模型的核心组成
-
- 1、Reactor
- 2、Handlers
- 六、Reactor 模式分类
- 七、单 Reactor 分析单线程的优缺点
-
- 1、优点
- 2、缺点~性能问题
- 3、缺点~可靠性问题
- 4、使用场景
- 八、单Reactor多线程
-
- 1、单Reactor多线程结构图
- 2、单Reactor分析多线程方案的优缺点:
- 九、主从 Reactor 多线程
-
- 解释方案的优缺点:
- 十、Reactor 模式小结
-
- 1.用生活案例理解三种模式
- 2、Reactor 该模型具有以下优点:
- 十一、关注公众号哪吒编程,回复1024,获取Java学习资料、不定期送书活动
一、Neety官网简介
1、Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供基于事件驱动的异步网络 网络应用程序框架用于快速开发高性能、高可靠性的网络 IO 程序。 2、Netty 它可以帮助您快速、简单地开发网络应用程序,相当于简化和流程 NIO 的 开发过程。 3、Netty 是目前最流行的 NIO 框架,Netty 游泳 戏剧产业、通信产业等得到了广泛的应用,知名 Elasticsearch 、Dubbo 框架内采摘 用了 Netty。
二、Netty的优点
Netty 对 JDK 自带的 NIO 的 API 包装解决了上述问题。
1、设计优雅
适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展 事件模型可以清晰地分离注意力;高度可定制的线程模型 - 单线程,一个或多个 线程池。
2、使用方便
详细记录的 Javadoc,用户指南和示例;没有其他依赖项,JDK 5(Netty 3.x)或 6(Netty 4.x)就足够了。
3、性能高,吞吐量高
减少资源消耗;减少不必要的内存复制。
4、安全
完整的 SSL/TLS 和 StartTLS 支持。
5.社区活跃,不断更新
社区活跃,版本迭代周期短,发现 Bug 可及时修复, 同时,将添加更多的新功能。
三、线程模型基本介绍
1.不同的线程模式对程序的性能有很大的影响。Netty 我们来系统线程模式 的讲解下 各线程模式, 最后看看Netty 线程模型的优点是什么? 2.现有的线程模型有: 传统阻塞 I/O 服务模型 Reactor 模式。 3、根据 Reactor 的数量和处理资源池线程的数量不同,有 3 典型的实现
- 单 Reactor 单线程;
- 单 Reactor 多线程;
- 主从 Reactor 多线程。
4、Netty 线程模式,Netty 主要以主从为基础 Reactor 在一定程度上改进了多线程模型,主从 Reactor 多线程模型多 Reactor。
四、Reactor 模式
传统的阻塞 I/O 服务模型的 2 解决方案:
1、基于 I/O 复用模型
多个连接共享一个阻塞对象,应用程序只需要在一个阻塞对象等 等待,等待所有连接,无需堵塞。当一个连接有新的数据可以处理时,应通知操作系统 使用程序,线程从阻塞状态返回,开始业务处理 Reactor 对应的名称:
- 反应器模式
- 分发者模式(Dispatcher)
- 通知者模式(notifier) 。
2.基于线程池复用线程资源
无需为每个连接创建线程,连接完成后的业务处理 任务分配到线程处理,一个线程可以处理多个连接的业务。
I/O 复用结合线程池 Reactor 模型的基本设计理念
(1)Reactor 通过一个或多个输方式 同时传输给服务处理器的模式 (基于事件驱动) . (2)服务器端程序处理传入的多个请求, 并将它们同步分派到相应的处理线 程, 因此Reactor模式也叫 Dispatcher模式. (3)Reactor 模式使用IO重用监听事件, 收到事件后,分发到线程(进入 程), 这是网络服务器高并发处理的关键。
五、Reactor 模型的核心组成
1、Reactor
Reactor 在单独的线程中运行,监控和分发事件,并将其分发到适当的地方 理程序来对 IO 事件做出反应。 它就像公司的电话接线员,它接听来自客户的电话并 将线路转移到合适的联系人;
2、Handlers
执行处理程序 I/O 事件要完成的实际事件类似于客户想要与之交谈的公众 实际官员。Reactor 通过调度适当的处理程序来响应 I/O 事件,执行处理程序非阻塞操作。
六、Reactor 模式分类
根据 Reactor 资源池线程的数量与处理资源池线程的数量不同 3 典型的实现
- 单 Reactor 单线程
- 单 Reactor 多线程
- 主从 Reactor 多线程
单 Reactor 单线程工作原理示意图
1、Select 是前面 I/O 复用模型介绍的标准网络编程 API,应用程序可以通过一个障碍实现 多路连接请求监控塞对象。 2、Reactor 对象通过 Select 监控客户端请求事件,收到事件后通过 Dispatch 进行分发。 3.建立连接请求事件的,由 Acceptor 通过 Accept 处理连接请求,然后创建一个 Handler 对象处理连接完成后的后续业务处理。 4.如果连接事件没有建立,则 Reactor 会分发调用连接对应的 Handler 来响应。 5、Handler 会完成 Read→业务处理→Send 完整的业务流程 结合实例:服务器端通过多路复用,使用一个线程完成一切 IO 操作(包括连接、读写 等),编码简单清晰,但如果客户端连接数量较多,将无法支撑,前面 NIO 案例属于这种模型。
七、单 Reactor 分析单线程的优缺点
1、优点
模型简单,无多线程、过程通信、竞争问题,全部在一个线程中完成。
2、缺点~性能问题
只有一个线程不能充分发挥多核 CPU 的性能。Handler 在处理某 在连接业务中,整个过程无法处理其他连接事件,容易导致性能瓶颈。
3、缺点~可靠性问题
意外终止线程或进入死循环会导致整个系统的通信模块失败 无法接收和处理外部信息,导致节点故障。
4、使用场景
客户端的数量有限,业务处理非常快速,比如 Redis在业务处理的时间复 杂度 O(1) 的情况。
八、单Reactor多线程
1、单Reactor多线程结构图
针对单 Reactor 多线程模型中,Reactor 在单线程中运行,高并发场景下容易成为性能瓶颈,可以让 Reactor 在多线程中运行。
- Reactor 对象通过select 监控客户端请求 事件, 收到事件后,通过dispatch进行分发。
- 如果建立连接请求, 则右Acceptor 通过 accept 处理连接请求, 然后创建一个Handler对象 处理完成连接后的各种事件、
- 如果不是连接请求,则由reactor分发调用连接对 应的handler 来处理。
- handler 只负责响应事件,不做具体的业务处理, 通过read 读取数据后,会分发给后面的worker线 程池的某个线程处理业务。
- worker 线程池会分配独立线程完成真正的业务, 并将结果返回给handler 。
- handler收到响应后,通过send 将结果返回给 client。
2、单Reactor多线程方案优缺点分析:
1、优点:可以充分的利用多核cpu 的处理能力。 2、缺点:多线程数据共享和访问比较复杂, reactor 处理所有的事件的监听和响应,在 单线程运行, 在高并发场景容易出现性能瓶颈.
九、主从 Reactor 多线程
方案优缺点说明:
1、优点:父线程与子线程的数据交互简单职责明确,父线程只需要接收新连接,子线 程完成后续的业务处理。 2、优点:父线程与子线程的数据交互简单,Reactor 主线程只需要把新连接传给子线 程,子线程无需返回数据。 3、缺点:编程复杂度较高 结合实例:这种模型在许多项目中广泛使用,包括 Nginx 主从 Reactor 多进程模型, Memcached 主从多线程,Netty 主从多线程模型的支持。
十、Reactor 模式小结
1、三种模式用生活案例来理解
- 单 Reactor 单线程,前台接待员和服务员是同一个人,全程为顾客服。
- 单 Reactor 多线程,1 个前台接待员,多个服务员,接待员只负责接待。
- 主从 Reactor 多线程,多个前台接待员,多个服务生 。
2、Reactor 模式具有如下的优点:
- 响应快,不必为单个同步时间所阻塞,虽然 Reactor 本身依然是同步的。
- 可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程 的切换开销。
- 扩展性好,可以方便的通过增加 Reactor 实例个数来充分利用 CPU 资源。
- 复用性好,Reactor 模型本身与具体事件处理逻辑无关,具有很高的复用性。
十一、关注公众号哪吒编程,回复1024,获取Java学习资料,还有不定期的送书活动
- 轻松学 MySQL数据库从入门到实战
- 极简Java(案例·视频)
- Spirng5设计模式
- Vue.js 3.0 从入门到实战(微课视频版)
上一篇:热销专栏 ~ Java基础教程系列
下一篇:Java大总结(2022版)