【Netty框架问题总结】

文章目录

  • Netty初步认识
    • Netty简单介绍
    • 为什么jdk已经实现了NIO还要用netty框架:
  • Reactor 线程模型
    • Reactor 单线程模型
    • Netty线程模型
  • Netty 简单实现
    • EchoClient端实现:
    • ClientHandler实现
    • EchoServer实现
    • ServerHandler实现:

Netty初步认识

Netty简单介绍

Netty 是一个基于 Java NIO 的异步事件驱动的网络应用框架,用于快速开发高性能、可维护的网络服务器和客户端。它提供了简单易用的 API,使得网络编程更加轻松。Netty 的设计重点在于提供高性能、高可靠性和灵活性,适用于各种网络应用场景,包括但不限于服务器通信、分布式系统、即时通讯等。
Netty 的主要特点包括:
1.异步事件驱动:Netty 使用基于事件驱动的模型,通过回调机制实现非阻塞式的网络通信,提高了系统的并发性能。
高性能:Netty 的内部实现对网络 I/O 进行了优化,采用了零拷贝技术和基于内存池的内存管理,以提升网络通信的效率和吞吐量。
2.组件丰富:Netty 提供了丰富的组件和工具,包括 Channel、EventLoop、Codec、Handler 等,方便开发者构建各种复杂的网络应用。
3.跨平台性:Netty 的设计考虑了跨平台性,可以在不同的操作系统上运行,并提供了对不同网络协议的支持,如 TCP、UDP、HTTP 等。
4.易用性:Netty 提供了简单易用的 API,使得开发者能够快速构建高性能的网络应用,同时也提供了丰富的文档和示例,方便开发者学习和使用。

传统的socketl连接请求:
在这里插入图片描述
NIO架构图:
在这里插入图片描述
NIO:是同步非阻塞的,服务器实现模式为 一个线程处理多个连接。服务端只会创建一个线程负责管理Selector(多路复用器),Selector(多路复用器)不断的轮询注册其上的Channel(通道)中的 I/O 事件,并将监听到的事件进行相应的处理。每个客户端与服务端建立连接时会创建一个 SocketChannel 通道,通过 SocketChannel 进行数据交互。

为什么jdk已经实现了NIO还要用netty框架:

原生 NIO 存在问题:
1.NIO 的类库和 API 繁杂
2.需要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,必须对多线程和网络编程非常熟悉, 才能编写出高质量的 NIO 程序
3.开发工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常 流的处理等等处理起来难度会比较大。
4.JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU 100%。直到 JDK 1.7 版本该问题仍旧存在,没有被根本解决。
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 可以被及时修复,同时更多的新功能会被加入

Reactor 线程模型

Reactor 单线程模型

在这里插入图片描述
Reactor 单线程模型是一种简单的事件驱动模型,适用于处理低负载的网络应用。在 Reactor 单线程模型中,所有的 I/O 操作都由一个 Reactor 线程来处理。主要特点包括:
1.单线程:整个应用只有一个 Reactor 线程,负责监听所有的事件,并且串行地处理这些事件。
2.事件循环:Reactor 线程采用事件循环(Event Loop)的方式,不断地轮询注册在其上的 I/O 事件,当有事件发生时,React 线程会调用相应的处理方法进行处理。
3.非阻塞 I/O:在 Reactor 单线程模型中,所有的 I/O 操作都是非阻塞的,即当有事件发生时,Reactor 线程会立即处理,而不会阻塞等待。
4.简单性:由于整个应用只有一个线程,因此编程模型比较简单,不需要考虑多线程并发的复杂性,适合于初学者或者对性能要求不高的场景。
5.适用性:Reactor 单线程模型适用于处理连接数较少、业务逻辑简单、并发负载较低的网络应用场景。
尽管 Reactor 单线程模型简单,但其并发能力有限,容易成为性能瓶颈,因此在高并发、高负载的场景下,通常会选择使用多线程模型或者线程池来提高系统的性能和可扩展性。

Netty线程模型

在这里插入图片描述Boss Group相当于主Reactor、而Worker Group 相当于从Reactor 。流程还是相对简单;Boss 接收处理请求通道事件、转发到Work Group去处理、通过ServerBootstrap组装启动、再通过Pipeline去处理Handler 处理器(一个Pipeline可自由组装多个Handler 、每个通道都会一一对应一个Channel连接通道)。

Netty 简单实现

EchoClient端实现:

