Netty基础原理

1.Netty概述

        Netty是由JBoss提供的开源的高性能、异步事件驱动的网络应用框架,通过Netty可以很快的构建出通信效率极高的应用;

  • 异步与同步是相对的,在请求或执行过程中,如果会阻塞等待就是同步,反之就是异步

1.1 Netty核心架构

Core(核心):

  • 可扩展的事件模型;
  • 统一的通信api;
  • 零拷贝机制与字节缓冲区;

Transport Services(传输服务):

  • 支持socket以及datagram(数据报,一种不可考的数据传输方式,常用于UDP传输);
  • 支持http协议;
  • 支持In-VM Pipe(管道协议,是jvm的一种进程);

Protocol Support(协议支持):

  • http与websocket;
  • SSL安全套接字协议支持;
  • Google Protobuf(之前提到过的高性能序列化框架);
  • 支持Zlib、gzip压缩;
  • 支持大文件的传输;
  • RTSP(实时流传输协议,应用层协议)
  • 支持二进制协议并且提供了完成的单元测试;

1.2 Netty优点

  • Netty基于Java的NIO实现,将各种传输类型、协议的实现API进行了统一封装,实现了阻塞和非阻塞Socket;
  • 基于事件模型实现,可以清晰的分离关注点,让开发者可以聚焦业务,提升开发效率;
  • 高度可定制的线程模型,单线程、一个或多个线程池(SEDA,把一个请求分成多个Stage处理,不同资源消耗的Stage使用不同数量的线程来处理,Stage处理过程中使用事件驱动的异步通信模式);
  • Netty只依赖了JDK底层api,没有其他的依赖(Netty 3.X依赖JDK5以上,Netty 4.X依赖JDK6以上);
  • Netty在网络通信方面更加的高性能、低延迟、尽可能的减少不必要内存拷贝,提高性能;
  • 原生NIO可靠性较差,且API比较繁杂,使用需要对多线程和网络编程非常熟悉,NIO还存在BUG(如epoll bug会导致selector空轮询,导致cpu100%,Netty中使用轮询时间过短则重新创建selector来解决这个bug),jdk11之后bug少了很多;

1.3 Netty的使用场景

        Netty的使用场景十分广泛,很多好用的框架都有用到Netty;

  • ES:es中netty用来处理节点间的通信以及客户端的请求;
  • Kafka:netty负责kafka中内部组件的通信;
  • Dubbo:使用Netty作为其默认的通讯方式处理服务间的远程调用;
  • gRPC:gRPC 的 Java 实现使用 Netty 作为其网络通信层;
  • Nacos:使用 Netty 进行服务注册、发现和配置管理的网络通信;
  • RocketMQ: 使用 Netty 进行消息的传输和处理;

2.Netty高性能架构

        Netty之所以性能高,主要就是使用Java的NIO实现了Reactor线程模型;

2.1 Java的IO模型

        JDK 4 之前基于Java所有的socket通信都采用了同步阻塞模型(BIO),性能低下;

        JDK 4 新增了 java.nio包,提供了很多异步IO开发的API和类库,促进了基于Java的异步非阻塞的发展;

        JDK 7 将原有的NIO进行了升级,其中也对AIO(异步非阻塞)进行了支持;

        BIO不做多解释,高并发下性能过低,并发数与线程数1:1;

2.1.1 NIO模型

        NIO(同步非阻塞IO),其三大核心组件:Buffer(缓冲区)、Channel(通道)、Selector(选择器/多路复用器);

  • Buffer:在NIO中所有读写操作都是基于缓冲区完成的,底层是通过数组实现的,常用的缓冲区是ByteBuffer,每个Java基本类型都有对应的缓冲区对象(除Boolean),如CharBuffer、IntBuffer、LongBuffer等;
  • Channel:在BIO中基于Stream实现,在NIO中基于通道实现,通道是双向的既能读也可写;
  • Selector:轮询注册在其上的Channel,如果某个Channel上发生读写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey获取就绪Channel集合,进行IO读写操作;

2.1.2 AIO模型

        在NIO中当Selector轮询中没有事件发生也会阻塞,AIO就是为了优化这个阻塞诞生的;

        AIO(异步非阻塞IO)依赖于操作系统底层的异步IO实现;

        AIO的基本流程:用户线程通过系统调用告知kernel内核启动某个IO操作,用户线程返回,kernel内核在整个IO操作(数据准备、数据复制)完成后,通知用户程序;

  • 数据准备:将数据从网卡读取到内核缓冲区;
  • 数据复制:将数据从内核缓冲区拷贝到用户程序空间的缓冲区;

        AIO也存在一定不足:

  • 需要完成事件的注册与传递,需要底层操作系统提供大量支持,去做大量的工作;
  • Windows系统通过IOCP实现了真正的异步IO,但是目前大多高并发应用的服务器操作系统不使用;
  • LInux系统下,主要使用 io_uring ,性能比AIO强;

