Netty篇(学习前言)

目录

一、为什么使用Netty

1. Netty编程相比NIO编程的优势

2. Netty 相比其它网络应用框架的优势

二、让我们走进Netty

1. 简介

2. 设计目标

3. 主要特点

4. Netty的作者

5. Netty 的地位

6. Netty 的优势

五、Netty版本说明

六、Netty架构设计

1. 线程模型基本介绍

2. 传统模型

3. Reactor模式

3.1. 基于I/O复用模型

3.2. 基于线程池复用线程资源

4. 原理解析

5. Reactor模式中核心组成

5.1. Reactor

5.2. Handlers

6. Reactor分类

6.1. 单Reactor单线程

解析

实例

优缺点

使用场景

6.2. 单Reactor多线程

解析

优缺点

6.3. 主从Reactor多线程

解析

实例

优缺点

7. 知识小结


一、为什么使用Netty

1. Netty编程相比NIO编程的优势

还有使用 NIO 编程工作量大,bug 多,这样就会导致许多问题要自己避免及解决:

  • 需要自己构建协议
  • 解决 TCP 传输问题,如粘包、半包
  • epoll 空轮询导致 CPU 100%
  • 对 API 进行增强,使之更易用,如 FastThreadLocal => ThreadLocal,ByteBuf => ByteBuffer

说到bug,例如:臭名昭著的Epoll Bug,它会导致Selector空轮询,最终导致CPU 100%。

直到JDK 1.7版本该问题仍旧存在,没有被根本解决。

除此之外,NIO编程所花费的成本更高,可以通过本人总结的以下几点可以看出来!

1、NIO的类库和API繁杂,使用起来比较麻烦

  • 需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。

2、需要具备其他的额外技能

  • 要熟悉Java多线程编程,因为NIO编程涉及到Reactor模式,你必须对多线程和网络编程非常熟悉,才

能编写出高质量的NIO程序。

3、开发工作量和难度都非常大

  • 例如:客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。

2. Netty 相比其它网络应用框架的优势

这里就拿 Mina 网络应用框架做一个介绍,我们可以通过调查发现Mina 由 apache 维护,将来 3.x 版本可

能会有较大重构,破坏 API 向下兼容性,Netty 的开发迭代更迅速,API 更简洁、文档更优秀

久经考验,16年,Netty 版本

  • 2.x 2004
  • 3.x 2008
  • 4.x 2013
  • 5.x 已废弃(没有明显的性能提升,维护成本高)

二、让我们走进Netty

1. 简介

Netty是一个开源的、异步的、基于事件驱动的Java网络应用框架,用于快速开发高性能、可维护、

可扩展的网络服务器和客户端程序。

它为我们提供了一套易于使用的抽象组件,使得开发者可以方便地构建各种不同类型的网络应用。

官网:https://netty.io/

2. 设计目标

Netty设计的目标是提供一个简单、高效、稳定的网络编程框架。

它建立在Java NIO(New I/O)的基础上,并在其之上进行了封装和增强。

相比于传统的Java网络编程,Netty提供了更高级别、更易用的API,同时具备更好的性能和可伸缩性。

3. 主要特点

Netty的主要特点包括:

  • 异步和事件驱动:利用了Java NIO提供的非阻塞I/O,通过事件驱动的方式处理网络请求和响

应,实现了高并发和低延迟。

  • 高度可定制:提供了丰富的可定制选项和灵活的扩展机制,使得开发者可以根据自己的需求来定

制和优化网络应用。

  • 支持多种协议:支持多种常见的网络协议,如TCP、UDP、HTTP等,开发者可以根据需要选择

合适的协议进行开发。

  • 安全性和稳定性:提供了一些安全性和容错机制,如SSL/TLS支持和优雅的错误处理,以确保网络应用

在面对复杂环境时能够保持稳定和安全。

由于其强大的功能和出色的性能,在众多互联网公司和开发者中得到了广泛的应用和认可。

无论是构建高性能的服务器程序,还是编写复杂的网络应用,Netty都是一个优秀的选择。

4. Netty的作者

他还是另一个著名网络应用框架 Mina 的重要贡献者

5. Netty 的地位

Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位