public final class EchoClient {static final String HOST = System.getProperty("host", "127.0.0.1");static final int PORT = Integer.parseInt(System.getProperty("port", "8007"));static final int SIZE = Integer.parseInt(System.getProperty("size", "256"));public static void main(String[] args) throws Exception {// Configure SSL.gitfinal SslContext sslCtx = ServerUtil.buildSslContext();// Configure the client.EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true).handler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline p = ch.pipeline();if (sslCtx != null) {p.addLast(sslCtx.newHandler(ch.alloc(), HOST, PORT));}//p.addLast(new LoggingHandler(LogLevel.INFO));p.addLast(new EchoClientHandler());}});// Start the client.ChannelFuture f = b.connect(HOST, PORT).sync();// Wait until the connection is closed.f.channel().closeFuture().sync();} finally {// Shut down the event loop to terminate all threads.group.shutdownGracefully();}}
}

ClientHandler实现

public class EchoClientHandler extends ChannelInboundHandlerAdapter {private final ByteBuf firstMessage;/*** Creates a client-side handler.*/public EchoClientHandler() {firstMessage = Unpooled.buffer(EchoClient.SIZE);for (int i = 0; i < firstMessage.capacity(); i++) {firstMessage.writeByte((byte) i);}}@Overridepublic void channelActive(ChannelHandlerContext ctx) {ctx.writeAndFlush(firstMessage);}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {ctx.write(msg);}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) {ctx.flush();}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {// Close the connection when an exception is raised.cause.printStackTrace();ctx.close();}
}

EchoServer实现

public final class EchoServer {static final int PORT = Integer.parseInt(System.getProperty("port", "8007"));public static void main(String[] args) throws Exception {// Configure SSL.final SslContext sslCtx = ServerUtil.buildSslContext();// Configure the server.EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();final EchoServerHandler serverHandler = new EchoServerHandler();try {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 100).handler(new LoggingHandler(LogLevel.INFO)).childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline p = ch.pipeline();if (sslCtx != null) {p.addLast(sslCtx.newHandler(ch.alloc()));}//p.addLast(new LoggingHandler(LogLevel.INFO));p.addLast(serverHandler);}});// Start the server.ChannelFuture f = b.bind(PORT).sync();// Wait until the server socket is closed.f.channel().closeFuture().sync();} finally {// Shut down all event loops to terminate all threads.bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}

ServerHandler实现:

@Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {ctx.write(msg);}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) {ctx.flush();}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {// Close the connection when an exception is raised.cause.printStackTrace();ctx.close();}
}

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

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

相关文章

【VSCode调试技巧】Pytorch分布式训练调试

最近遇到个头疼的问题&#xff0c;对于单机多卡的训练脚本&#xff0c;不知道如何使用VSCode进行Debug。 解决方案&#xff1a; 1、找到控制分布式训练的启动脚本&#xff0c;在自己的虚拟环境的/lib/python3.9/site-packages/torch/distributed/launch.py中 2、配置launch.…

检查*.bib参考文献是否重复

安装bibtexparser pip install bibtexparser 代码 import bibtexparser from difflib import SequenceMatcherdef parse_bib_file(filename):with open(filename, r, encodingutf-8) as bibfile:bib_database bibtexparser.load(bibfile)return bib_database.entriesdef fi…

Python构建学生信息管理系统:构建RESTful API - 学生信息管理系统的后端逻辑

在之前的博客里&#xff0c;我们已经完成了项目初始化&#xff0c;在本篇博客中&#xff0c;我们将深入探讨如何使用Flask框架实现学生信息管理系统的后端逻辑&#xff0c;特别是通过RESTful API来实现学生信息的增删改查&#xff08;CRUD&#xff09;操作。 Flask RESTful AP…

【Java】HOT100 回溯

目录 理论基础 一、组合问题 LeetCode77&#xff1a;组合 LeetCode17&#xff1a;电话号码的字母组合 LeetCode39&#xff1a;组合总和 LeetCode216&#xff1a;组合总和ii LeetCode216&#xff1a;组合总和iii 二、分割问题 LeetCode131&#xff1a;分割回文串 Leet…

单片机通讯协议

参考&#xff1a;江科大单片机教程 STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili IIC通讯协议SPI通信协议UARTCANUSB速度100k-400khz4Mhz-线数2 CLK,DATA4CLK,ENB,IO,OI额外设备一主多从一主多从 一般不用自己写&#xff0c;都有相应的库或官方提供相应的&#…

element中file-upload组件的提示‘按delete键可删除’,怎么去掉?

问题描述 element中file-upload组件会出现这种提示‘按delete键可删除’ 解决方案&#xff1a; 这是因为使用file-upload组件时自带的提示会盖住上传的文件名&#xff0c;修改一下自带的样式即可 ::v-deep .el-upload-list__item.is-success.focusing .el-icon-close-tip {d…

【国家环保协会】中华环保联合会水治理专业委员会 | 推动企业发展,加强资源共享

会员招募 会员权益 一、享受双铜牌认证服务&#xff1b; 二、为会员单位颁发证书&#xff0c;并为委员颁发聘书&#xff1b; 三、优先为企业提供创新技术、产品科技成果评价鉴定&#xff1b; 四、协助单位会员建立专业领域团体标准&#xff1b; 五、协助会员组织发起公益活…

揭秘亚马逊、虾皮自养号测评:提升排名与流量的新策略

亚马逊一直是跨境电商平台中的佼佼者&#xff0c;每年新入驻亚马逊的商家也是非常多的&#xff0c;对于新入驻的卖家来说&#xff0c;如何在竞争激烈的市场中脱颖而出&#xff0c;增加流量并转化为订单&#xff0c;是摆在面前的重要任务。 一、亚马逊新店怎么增加流量&#xf…

Langchain-Chatchat修改加载显卡

NLP - LLM - Langchain-Chatchat修改加载显卡 一、Langchain-Chatchat存在问题二、 Langchain-Chatchat加载显卡配置1. 模型加载的位置2. 函数中提供模型加载GPU的配置&#xff0c;但是不生效 三、 修改Langchain-Chatchat加载显卡配置1. 第一步修改&#xff08;create_model_w…

Simulink从0搭建模型02-仿真时间、求解器、数据类型、delay模块

参考博客 b站视频 【Simulink 0基础入门教程 P3 仿真时间、求解器、数据类型、delay模块介绍】 个人听了这个博主的视频风格觉得很适合我入门学习&#xff0c;讲得很清楚。 另外&#xff0c;视频里面教得很详细了&#xff0c;我也不会再详细写怎么打开创建等步骤&#xff0c;…

可视化大屏的应用(15):智慧城市中的十大价值

可视化大屏在智慧城市领域的十大应用价值如下&#xff1a; 实时数据监控&#xff1a; 可视化大屏可以将城市各种实时数据&#xff0c;如交通流量、环境监测、能源消耗等数据&#xff0c;以图表、地图等形式展示&#xff0c;帮助城市管理者实时监控城市运行状况。 智慧交通管理…

SuperPoint:Weights File and Demo Script

一、SuperPoint简介 1.1 项目简介 在计算机视觉领域&#xff0c;SuperPoint预训练网络是一个开源项目&#xff0c;由Magic Leap Research团队开发。此项目提供了一种高效且准确的关键点检测和描述子提取算法&#xff0c;旨在改进各种视觉任务的性能&#xff0c;如图像配准、3…

数组:最值,反转数组,打乱顺序

文章目录 最值反转数组打乱顺序 位置 最值 package com.zhang.demo; /*这个是求最大值 * * */ public class Test1 {public static void main(String[] args) {int[] arr {13,77,89,333,2,99};int max arr[0];for(int i 1;i < arr.length-1;i){if(max < arr[i]){maxa…

【热议】硕士和读博士洗碗区别的两大理论

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

白酒:香型对白酒品质的影响与消费者偏好

云仓酒庄的豪迈白酒认为香型对白酒品质的影响与消费者偏好是值得探讨的话题。香型作为白酒品质的重要因素之一&#xff0c;对白酒的口感、风味和品质产生着深远的影响。同时&#xff0c;消费者的偏好也是决定香型选择的重要因素之一。 首先&#xff0c;香型对白酒品质的影响是不…

光透过率检测仪解析

TH-SGT1便携式隧道光透过率检测仪是一种用于快速、准确地测量隧道内光透过率的设备。它的主要特点是便携性和易用性&#xff0c;方便用户进行现场检测和监测。 这种检测仪通常结合了光电测量技术和现代便携式设计&#xff0c;使得用户可以在各种环境下方便地进行光透过率的测量…

【SunTorque智能扭矩系统】螺栓拧紧扭矩常见问题及解决措施

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 螺栓拧紧扭矩是机械工程中常见的关键参数之一&#xff0c;它直接关系到设备的安全性和可靠性。然而&#xff0c;在实际操作中&#xff0c;螺栓拧紧扭矩的控制常常面临各种问题和挑战。本文将探讨螺栓拧紧扭矩常见的问题…

海南陵水国际数字内容产业平台正式上线

4月14日&#xff0c;数创陵水链接全球——海南陵水国际数字内容产业平台上线发布会在陵水黎族自治县清水湾举行&#xff0c;来自全球各地的500余名商协会代表、企业家共同见证了平台上线&#xff0c;标志着陵水在推进数字化创新、打造国际数字内容产业新高地方面迈出坚实步伐。…

B站评论无限点赞

网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

基于一款最多能够支持10000路的 modbus RS485 led灯光控制板做灯控程序

背景 介绍一款之前用过的一款设备&#xff0c;基于RS485通讯协议&#xff0c;控制LED灯或RGB灯带。 设备介绍 之前用它来做智能中药柜的灯控板&#xff0c;结合物联网网关&#xff0c;modbus采集&#xff0c;mqtt转发&#xff0c;以及mqtt的rpc指令下发 设备图片 功能说明 …