2.2 Reactor线程模型

        Reactor线程模型是一种用于处理并发IO操作的设计模式,常用于高性能网络应用程序,主要通过事件驱动机制来处理多个连接的请求,而不需要为每个连接分配一个线程;

  • Reactor:负责监听和分配事件,将IO事件分派给对应的Handler,新的事件包含连接建立就绪、读就绪、写就绪;
  • Acceptor:处理客户端新连接,并分派请求到处理器链中;
  • Handler:将自身与事件绑定,执行非阻塞读写任务,完成Channel的读入,完成处理业务逻辑后,负责将结果写出Channel;

        常见Reactor线程模型有三种:Reactor单线程模型、Reactor多线程模型、主从Reactor多线程模型;

2.2.1 Reactor单线程模型

  • Reactor充当多路复用器角色,监听多路连接的请求,由单线程完成;
  • Reactor收到客户端发来的请求时,如果是新建连接通过Acceptor完成,其他请求由Handler完成;
  • Handler完成业务逻辑的处理;

优点:

  • 结构简单,适合用在一些业务逻辑比较简单、对性能要求不高的应用场景;

缺点:

  • 由于是单线程操作,不能发挥多核CPU的性能;
  • 当Reactor线程负载过重之后,处理速度将变慢,这会导致大量客户端连接超时,超时之后往往会进行重发,这更加重Reactor线程的负载,最终导致大量消息积压和处理超时;
  • 可靠性差,如果该线程进入死循环或意外终止,就会导致整个通讯系统不可用,容易造成单点故障;

2.2.2 Reactor多线程模式

  • 与单线程主要区别在Handler中,Reactor多线程模式Handler不会处理业务逻辑,只负责响应用户请求,业务逻辑由其他线程完成;
  • 这样降低Reactor的性能开销,充分利用CPU资源,

缺点:

  • 多线程数据共享和访问比较复杂,如果子线程完成业务处理后,把结果传递给主线程Reactor进行发送,就会涉及共享数据的互斥和保护机制;
  • Reactor承担所有事件的监听和响应,只在主线程中运行,可能会存在性能问题;

2.2.3 主从Reactor多线程模型

在主从模型中,Reactor分成了两部分:

  • MainReactor负责监听server socket,用来处理网络IO连接建立操作,将建立的socketChannel指定注册给SubReactor;
  • SubReactor主要完成和建立起来的socket的数据交互和事件业务处理操作;

优点:

  • 响应快,不必为单个同步事件阻塞,但Reactor本身依然是同步的;
  • 可扩展性强,可以方便的通过增加SubReactor实例个数来充分利用CPU资源;
  • 可复用性强,Reactor模型本身与具体时间处理逻辑无关,具有很高的复用性;

2.3 Netty模型

        Netty模型基于Reactor模型实现,支持上面三种模型,一般采用主从架构模型;

  • BossGroup负责连接事件,WorkGroup负责处理其他事件;
  • NioEventLoop表示一个不断循环的执行处理任务的线程,用于监听绑定在其上的读写事件;
  • 通过PIpeline执行业务逻辑的处理,Pipeline中会有多个ChannelHandler,ChannelHandler完成真正的业务逻辑;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3纯前端验证码示例

前言 验证码的用途:通过要求用户输入一串难以被机器自动识别的字符或图像,有效阻止恶意用户或脚本通过暴力破解方式尝试登录账户。验证码的分类:常见的验证码有短信、文本、图形等,安全度越高,依赖的插件或服务也越多…

ENSP环回路由的配置

环回路由配置如下,网段及其基础配置已写完。为了实现全网通,需要给路由器手写配置,使用 ip route—static目标网段下一跳。把所有情况都要考虑到,就会出现去往一个网段的最优路径和次优路径,近路和远路都能前往目标网段…

Spire.PDF for .NET【页面设置】演示:在 C# 中应用 PDF 页面转换

当您在导出为 PDF 格式的文档中翻页时,页面过渡会显示装饰效果,例如溶解或擦除。当您以 PDF 格式创建幻灯片时,页面过渡特别有用。Spire.PDF是一款专为开发人员设计的强大 .NET 组件,可让您将页面过渡应用于 PDF 文件。 这里介绍…

【新专栏】Excel数据分析与模拟决策

专栏入口:Excel数据分析与模拟决策 主要面向使用Excel的用户,讲解Excel的数据分析,模拟分决策内容,内容涵盖基于Excel的统计分析,数据生成,采样,假设检验,线性回归,线性规…

大语言模型(LLM)入门级选手初学教程

链接:https://llmbook-zh.github.io/ 前言: GPT发展:GPT-1 2018 -->GPT-2&GPT-3(扩大预训练数据和模型参数规模)–> GPT-3.5(代码训练、人类对齐、工具使用等)–> 2022.11 ChatG…

海外云手机:出海电商养号智能化方案

随着出海电商的迅猛发展,使用海外云手机进行养号已经成为越来越多商家的新选择。尤其在社交电商推广和短视频引流方面,海外云手机不仅提高了流量的精准度,还助力商家实现业务的快速增长。本文将探讨海外云手机养号相较于传统模式的优势&#…