以下的框架都使用了 Netty,因为它们有网络通信需求!

  • Cassandra - nosql 数据库
  • Spark - 大数据分布式计算框架
  • Hadoop - 大数据分布式存储框架
  • RocketMQ - ali 开源的消息队列
  • ElasticSearch - 搜索引擎
  • gRPC - rpc 框架
  • Dubbo - rpc 框架
  • Spring 5.x - flux api 完全抛弃了 tomcat ,使用 netty 作为服务器端
  • Zookeeper - 分布式协调框架

6. 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可以被及时修复,同时,更多的新功能会被加入

五、Netty版本说明

  • netty版本分为netty3.x和netty4.x、netty5.x
  • 因为Netty5出现重大bug,已经被官网废弃了,目前推荐使用的是Netty4.x的稳定版本
  • 目前在官网可下载的版本netty3.x netty4.0.x 和netty4.1.x

这里,我主要讲解Netty4.1.x版本。

netty下载地址:  Service End for Bintray, JCenter, GoCenter, and ChartCenter | JFrog

六、Netty架构设计

1. 线程模型基本介绍

  • 不同的线程模式,对程序的性能有很大影响,为了搞清Netty线程模式,我将要来系统的讲解下各个线

程模式,最后看看Netty线程模型有什么优越性.

  • 目前存在的线程模型有:传统阻塞、I/O、服务模型、Reactor模式
  • 根据Reactor的数量和处理资源池线程的数量不同,有3种典型的实现
    • 单Reactor单线程;
    • 单Reactor多线程;
    • 主从Reactor多线程
  • Netty线程模式(Netty主要基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模

型有多个Reactor)

2. 传统模型

  • 采用阻塞IO模式获取输入的数据
  • 每个连接都需要独立的线程完成数据的输入,业务处理,数据返回
  • 当并发数很大,就会创建大量的线程,占用很大系统资源
  • 连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read操作,造成线程资源浪费

3. Reactor模式

针对传统阻塞I/O服务模型的2个缺点,解决方案:

3.1. 基于I/O复用模型

多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。

当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理

Reactor 对应的叫

  • 反应器模式
  • 分发者模式(Dispatcher)
  • 通知者模式(notifier)

3.2. 基于线程池复用线程资源

不必再为每个连接创建线程,将连接完成后的业务处理任务分配给线程进行处理,一个线程可以处理多个

连接的业务。

4. 原理解析

  • Reactor模式,通过一个或多个输入同时传递给服务处理器的模式(基于事件驱动)
  • 服务器端程序处理传入的多个请求,并将它们同步分派到相应的处理线程,因此Reactor模式也叫

Dispatcher模式

  • Reactor模式使用IO复用监听事件,  收到事件后,分发给某个线程(进程),  这点就是网络服务器高并发

处理关键

5. Reactor模式中核心组成

5.1. Reactor

Reactor在一个单独的线程中运行,负责监听和分发事件,分发给适当的处理程序来对IO事件做出反应。

它就像公司的电话接线员,它接听来自客户的电话并将线路转移到适当的联系人;

5.2. Handlers

处理程序执行I/O事件要完成的实际事件,类似于客户想要与之交谈的公司中的实际官员。

Reactor通过调度适当的处理程序来响应I/O事件,处理程序执行非阻塞操作。

6. Reactor分类

根据Reactor的数量和处理资源池线程的数量不同,有3种典型的实现

  • 单Reactor单线程
  • 单Reactor多线程
  • 主从Reactor多线程

6.1. 单Reactor单线程

解析
  • Select是前面I/O复用模型介绍的标准网络编程API,可以实现应用程序通过一个阻塞对象监听多路连

接请求

  • Reactor对象通过Select监控客户端请求事件,收到事件后通过Dispatch进行分发
  • 如果是建立连接请求事件,则由Acceptor通过Accept处理连接请求,然后创建一个Handler对象处理

连接完成后的后续业务处理

  • 如果不是建立连接事件,则Reactor会分发调用连接对应的Handler来响应
  • Handler会完成Read→业务处理→Send的完整业务流程
实例

服务器端用一个线程通过多路复用搞定所有的IO操作(包括连接,读、写等),编码简单,清晰明了,

但是如果客户端连接数量较多,将无法支撑,前面的NIO案例就属于这种模型。

优缺点

优点:模型简单,没有多线程、进程通信、竞争的问题,全部都在一个线程中完成

缺点:

  • 性能问题:只有一个线程,无法完全发挥多核CPU的性能。Handler在处理某个连接上的业务时,整

