当前位置: 首页 > news >正文

Netty的高性能体现在哪些方面

文章目录

  • Netty的高性能体现在哪些方面
    • 1. 非阻塞I/O
    • 2. 零拷贝
    • 3. 内存池
    • 4. 线程模型

Netty的高性能体现在哪些方面

Netty是一个高性能、异步事件驱动的网络应用程序框架,它具有出色的稳定性和灵活性。在现代的分布式系统和互联网应用中,Netty已经成为构建高效、可扩展和解耦合的网络应用程序所必不可少的工具。

在本文中,我将从浅入深地介绍Netty的高性能体现,并结合代码实践加深读者的理解。

1. 非阻塞I/O

Netty采用了非阻塞式IO模型,使得单线程可以处理大量的并发连接。这种方式是通过Java NIO(New IO)API实现的。相比传统的阻塞式IO模型,在多个客户端请求的情况下,非阻塞式IO模型可以减少线程数量,提高了应用程序的并发性能。

我们可以通过以下代码来实现一个简单的Netty服务端:

public class NettyServer {private int port;public NettyServer(int port) {this.port = port;}public void run() {EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap server = new ServerBootstrap();server.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new NettyServerHandler());}}).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true);ChannelFuture future = server.bind(port).sync();future.channel().closeFuture().sync();} finally {workerGroup.shutdownGracefully();bossGroup.shutdownGracefully();}}public static void main(String[] args) {new NettyServer(8888).run();}
}

2. 零拷贝

在传统的I/O模型中,数据从内核空间(kernel space)复制到用户空间(user space),然后再由应用程序处理。这种方式会导致大量的CPU和内存开销,尤其是在高并发场景下。

相比之下,Netty使用了零拷贝技术,即数据直接从操作系统内存缓冲区传输到网络协议栈或者应用程序中,完全避免了数据在内核态和用户态之间的拷贝。这种设计不仅提高了应用程序的效率,还降低了系统的资源消耗。

我们可以通过以下代码来实现一个简单的文件传输服务端:

public class FileServerHandler extends SimpleChannelInboundHandler<ByteBuf> {private RandomAccessFile file;@Overridepublic void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {if (file == null) {String filePath = "path/to/file";file = new RandomAccessFile(filePath, "r");}long length = file.length();FileRegion region = new DefaultFileRegion(file.getChannel(), 0, length);ctx.write(region);  }@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {if (file != null) {file.close();}ctx.close();}
}

3. 内存池

Netty通过内存池技术来管理缓冲区,避免了频繁创建销毁缓冲区的开销。具体来说,Netty会为每个连接分配一个固定大小的缓冲池,根据需要动态调整缓冲区的大小。

我们可以通过以下代码来实现一个简单的消息处理服务端:

public class MessageServerHandler extends SimpleChannelInboundHandler<String> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx,String msg) throws Exception {ByteBuf buf = Unpooled.copiedBuffer(msg.getBytes());ctx.writeAndFlush(buf);}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {cause.printStackTrace();ctx.close();}
}

4. 线程模型

在Netty中,采用了Reactor模式来处理网络事件。它将网络I/O和业务逻辑处理分离,使得对于大量的并发连接可以采用较少的线程进行处理。

具体来说,Netty采用了两种线程模型:多线程模型和单线程模型。在多线程模型下,每个连接都有一个独立的线程池;而在单线程模型下,所有的连接都共享一个线程,并且这个线程只负责处理网络事件,而不会阻塞。

我们可以通过以下代码来实现一个简单的多线程服务端:

public class MultiThreadServer {private int port;public MultiThreadServer(int port) {this.port = port;}public void run() {EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap server = new ServerBootstrap();server.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new MultiThreadServerHandler());}}).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true);ChannelFuture future = server.bind(port).sync();future.channel().closeFuture().sync();} finally {workerGroup.shutdownGracefully();bossGroup.shutdownGracefully();}}public static void main(String[] args) {new MultiThreadServer(8888).run();}
}

综上所述,Netty通过采用非阻塞I/O、零拷贝、内存池以及合理的线程模型等技术手段来提高网络应用程序的性能和可伸缩性。在实际的开发工作中,我们可以根据具体的需求,选择合适的Netty组件和框架来构建高效稳定的网络应用程序。

相关文章:

Netty的高性能体现在哪些方面

文章目录Netty的高性能体现在哪些方面1. 非阻塞I/O2. 零拷贝3. 内存池4. 线程模型Netty的高性能体现在哪些方面 Netty是一个高性能、异步事件驱动的网络应用程序框架&#xff0c;它具有出色的稳定性和灵活性。在现代的分布式系统和互联网应用中&#xff0c;Netty已经成为构建高…...

CompletableFuture详解