STM32CubeIDE(Eclipse)Post-build steps添加带参.exe实现全流程(1):带参.exe制作

0 工具准备 vscode,编辑C代码 Code Runner插件,用于生成exe 1 前言 使用STM32CubeIDE编译生成了二进制镜像文件后,有时为了防止镜像被恶意修改,可以通过添加校验和来对整个镜像进行保护,实现手段就是在STM32CubeIDE工…

精华分享 | 大模型LLM微调技巧与实践总结

导读 本文总结了作者在ChatGLM-6B模型微调的经验,并汇总了目前开源项目&数据。 写在前面 大型语言模型横行,之前非常焦虑,现在全面拥抱。目前也有很多开源项目进行大模型微调等,笔者也做了一阵子大模型了,特此来…

datawhale大模型bot应用开发--task4:图片流

一、图像流是专门用于图像处理的一个流程工具 在图像流中,你可以通过可视化的操作方式灵活添加各种用于图像处理的节点,构建一个图像处理流程来最终生成一个图像。图像流发布后,支持在 Bot 或工作流中使用。 二、图像流的能力范围 类型 图…

【Linux】进程--详细解释进程

目录 1、冯诺依曼体系结构 2、操作系统 3、进程 4、环境变量 5、进程地址空间 6、页表(简单初步理解) 1、冯诺依曼体系结构 a、存储器指的是:内存 外设: b、输入设备:鼠标,键盘,摄像头&am…

宠物用品在线交易:SpringBoot开发实战

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

Python入门(一)

心血来潮就干:python课程走起 和你一起学习 Python 语言的基础语法。你将会系统性地学习 Python 基础知识; 直接开始吧~ 本篇文章将了解编程的几个基础概念。并且,你将学到如何在电脑屏幕上输出数字、文字,并敲出你…

ChatGLM4重磅开源! 连忙实操测试一波,效果惊艳,真的好用!附带最新相关资料和喂饭级实操推理教程!!

本文目录 GLM4重磅开源啦 GLM4系列版本介绍 GLM4大模型能力测评结果 经典测评任务结果 长文本能力 工具调用能力 多模态能力 手把手实操GLM-4-9B-Chat推理预测&&效果展示 GLM4运行硬件和环境要求 配置对应的库环境 使用peftbitsandbytes 进行4位量化推理 进…

Java基础12-特殊文件和日志技术

十二、特殊文件和日志技术 1、特殊文件 properties:用来存储键值对数据。 xml:用来存储有关系的数据。 1.1 properties文件 特点:存储键值对,键不能重复,文件后缀一般是.properties结尾的。 properties:是…

Docker设置日志滚动

问题描述 Docker 容器中的进程会将打印到控制台(console)的日志保存到容器的目录下,默认的 Docker 配置不带有日志的回滚。会在自己的容器目录下往同一个日志文件中不停写入,最后会导致磁盘空间占满的问题。 解决方案 方案一:全局范围内修…

利用Docker搭建一套Mycat2+MySQL8一主一从、读写分离的最简单集群(保姆教程)

文章目录 1、Mycat介绍1.1、mycat简介1.2、mycat重要概念1.3、Mycat1.x与Mycat2功能对比1.2、主从复制原理 2、前提准备3、集群规划4、安装和配置mysql主从复制4.1、master节点安装mysql8容器4.2、slave节点安装mysql8容器4.2、配置主从复制4.3、测试主从复制配置 5、安装mycat…

微信小程序canvas 生成二维码图片,画图片,生成图片,将两个canvas结合并保存图片

**需求实现步骤如下 先定义两个canvas一个canvas myQrcode画二维码的图片另一个canvas mycanvas画一个背景图,并把二维码画到这个canvas上,mycanvas这个canvas生成一张图片,返回图片的临时路径最后保存图片到手机** 首先wxml,新版微信小程序…

【SpringCloud】04-Gateway网关登录校验

1. 网关请求处理流程 2. 网关过滤器 3. 网关实现登录校验 Component // 参数构造器 RequiredArgsConstructor public class AuthGlobalFilter implements GlobalFilter, Ordered {private final AuthProperties authProperties;private final JwtTool jwtTool;private final A…

数据结构——笛卡尔树详解

数据结构——笛卡尔树 1,笛卡尔树的介绍2,笛卡尔树的构建3,笛卡尔树的代码实现 1,笛卡尔树的介绍 前面我们讲过《堆》和《二叉搜索树》,能不能把这两种数据结构的特性结合起来构造一棵新的树呢?当然是可以…

Qt-界面优化控件样式设置(72)

目录 描述 QPushButton 自定义复选框 输入框 列表框 菜单 实现登入界面 设置背景图 改变样式表 描述 这里介绍一些控件的样式设置 QPushButton 相关属性 font-size设置⽂字⼤⼩.border-radius设置圆⻆矩形. 数值设置的越⼤, ⻆就 "越圆".background-colo…