个进程无法处理其他连接事件,很容易导致性能瓶颈

  • 可靠性问题:线程意外终止,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部

消息,造成节点故障。

使用场景

客户端的数量有限,业务处理非常快速,比如Redis在业务处理的时间复杂度O(1)的情况

6.2. 单Reactor多线程

解析
  • Reactor对象通过select监控客户端请求事件,收到事件后,通过dispatch进行分发
  • 如果建立连接请求,则右Acceptor通过accept处理连接请求,然后创建一个Handler对象处理完成连接后

的各种事件

  • 如果不是连接请求,则由reactor分发调用连接对应的handler来处理
  • handler只负责响应事件,不做具体的业务处理,通过read读取数据后,会分发给后面的worker线程池

的某个线程处理业务

  • worker线程池会分配独立线程完成真正的业务,并将结果返回给handler
  • handler收到响应后,通过send将结果返回给client
优缺点

优点:可以充分的利用多核cpu的处理能力

缺点:多线程数据共享和访问比较复杂,reactor处理所有的事件的监听和响应,在单线程运行,在高并发

场景容易出现性能瓶颈。

6.3. 主从Reactor多线程

针对单Reactor多线程模型中,Reactor在单线程中运行,高并发场景下容易成为性能瓶颈,可以让

Reactor在多线程中运行。

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

这种模型在许多项目中广泛使用,包括Nginx主从Reactor多进程模型,Memcached主从多线程,Netty

主从多线程模型的支持。

优缺点

优点:

  • 父线程与子线程的数据交互简单职责明确,父线程只需要接收新连接,子线程完成后续的业务处理。
  • 父线程与子线程的数据交互简单,Reactor主线程只需要把新连接传给子线程,子线程无需返回数据。

缺点:编程复杂度较高

7. 知识小结

现在知道Netty对主从Reactor多线程模型做改进的好处了吧

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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Ceph 学习指南 集群部署【 cephadm 】

文章目录 引言初识 Server SANServer SAN 和传统存储对比 Ceph 概述Ceph 的架构设计Ceph 的特点Ceph 块存储Ceph 文件系统Ceph 对象存储Ceph 介绍 Ceph 集群部署配置 aliyun 源配置时间同步配置 hosts 文件安装 docker配置免密登录ceph 集群部署ceph1 配置安装 python3安装 cep…

Linux篇(常见入门命令)

目录 一、开启终端 二、Linux命令格式 1. 什么是Linux 的命令? 三、Linux下的命令补全 四、切换用户 五、uname:查看操作系统信息 六、ls:查看目录下文件 1. 用法一 2. 用法二 3. 用法三 七、pwd:显示当前路径 八、cd&…

全面解析:网络协议及其应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 # 全面解析:网络协议及其应用 文章目录 网络协议概述定义发展历程主要优势 主要网络协议应用层协议传输层协议网络层…

02- 模块化编程-006 ADC0808数码显示对比

1、ADC0808 芯片介绍 ADC0808是一款集成的CMOS设备,包含8位模拟至数字转换器、8通道多路复用器和与微处理器兼容的控制逻辑。8位A/D转换器采用逐次逼近作为转换技术。转换器特点包括高阻抗斩波稳定比较器、256R电压分压器、模拟开关树和逐次逼近寄存器。8通道多路复…

【自动化测试】APP UI 自动化(安卓)-本地环境搭建

一、软件准备及版本介绍 软件版本JAVA-SDK1.8.0_181 python 3.10.10 Android SDK Tools 下最新版本即可,无特殊要求 PyCharm 2023.3.5(下最新版本即可,无特殊要求) 二、安装步骤及环境变量配置 2.1 Java安装及配置 1&am…

leetcode912.排序数组的题解

题目描述: 题目要求在不使用任何内置函数的情况下解决问题,时间复杂度为 O(nlog(n))。 笔者使用了快速排序,但是直接使用最原始的快速排序,有些特殊的测试用例会超时。 1)如果数组本身基本有序,则使用原始…

安装Blender并使用

前言 该系列记录了如何用Blenderpro来构建自己的场景数据集,从环境搭建到后期构建数据集的整个流程 本文章是第一部分,BlenderPrc2的安装以及环境配置 部分参考https://blog.csdn.net/weixin_49521551/article/details/121573334 官方文档https://dlr…

