Netty入门学习和技术实践
Netty入门学习和技术实践
- Netty
- 1.Netty简介
- 2.IO模型
- 3.Netty框架介绍
- 4. Netty实战项目学习
- 5. Netty实际应用场景
- 6.扩展
Netty
1.Netty简介
Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。
“快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。
git地址链接:
来源:百度百科
2.IO模型
Unix中定义了五种I/O模型:阻塞I/O非阻塞I/OI/O复用(select、poll、linux 2.6种改进的epoll)信号驱动IO(SIGIO)异步I/O(POSIX的aio_系列函数)
Java共支持3种网络编程模型/IO模式:BIO、NIO、AIO
BIO:
同步阻塞模式,进行IO操作时,程序会处于阻塞状态,直到IO操作完成。这意味着当程序进行网络操作或者文件操作时,如果操作耗时很长,程序会一直等待,无法进行其他任务。虽然BIO的编程模型比较简单,但是它的并发处理能力相对较弱。因为当有多个IO请求时,线程会被阻塞,CPU无法充分利用。对于高并发场景下的服务器应用来说,BIO的性能表现并不理想。
BIO原理图:
AIO:
Java 7 中引入了 NIO 的改进版 NIO 2,它是异步 IO 模型,异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
AIO原理图:
NIO:
Java 7 中引入了 NIO 的改进版 NIO 2,它是异步 IO 模型,异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。非阻塞IO虽然相对于阻塞IO大幅提升了性能,其依然存在性能问题,频繁的轮询导致频繁的系统调用,会耗费大量的CPU资源。当并发很高时,假设有1000个并发,那么单位时间循环内将会有1000次系统调用去轮询执行结果,而实际上可能只有2个请求结果执行完毕,这就会有998次无效的系统调用,造成严重的性能浪费。NIO问题的本质就是频繁轮询导致的无效系统调用
NIO原理图:
IO多路复用
NIO的升级解决方案,减少系统无效的调用线程首先发起 select调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起read调用。read调用的过程(数据从内核空间->用户空间)还是阻塞的。目前支持 IO 多路复用的系统调用,有 select,epoll 等。select 系统调用,是目前几乎在所有的操作系统上都有支持select调用,内核提供的系统调用,它支持一次查询多个系统调用的可用状态。几乎所有的操作系统都支持。epoll调用:linux 2.6 内核,属于 select调用的增强版本,优化了 IO 的执行效率。Netty 的非阻塞 I/O 的实现关键是基于 I/O 复用模型
IO多路复用原理图
总结:
为什么会分为这五种情况,是因为应用程序和操作系统分为用户态和内核态,应用程序对操作系统的内核发起IO调用(系统调用),操作系统负责的内核执行具体的IO操作。也就是说,我们的应用程序实际上只是发起了IO操作的调用而已,具体 IO 的执行是由操作系统的内核来完成的。
应用程序发起的一次IO操作实际包含两个阶段:
IO调用阶段:应用程序进程向内核发起系统调用
IO执行阶段:内核执行IO操作并返回2.1. 准备数据阶段:内核等待I/O设备准备好数据2.2. 拷贝数据阶段:将数据从内核缓冲区拷贝到用户空间缓冲区
增进理解:
- 同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊!- 同步非阻塞:在饭馆点完餐,就去遛狗了。不过溜一会儿,就回饭馆喊一声:好了没啊!- 异步阻塞:遛狗的时候,接到饭馆电话,说饭做好了,让您亲自去拿。- 异步非阻塞:饭馆打电话说,我们知道您的位置,一会给你送过来,安心遛狗就可以了。
3.Netty框架介绍
Netty 的工作架构图
Server端包含 1 个 Boss NioEventLoopGroup 和 1 个 Worker NioEventLoopGroupBoss 专门负责接收客户端的连接, Worker专门负责网络的读写;
NioEventLoopGroup:相当于 1 个事件循环组,这个组里包含多个事件循环 NioEventLoop,每个 NioEventLoop 包含 1 个 Selector 和 1 个事件循环线程。
Boss NioEventLoop 循环执行的任务包含 3 步:1.轮询 Accept 事件。2.处理 Accept I/O 事件,与 Client 建立连接,生成 NioSocketChannel,并将 NioSocketChannel 注册到某个 Worker NioEventLoop 的 Selector 上。
3.处理任务队列中的任务,runAllTasks。任务队列中的任务包括用户调用 eventloop.execute 或 schedule 执行的任务,或者其他线程提交到该 eventloop 的任务。
Worker NioEventLoop 循环执行的任务包含 3 步:1.轮询 Read、Write 事件。2.处理 I/O 事件,即 Read、Write 事件,在 NioSocketChannel 可读、可写事件发生时进行处理。
3.处理任务队列中的任务,runAllTasks。
Selector 选择器原理
netty几大核心概念:
拆包/粘包:
应用A 通过网络发送数据向应用B 发送消息,大概会经过如下阶段:阶段一:应用A 把流数据发送到 TCP发送缓冲区。阶段二:TCP发送缓冲区把数据发送到达 B服务器 TCP接收缓冲区。阶段三:应用B 从 TCP接收缓冲区读取流数据。
假设客户端向服务端连续发送了两个数据包,分别用ABC和DEF来表示,那么服务端收到的数据可以分为以下三种情况:情况1:接收端正常收到两个数据包,即没有发生拆包和粘包的现象。
情况2:接收端只收到一个数据包,这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。
情况3:接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。
TCP发送数据原由:1.因为TCP本身传输的数据包大小就有限制,所以应用发出的消息包过大,TCP会把应用消息包拆分为多个TCP数据包发送出去。2.Negal算法的优化,当应用发送数据包太小,TCP为了减少网络请求次数的开销,它会等待多个消息包一起,打成一个TCP数据包一次发送出去。
TCP接收方的原由:1.TCP缓冲区里的数据都是字符流的形式,没有明确的边界,因为数据没边界,所以应用从TCP缓冲区中读取数据时就没办法指定一个或几个消息一起读,而只能选择一次读取多大的数据流,而这个数据流中就可能包含着某个消息包的一部分数据
1)粘包原因:
发送的数据大小小于发送缓冲区,tcp就会把发送的数据多次写入缓冲区,此时发生粘包;
接收数据方的应用层没有及时从 接收缓冲区读取数据,也会发生粘包;
2)拆包原因:
发送的数据大小 大于 tcp发送缓冲区,就会发生拆包;
发送的数据大小 大于 报文最大长度,也会拆包;
原因总结:1.一个TCP报文最大能传输65536个字节,也就是16Kb。2.TCP是流式协议,数据无边界。解决粘包拆包的关键在于为每一个数据包添加界限标识,常用方法如下:
方法1)发送方以固定长度封装数据包。如果不足,则补0填充。
方法2)自定义设置数据包的界限标识,如添加特别标识(如======)。接收方通过标识可以识别不同的数据包;
方法3)发送方为每一个数据包添加报文头部。头部至少包含数据包长度(类似http协议的头部length)。 通过这种方式,接收方通过读取头部的长度知道当前数据包的界限,并在界限处停止读取。
netty处理 拆包/粘包 的方式:
零拷贝:
零拷贝概念:在操作数据时, 不需要将数据buffer从一个内存区域拷贝到另一个内存区域。 少了一次内存的拷贝,CPU的效率就得到的提升。在系统层面上的零拷贝通常指避免在用户态(User-space)与内核态(Kernel-space)之间来回拷贝数据。Netty的Zero-copy完全是在用户态(Java 层面)的, 更多的偏向于优化数据操作。netty实现零拷贝原理:1.Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行Socket读写,JVM会将堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。2.Netty提供了组合Buffer对象,可以聚合多个ByteBuffer对象,用户可以像操作一个Buffer那样方便的对组合Buffer进行操作,避免了传统通过内存拷贝的方式将几个小Buffer合并成一个大的Buffer。3.Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题。
4. Netty实战项目学习
项目学习地址:
Netty教程:十二个实例带你轻松学习Netty
项目代码gitee地址:
nettyTeach
5. Netty实际应用场景
netty可以做什么:
有了Netty,你可以实现自己的HTTP服务器,FTP服务器,UDP服务器,RPC服务器,WebSocket服务器,Redis的Proxy服务器,MySQL的Proxy服务器等等。
传统的HTTP服务器的原理1、创建一个ServerSocket,监听并绑定一个端口2、一系列客户端来请求这个端口3、服务器使用Accept,获得一个来自客户端的Socket连接对象4、启动一个新线程处理连接4.1、读Socket,得到字节流4.2、解码协议,得到Http请求对象4.3、处理Http请求,得到一个结果,封装成一个HttpResponse对象4.4、编码协议,将结果序列化字节流 写Socket,将字节流发给客户端5、继续循环步骤3
HTTP服务器之所以称为HTTP服务器,是因为编码解码协议是HTTP协议,如果协议是Redis协议,那它就成了Redis服务器,如果协议是WebSocket,那它就成了WebSocket服务器,等等。 使用Netty可以定制编解码协议,实现特定协议的服务器。
netty适用行业:
2.1 互联网行业1、互联网行业:在分布式系统中,各个节点之间需要远程调用,高性能的 RPC 框架必不可少,Netty 作为异步高性能的通行框架,往往作为基础通信组件被这些 RPC 框架使用。2、典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信。
2.2 游戏行业1、无论是手游服务端还是大型的网络游戏,Java 语言得到了越来越广泛的应用。2、Netty 作为高性能的基础通信组件,提供了 TCP/UDP 和 HTTP 协议栈,方便定制和开发私有协议栈,账号登录服务器。3、地图服务器之间可以方便的通过 Netty 进行高性能的通信。
2.3 大数据领域
2.2 游戏行业1、经典的 Hadoop 的高性能通信 和 序列化组件(AVRO 实现数据文件共享)的 RPC 框架,默认采 Netty 进行跨界点通信。2、它的 Netty Service 基于 Netty 框架二次封装实现。
2.4 其它开源项目使用的Netty
网址:https://netty.io/wiki/related-projects.html
6.扩展
netty相关书籍:
Netty入门与实战:仿写微信 IM 即时通讯系统Netty 4.x学习笔记 - 线程模型Netty入门与实战理解高性能网络模型Netty基本原理介绍software-architecture-patterns.pdfNetty高性能之道 —— 李林锋Netty In ActionNetty权威指南
netty官网:netty.io
netty优秀开源项目:
gitee:
mqtt-cluster:https://gitee.com/quickmsg/mqtt-cluster.gitnetty-mqtt:https://gitee.com/lxrv587/iot_push.githeart-netty:https://gitee.com/zjz0812/heart-netty.git
netty_redis_zookeeper:https://gitee.com/crazymaker/netty_redis_zookeeper_source_code.git
github:
相关文章:

