【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://www.hqwc.cn/news/644468.html

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

相关文章

【电控笔记5.7】Notch-Filter滤波器

Notch-Filter滤波器 通过阻尼比&#xff0c;限制陡峭程度 阻尼比小&#xff0c;比较陡峭&#xff0c;对周围信号干扰比较小&#xff0c;衰减度小 总结 实现&#xff1a;转换成Z转换进行伯德图验证

「锐利」升级到13.5版本,重磅推出插拼式智能拼版等多项新功能!

包装印前软件「锐利」又升级了&#xff01;13.5版本&#xff01; 锐利是集印前行业三十多年的技术和经验开发的一款包装印前处理软件&#xff0c;提供陷印、拼大版、预览、智能标记、预飞、工具箱、导出图像、搜索器、油墨编辑、曲线调整、模拟套印不准、导入标准PDF、条形码、…

YashanDB V23.2 LTS发版 | 共享集群首个长期支持版本

4月&#xff0c;YashanDB正式发布长期支持版本YashanDB V23.2 LTS&#xff0c;标志着YashanDB单机主备、共享集群和分布式实时数仓等完整产品体系&#xff0c;已全面进入可规模化使用的长期支持阶段&#xff1b;同时配套数据迁移工具、监控运维工具和开发者工具&#xff0c;可以…

【C语言__指针01__复习篇11】

目录 前言 一、什么是指针 二、计算机中常见的单位 三、CPU是怎样找到一块内存空间的 四、如何得到变量的地址 五、指针变量 六、解引用指针变量的作用 七、指针变量的大小 八、指针变量类型的意义 8.1 指针的解引用 8.2 指针-整数 九、void*指针 十、const修饰变…

微博评论爬取

import requests import csv# 打开CSV文件以写入数据 f open(data.csv, modea, encodingutf-8-sig, newline) csv_writer csv.DictWriter(f, fieldnames[昵称, 性别, 归属地, 内容]) csv_writer.writeheader()# 定义一个函数用于获取评论内容 def GetContent(max_id):# 设置请…

LeetCode-2385. 感染二叉树需要的总时间【树 深度优先搜索 广度优先搜索 二叉树】

LeetCode-2385. 感染二叉树需要的总时间【树 深度优先搜索 广度优先搜索 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;记录父节点 DFS解题思路二&#xff1a;解题思路三&#xff1a;深度优先搜索建图 广度优先搜索求感染时间【最容易理解】 题目描述&#xff1a; 给…

CMakeLists.txt中如何添加编译选项?

1. 引子 编译器有多种可供选择&#xff0c;如g、c、clang等&#xff0c;如下以c作为示例。 2. 使用CMAKE_CXX_FLAGS添加编译选项 在Makefile中可能用类似如下的指令来添加编译选项&#xff1a; /usr/bin/c -Wall -Wextra -Wno-sign-compare -Wno-unused-variable -Wno-unuse…

pytorch-MNIST测试实战

目录 1. 为什么test2. 如何做test3. 什么时候做test4. 完整代码 1. 为什么test 如下图&#xff1a;上下两幅图中蓝色分别表示train的accuracy和loss&#xff0c;黄色表示test的accuracy和loss&#xff0c;如果单纯看train的accuracy和loss曲线就会认为模型已经train的很好了&a…

【js】解决自动生成颜色时相邻颜色视觉相似问题的技术方案

解决自动生成颜色时相邻颜色视觉相似问题的技术方案 在进行大规模颜色生成时&#xff0c;特别是在数据可视化、用户界面设计等应用领域&#xff0c;一个常见的挑战是确保相邻颜色在视觉上具有足够的区分度。本文介绍的方法通过结合黄金分割比与饱和度、亮度的周期性变化&#…

YOLOv8改进项目汇总-超全改进-ultralyticsPro介绍:订阅了《芒果YOLOv8原创改进专栏》的读者免费赠送,包括很多稀有改进

&#x1f525;&#x1f525;&#x1f525;专注于YOLOv8改进&#xff0c;NEW - YOLOv8 &#x1f680; in PyTorch >, Support to improve Backbone, Neck, Head, Loss, IoU, LA, NMS and other modules&#x1f680; Makes YOLOv8 improvements easy again 芒果出品 YOLOv8…

如何使用RRT模式进行交易,昂首资本实例讲解

在上篇文章中&#xff0c;昂首资本用一篇文章讲解了&#xff0c;如何使用RRT模式进行交易以及背后的原理。如果没有看到的各位投资者可以往前翻一下&#xff0c;当然了也有投资者提到了新的问题&#xff0c;那就如何使用&#xff0c;今天昂首资本就用下面有几个例子实例讲解&am…

大数据入门——概念、工具等

目录 一、基本概念 1.大数据技术 2.大数据特点 3.常见概念 4.数据分析师、数据开发工程师 二、相关工具 三、应用场景 四、大数据业务流程及组织结构 一、基本概念 1.大数据技术 主要解决海量数据的采集、存储和分析计算问题 2.大数据特点 大量、高速、多样、价值、…