json-server的使用(根据json数据一键生成接口)

一.使用目的 在前端开发初期,后端 API 可能还未完成,json-server 可以快速创建模拟的 RESTful API,帮助前端开发者进行开发和测试。 二.安装 npm install json-server //局部安装npm i json-server -g //全局安装 三.使用教程 1.准备一…

MySQL详细安装教程

一、从MySQL官网安装 可以翻译成中文看起来就舒服多了 下载并打开安装包,能看到版本是8.0.36,双击运行或者右键选择打开,打开后是一个安装向导,这个安装向导会先帮我们安装一个 mysql-installer 的程序,再通过该程序安…

qt QErrorMessage详解

1、概述 QErrorMessage是Qt框架中用于显示错误消息的一个对话框类。它提供了一个简单的模态对话框,用于向用户显示错误或警告消息。QErrorMessage通常用于应用程序中,当需要向用户报告错误但不希望中断当前操作时。它提供了一个标准的错误消息界面&…

Vue3安装、创建到使用

vue安装 npm install vuenext # 全局安装 vue-cli npm install -g vue/cli #更新插件 项目中运行 vue upgrade --nextvue create 命令 vue create [options] <app-name> options 选项可以是&#xff1a; -p, --preset <presetName>&#xff1a; 忽略提示符并使用已…

Linux 下执行定时任务之 Systemd Timers

不知道 ECS 因为什么缘故&#xff0c;上面安装的 MySQL 服务老是不定期挂掉&#xff0c;本来想通过 Linux 得 Cron 配置个半小时的定时检测任务&#xff0c;结果一直没有执行&#xff0c;因此又尝试使用了 Systemd Timers 进行了重新配置&#xff0c;简要做个记录。 Systemd Ti…

计算机网络:网络层 —— IP 多播技术

文章目录 基本概念IP多播地址和多播组 IP多播的类型硬件多播将IPv4多播地址映射为多播MAC地址 基本概念 多播&#xff08;Multicast&#xff0c;也称为组播&#xff09;是一种实现“一对多”通信的技术&#xff0c;允许一台或多台主机&#xff08;多播源&#xff09;发送单一数…

OuteTTS:基于纯语言建模的开源文本到语音合成项目,支持语音克隆等多种语音合成任务

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

C语言 | Leetcode C语言题解之第540题有序数组中的单一元素

题目&#xff1a; 题解&#xff1a; int singleNonDuplicate(int* nums, int numsSize) {int low 0, high numsSize - 1;while (low < high) {int mid (high - low) / 2 low;mid - mid & 1;if (nums[mid] nums[mid 1]) {low mid 2;} else {high mid;}}return …

【学习笔记】SAP ABAP——数据类型

SAP ABAP——数据类型 SAP模块介绍数据类型内涵数据类型分类预定义数据类型数据字典数据类型用户自定义数据类型 SAP模块介绍 模块模块名称FI财务会计CO管理会计SD销售分销MM物料管理PM工厂维护HR人力资源PS项目管理BW数据仓库BC系统相关PP生产制造 数据类型内涵 ​ 数据类型…

国产服务器平台离线部署k8s和kubesphere(含离线部署新方式)

"信创&#xff1a;鲲鹏麒麟&#xff0c;ARM64架构&#xff0c;实现K8s和Kubesphere的离线部署&#xff0c;全新方式助力企业高效运维。" 本文将深入探讨如何借助鲲鹏CPU(arm64)和操作系统Kylin V10 SP2/SP3,通过KubeKey制作KubeSphere与Kubernetes的离线安装包&#…

SpringBoot在线教育系统:技术与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

初始JavaEE篇——多线程(7):定时器、CAS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 定时器的使用 定时器的原理 模拟实现定时器 CAS 介绍 CAS的应用场景 解析 AtomicInteger 类 实现自旋锁 CAS的缺陷…

【金融风控】相关业务介绍及代码详解

金融风控相关业务介绍 【了解】项目整体介绍 1.风控业务和风控报表</span> 零售金融产品 相关的指标 风控建模流程 ​ #2.特征工程 特征构造 特征筛选 ​ 3.评分卡模型构建 逻辑回归 集成学习 XGBoost LightGBM 模型评估 ​ #4.样本不均衡问题/异常点检测 【了解】今日…