1、概述 咱们都知道可以通过继承Thread类或者实现Runnable接口两种方式实现多线程。但是有时候我们希望得到多线程异步任务执行后的结果&#xff0c;也就是异步任务执行后有返回值&#xff0c;Thread和Runnable是不能实现的。当我们需要返回值的时候怎么办呢&#xff1f; Java…...

(学习日记)2023.3.10

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…...

【图像分割】Meta分割一切(SAM)模型环境配置和使用教程

注意&#xff1a;python>3.8, pytorch>1.7,torchvision>0.8 Feel free to ask any question. 遇到问题欢迎评论区讨论. 官方教程&#xff1a; https://github.com/facebookresearch/segment-anything 1 环境配置 1.1 安装主要库&#xff1a; &#xff08;1&…...

AJ入门路线

一.AspectJ 入门 概述安装示例代码切入点表达式thisJoinPointStaticPart 和 thisJoinPoint与Spring 切面写法的对比总结 初步了解了aspectJ的使用&#xff0c;我们可以了解以下几点&#xff1a; 1&#xff09;aspectJ的使用是在编译期&#xff0c;通过特殊的编译器可以在不改变…...

多商户商城小程序源码开发需具备哪些功能?

随着电商的进一步发展&#xff0c;传统企业为了更好的占领市场也纷纷向电商市场迈进&#xff0c;着手打造属于自己的商城系统。多商户商城系统是一种多商户、多商品、多支付的电子商务平台&#xff0c;功能丰富&#xff0c;涵盖多个行业&#xff0c;能够满足多种商家和用户的需…...

【动态规划模板】最长公共|上升子序列问题

最长公共子序列&#x1f349; 给定两个长度分别为N和M的字符串A和B&#xff0c;求既是A的子序列又是B的子序列的字符串长度最长是多少。 输入格式 第一行包含两个整数 N 和 M。 第二行包含一个长度为N的字符串&#xff0c;表示字符串A。 第三行包含一个长度为M的字符串&am…...

Android系统启动流程--zygote进程的启动流程

在上一篇init进程启动流程中已经提到&#xff0c;在init中会解析一个init.rc文件&#xff0c;解析后会执行其中的命令来启动zygote进程、serviceManager进程等&#xff0c;下面我们来看一下&#xff1a; //文件路径&#xff1a;system/core/init/init.cppstatic void LoadBoot…...

C++程序设计——异常

一、C异常概念 异常处理是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时&#xff0c;就可以抛出异常&#xff0c;让函数的直接或间接的调用者处理这个错误。 &#xff08;1&#xff09;throw&#xff1a;当问题出现时&#xff0c;程序会通过throw关键字抛…...

2022年第十三届蓝桥杯web开发—东奥大抽奖【题目、附官方解答】

冬奥大抽奖 介绍 蓝桥云课庆冬奥需要举行一次抽奖活动&#xff0c;我们一起做一个页面提供给云课冬奥抽奖活动使用。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├── css │ └── style.css ├── effect.g…...

一份两年前一个月的工作经历没写在简历上,背调前主动坦白,却被背调公司亮了红灯,到手的offer没了!...

只因为简历上漏写了一份一个月的工作&#xff0c;就被亮了背调红灯&#xff0c;这公平吗&#xff1f;一位网友就被狠狠坑了一把&#xff0c;来看下他的遭遇&#xff1a;他有一份两年前、时长一个月的工作经历没写在简历上&#xff0c;背调前主动和背调公司还有招聘方hr都说了这…...

C++游戏分析与破解方法介绍

1、C游戏简介 目前手机游戏直接用C开发的已经不多&#xff0c;使用C开发的多是早期的基于cocos2dx的游戏&#xff0c;因此我们这里就以cocos2d-x为例讲解C游戏的分析与破解方法。 Cocos2d-x是一个移动端游戏开发框架&#xff0c;可以使用C或者lua进行开发&#xff0c;也可以混…...

食堂总是拥挤不堪?解决用餐拥挤,教你一招

随着近几年科技的快速发展&#xff0c;行业里出现了很多新的名词&#xff0c;比如智慧社区、智慧旅游、智慧建筑&#xff0c;那么智慧食堂是什么呢&#xff1f;它又是如何实现全自助、全智能消费&#xff1f; 在先进的智能技术以及市场需求带动下&#xff0c;智慧食堂经历了由传…...

ubuntu系统安装时 MBR和GPT的区别

主引导记录&#xff08;Master Boot Record &#xff0c; MBR&#xff09;是指一个存储设备的开头 512 字节。它包含操作系统的引导器和存储设备的分区表。   全局唯一标识分区表&#xff08;GUID Partition Table&#xff0c;缩写&#xff1a;GPT&#xff09;是一个实体硬盘…...

我在windows10下,使用msys64 mingw64终端