Netty入门学习和技术实践
Netty入门学习和技术实践 Netty1.Netty简介2.IO模型3.Netty框架介绍4. Netty实战项目学习5. Netty实际应用场景6.扩展 Netty 1.Netty简介 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具&…...

MySQL详细安装与配置
免安装版的Mysql MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的 标准化语言,其特点为体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,在 Web 应用方面 MySQL 是最好的 RDBMS(Relation…...

裸露土堆识别算法
裸露土堆识别算法首先利用图像处理技术,提取出图像中的土堆区域。裸露土堆识别算法首通过计算土堆中被绿色防尘网覆盖的比例,判断土堆是否裸露。若超过40%的土堆没有被绿色防尘网覆盖,则视为裸露土堆。当我们谈起计算机视觉时,首先…...

说说你对Redux的理解?其工作原理?
文章目录 redux?工作原理如何使用后言 redux? React是用于构建用户界面的,帮助我们解决渲染DOM的过程 而在整个应用中会存在很多个组件,每个组件的state是由自身进行管理,包括组件定义自身的state、组件之间的通信通…...

《基于 Vue 组件库 的 Webpack5 配置》7.路径别名 resolve.alias 和 性能 performance
路径别名 resolve.alias const path require(path);module.exports {resolve: {alias: {"": path.resolve(__dirname, "./src/"),"assets": path.resolve(__dirname, "./src/assets/"),"mixins": path.resolve(__dirname,…...

基于PaddleOCR2.7.0发布WebRest服务测试案例
基于PaddleOCR2.7.0发布WebRest服务测试案例 #WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. #警告:这是一个开发服务器。不要在生产部署中使用它。请改用生产WSGI服务器。 输出结果…...

Solidity 合约安全,常见漏洞 (下篇)
Solidity 合约安全,常见漏洞 (下篇) Solidity 合约安全,常见漏洞 (上篇) 不安全的随机数 目前不可能用区块链上的单一交易安全地产生随机数。区块链需要是完全确定的,否则分布式节点将无法达…...

nodejs根据pdf模板填入中文数据并生成新的pdf文件
导入pdf-lib库和fontkit npm install pdf-lib fs npm install pdf-lib/fontkit 具体代码 const { PDFDocument, StandardFonts } require(pdf-lib); const fs require(fs); const fontkit require(pdf-lib/fontkit) let pdfDoc let font async function fillPdfForm(temp…...

UE4与pycharm联合仿真的调试问题及一些仿真经验
文章目录 ue4与pycharm联合仿真的调试问题前言ue4端的debug过程pycharm端 一些仿真经验小结 ue4与pycharm联合仿真的调试问题 前言 因为在实验中我需要用到py代码输出控制信息给到ue4中,并且希望看到py端和ue端分别在运行过程中的输出以及debug调试。所以…...

【数据分析】波士顿矩阵
波士顿矩阵是一种用于分析市场定位和企业发展战略的管理工具。由美国波士顿咨询集团(Boston Consulting Group)于1970年提出,并以该集团命名。 波士顿矩阵主要基于产品生命周期和市场份额两个维度,将企业的产品或业务分为四个象限…...

sizeof和strlen的对比
文章目录 🚩前言🚩sizeof🚩strlen🚩sizeof和strlen对比 🚩前言 很多小白在学习中,经常将sizeof和strlen弄混了。本篇文章,小编讲解一下sizeof和strlen的区别。🤷♂️ 🚩…...

Flutter系列文章-Flutter 插件开发
在本篇文章中,我们将学习如何开发 Flutter 插件,实现 Flutter 与原生平台的交互。我们将详细介绍插件的开发过程,包括如何创建插件项目、实现方法通信、处理异步任务等。最后,我们还将演示如何将插件打包并发布到 Flutter 社区。 …...

基于SpringBoot实现MySQL与Redis的数据最终一致性
问题场景 在并发场景下,MySQL和Redis之间的数据不一致性可能成为一个突出问题。这种不一致性可能由网络延迟、并发写入冲突以及异常情况处理等因素引起,导致MySQL和Redis中的数据在某些时间点不同步或出现不一致的情况。数据一致性问题的级别可以分为三…...

mysql与oracle数据库备份
mysql 1在执行mysql数据备份前,可先执行命令查看磁盘容量: # df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 50G 46G 1.6G 97% / tmpfs 1.9G 92K 1.9G 1% /dev/shm /dev/sda1 485M 39M 421M 9% /boot…...

UE4 材质学习笔记
CheapContrast与CheapContrast_RGB都是提升对比度的,一个是一维输入,一个是三维输入,让亮的地方更亮,暗的地方更暗,不像power虽然也是提升对比度,但是使用过后的结果都是变暗或者最多不变(值为1…...

TiDB 源码编译之 TiProxy 篇
作者: ShawnYan 原文来源: https://tidb.net/blog/3d57f54d TiProxy 简介 TiProxy 是一个基于 Apache 2.0 协议开源的、轻量级的 TiDB 数据库代理,基于 Go 语言编写,支持 MySQL 协议。 TiProxy 支持负载均衡,接收来…...

利用驱动漏洞
sbyt3/IObitUnlocker.Wrapper (github.com)...

开始MySQL之路——MySQL约束概述详解
MySQL约束 create table [if not exists] 表名(字段名1 类型[(宽度)] [约束条件] [comment 字段说明],字段名2 类型[(宽度)] [约束条件] [comment 字段说明],字段名3 类型[(宽度)] [约束条件] [comment 字段说明] )[表的一些设置]; 概念 约束英文:constraint 约束实…...

CMake基础和命令介绍
CMake是一个跨平台的构建工具,它可以生成各种不同平台上的构建文件,例如Makefile或Visual Studio项目文件。以下是一些常用的CMake命令: 1. cmake_minimum_required:指定需要的最小CMake版本。 2. project:定义项目名…...

【matlab利用shp文件制作mask白化文件】
matlab白化文件 mask文件的作用matlab制作mask文件mask结果 mask文件的作用 地理信息绘图中的 “mask” 通常指的是遮罩或掩膜,用于在地图或图像上隐藏、高亮或标记特定区域。 数据可视化: 地理信息绘图 mask 可以用于突出显示特定地理区域,使…...

【LLM】解析pdf文档生成摘要
文章目录 一、整体思路二、代码三、小结Reference 一、整体思路 非常简单的一个v1版本 利用langchain和pdfminer切分pdf文档为k块,设置overlap等参数先利用prompt1对每个chunk文本块进行摘要生成,然后利用prompt2对多个摘要进行连贯组合/增删模型可以使…...

方案:AI边缘计算智慧工地解决方案
一、方案背景 在工程项目管理中,工程施工现场涉及面广,多种元素交叉,状况较为复杂,如人员出入、机械运行、物料运输等。特别是传统的现场管理模式依赖于管理人员的现场巡查。当发现安全风险时,需要提前报告࿰…...

【Python】【数据结构和算法】查找最大或最小的N个元素
除了直接排序,还可以利用heaq模块的nlargest()和nsmallest()方法,例如: >>> nums [3, 5, 2, 4, 1] >>> smallest heapq.nsmallest(3, nums) >>> print(smallest) [1, 2, 3] >>> largest heapq.nlarg…...

C++day1(笔记整理)
一、Xmind整理: 二、上课笔记整理: 1.第一个c程序:hello world #include <iostream> //#:预处理标识符 //<iostream>:输入输出流类所在的头文件 //istream:输入流类 //ostream:输出流类using namespace std; //std&#x…...

关于chromedriver.exe一系列问题的解决办法
最新 chromedriver.exe下载地址:https://googlechromelabs.github.io/chrome-for-testing/#stable 下载最新版本的 chromedriver.exe 将其解压在 python.exe 同目录下,以及Chrome 的路径下 例如: C:\Program Files\Google\Chrome\Applicati…...

css-选择器、常见样式、标签分类
CSS CSS简介 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可…...

三星申请新商标:未来将应用于智能戒指,作为XR头显延伸设备
三星最近向英国知识产权局提交了名为“Samsung Curio”的新商标,这预示着三星正积极扩展可穿戴设备生态。该商标被分类为“Class 9”,这表明它有可能被用于未来的智能戒指。 据报道,三星计划将智能戒指作为XR头显设备的延伸,与苹果…...

0201hdfs集群部署-hadoop-大数据学习
文章目录 1 前言2 集群规划3 hadoop安装包上传与安装3.1 上传解压 4 hadoop配置5 从节点同步和环境变量配置6 创建用户7 集群启动8 问题集8.1 Invalid URI for NameNode address (check fs.defaultFS): file:/// has no authority. 结语 1 前言 下面我们配置下单namenode节点h…...

DevOps中的持续测试优势和工具
持续测试 DevOps中的持续测试是一种软件测试类型,它涉及在软件开发生命周期的每个阶段测试软件。持续测试的目标是通过早期测试和经常测试来评估持续交付过程的每一步的软件质量。 DevOps中的持续测试流程涉及开发人员、DevOps、QA和操作系统等利益相关者。 持续…...

函数-C语言(初阶)
目录 一、什么是函数 二、函数的分类 2.1 库函数 2.2 自定义函数 三、函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 四、函数的调用 4.1 传值调用 4.2 传址调用 五、函数的嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问…...