系列文章目录 文章目录系列文章目录前言一、MSYS2是什么&#xff1f;前言 msys2官网 MSYS2 &#xff08;Minimal SYStem 2&#xff09; 是一个MSYS的独立改写版本&#xff0c;主要用于 shell 命令行开发环境。 同时它也是一个在Cygwin &#xff08;POSIX 兼容性层&#xff09…...

个人2023FALL CS申请总结(PhD/MPhil/保研夏令营)

个人2023FALL CS申请总结&#xff08;PhD/MPhil/保研夏令营&#xff09;写在最前个人BG及申请情况个人BG申请情况MPhilPhD收获一句话总结&#xff1a;心态爆炸没用&#xff0c;脸皮够厚够勇就行 写在最前 真是一场恶战。有几天&#xff0c;我每天早上都海投几封套瓷邮件&…...

【优化算法】使用遗传算法优化MLP神经网络参数(TensorFlow2)

文章目录任务查看当前的准确率情况使用遗传算法进行优化完整代码任务 使用启发式优化算法遗传算法对多层感知机中中间层神经个数进行优化&#xff0c;以提高模型的准确率。 待优化的模型&#xff1a; 基于TensorFlow2实现的Mnist手写数字识别多层感知机MLP # MLP手写数字识别…...

CAM类激活映射 |神经网络可视化 | 热力图

文章目录前言&#xff1a;安装库&#xff1a;分类案例--ResNet50分割案例AttributeError: ‘tuple‘ object has no attribute ‘cpu‘RuntimeError: grad can be implicitly created only for scalar outputsTypeError: cant convert cuda:0 device type tensor to numpy. Use…...

RecyclerView+BaseRecyclerViewAdapterHelper显示不全只显示第一行item的解决问题

RecyclerViewBaseRecyclerViewAdapterHelper显示不全只显示第一行item&#xff0c;我懵了…&#xff0c;我不说多&#xff0c;直接说吧 先看一下适配器代码中的convert()方法&#xff1a; class MineRadioAdapter(layoutResId: Int R.layout.item_my_live) :BaseQuickAdapte…...

解决后端无法对前端的ajax请求重定向

本章目录&#xff1a; 问题描述 AJAX请求后端直接重定向失败解决方案 后端拦截请为响应头添加重定向标志后端拦截器为响应头添加重定向路径前端响应拦截器获取响应头数据&#xff0c;并通过location.href url 完成页面跳转一、问题描述 本来想在拦截器里设置未登录用户访问指…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github&#xff1a;https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...

Java多线程实现之Runnable接口深度解析

Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql

安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了&#xff0c;系统很多命…...

Ray框架:分布式AI训练与调参实践

Ray框架&#xff1a;分布式AI训练与调参实践 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 Ray框架&#xff1a;分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战

🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...

更新 Docker 容器中的某一个文件

&#x1f504; 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法&#xff0c;适用于不同场景。 ✅ 方法一&#xff1a;使用 docker cp 拷贝文件到容器中&#xff08;最简单&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…...

第21节 Node.js 多进程

Node.js本身是以单线程的模式运行的&#xff0c;但它使用的是事件驱动来处理并发&#xff0c;这样有助于我们在多核 cpu 的系统上创建多个子进程&#xff0c;从而提高性能。 每个子进程总是带有三个流对象&#xff1a;child.stdin, child.stdout和child.stderr。他们可能会共享…...

2025年全国I卷数学压轴题解答

第19题第3问: b b b 使得存在 t t t, 对于任意的 x x x, 5 cos ⁡ x − cos ⁡ ( 5 x t ) < b 5\cos x-\cos(5xt)<b 5cosx−cos(5xt)<b, 求 b b b 的最小值. 解: b b b 的最小值 b m i n min ⁡ t max ⁡ x g ( x , t ) b_{min}\min_{t} \max_{x} g(x,t) bmi…...

边缘计算设备全解析:边缘盒子在各大行业的落地应用场景

随着工业物联网、AI、5G的发展&#xff0c;数据量呈爆炸式增长。但你有没有想过&#xff0c;我们生成的数据&#xff0c;真的都要发回云端处理吗&#xff1f;其实不一定。特别是在一些对响应时间、网络带宽、数据隐私要求高的行业里&#xff0c;边缘计算开始“火”了起来&#…...

FTPS、HTTPS、SMTPS以及WebSockets over TLS的概念及其应用场景

一、什么是FTPS&#xff1f; FTPS&#xff0c;英文全称File Transfer Protocol with support for Transport Layer Security (SSL/TLS)&#xff0c;安全文件传输协议&#xff0c;是一种对常用的文件传输协议(FTP)添加传输层安全(TLS)和安全套接层(SSL)加密协议支持的扩展协议。…...