本文详细介绍了Netty Network编程框架和进入案例的核心概念。
简而言之,Netty具有三个优势:
借用官方描述:Netty成功找到了一种可以实现轻松发展,性能,稳定性和灵活性的方法,而不会损害维护和性能。
Netty的社区目前非常活跃。许多开源项目,网络调用的底层用于网络调用。例如,我们常用的Dubbo,RocketMQ,Elasticsearch,GRPC,Spark,Gateway等。
简而言之,当涉及网络编程开发时,例如即时消息系统,自定义RPC框架,自定义HTTP服务器,真实的 - 时间消息推动系统,使用Netty,正确。
通道,NetTy网络操作摘要类,包括基本的I/O操作,例如绑定,连接,读取,写作等,Netty的通道接口提供的API大大降低了直接使用套接字类的复杂性。
不同的协议和不同的阻止类型具有与之相对应的不同频道类型。以下是一些常用的频道类型:
Eventloop接口是NetTy的核心接口,用于处理连接生命周期中发生的各种事件。实际上,它负责监视网络事件并调用事件处理器以进行相关的I/O操作。
Eventloop在内部持有Nio的选择器。频道将在Eventloop中注册。一个Eventloop可以监视多个通道。EventLoop是反应堆模型中MainreActor的核心。
频道为Netty网络运行一个抽象类。EventLoop负责监视注册的频道IO事件。两者与I/O操作合作。
Netty的IO操作都是异步的,他们不能立即知道该新闻是否正确处理。
在Eventloop中注册的频道后,将立即返回Channeelfance对象。您可以通过Channelture#AddListener注册GenerCfutureListener的侦听器。
ChannelHandler是消息的特定处理器。他负责处理各种任务。这项任务非常广泛。它可以读写事件,连接,解码代码,数据转换,业务逻辑等。处理后,数据将继续转发到ChannelPipeline中的下一个ChannelHandler。
通过自定义的ChannelHandler,它可以扩展NetTy。ChannelHandler接口不提供许多方法,因为有很多方法可以实现此接口。为了方便起见,它可以继承其子类:
或使用以下适配器类,这更方便:
ChannelPipeline是由ChannelHandler的链条列表,该链由ChannelHandler组成,该渠道提供了进入链条沿链的站和出站事件的API。
您可以在通道台上的AddLast()方法上添加一个或多个ChannelHandler,因为一个数据或事件可以由多个处理程序处理。在ChannelHandler处理过程后,将数据移交给下一个ChannelHandler。
在执行期间,入口事件将从链接列表头传递到最后一个入口处理程序(ChannelInboundHandler类型)。处理程序的类型在执行过程中不会互相干扰。如果处理程序属于入口和退出手柄,则将执行一次。
在Netty中,每个通道具有和一个通道私线对应于此。创建频道时,它将自动分配到其独家通道私线。
用于传输业务数据并保存与渠道相关的所有上下文信息。
联系处理程序和管道。实际上,ChannelHandLercontext直接存储在ChannelPipeline中,并且每个ChannelHandlerContext都与唯一的ChannelHandler关联。
输入该站的数据通常是指阅读事件的触发器,也就是说,必须读取数据;数据从基础Java Nio通道读取Netty的通道。在此过程中将执行数据解码。
数据插座通常是指事件的触发因素,即必须编写数据;数据是从Netty通道到基础Java Nio Chanel编写的。在此过程中将执行数据编码。
该站将首先读取数据,然后执行输入处理程序;出口将首先执行处理程序,然后写下。
也就是说,每次我阅读事件时,都会执行输入操作。阅读数据后,它将从头到尾拨打通道台阶中的InboundHandler。在编写数据之前,它将从末端到末尾调用ChannelPipeline的外口手机。
下图描述了ChannelPipeline中的ChannelHandlers通常如何处理I/O事件(https://netty.io/4.1/api/io/io/netty/channelpipeline.html):
如图的左侧所示,入口事件以底部的输入处理过程的方向进行处理。进入处理程序通常由I/O线程在底部的I/O线程生成的原始输入数据处理该图,例如通过socketchannel.read(bytebuffer)读取。
如图的右侧所示,出口事件以从上到下的方向进行处理。退出车站的处理过程通常会生成或转换出口流,例如编写请求。如果出口事件超过底部出站处理过程,它由与通道关联的I/O线程进行处理。I/O线程执行实际的输出操作,例如通过Socketchannel.write(ByteBuffer)输出。
EventLoopGroup等同于事件的周期组。该组包含多个事件循环eventloop。Eventloop的主要角色实际上是负责聆听网络事件并调用有关I/O操作的事件处理器。
事件卢比集团内部的每个事件卢比通常包含1个选择器和1个事件周期线程。一个EventLoop可以绑定多个通道,但是通道只能绑定事件卢比,因此连接的IO事件在专有线程上。处理以确保线程安全性。
Netty Server包含1个Boss Nioeventloopgroup和1个Worker Niofeventloopgroup:
在内部实现了基于多路代表的Netty和处理用户请求,并将两个线程池,Boss线程池和工作线程池实现。工作线程池。其中,工作池的读写事件是由相应处理程序处理的请求和业务逻辑负责的。
Netty主要依靠NioEventloopGroup线程池的配置来实现特定的线程模型。
BossGroup和WorkerGroup使用相同的NioEventloopGroup,线程数为1。
适用于几乎没有连接和并发的应用。
BossGroup和WorkerGroup使用不同的NioEventloopGroup,而bossground的1个线程数为1。
适用于具有少量连接和较大并发的应用。
BossGroup和WorkerGroup使用不同的NioEventloopGroup,并且两者都配置为多线程。
适用于相对较大的连接和并发的应用。
从主线程NIO池中选择一个线程作为受体线程,绑定监视端口,接收客户端连接的连接,其他线程负责后续访问认证。连接完成后,将分配给WorkerGroup线。
*EventloopGroup的默认构造函数实际的线程数为2,但是BOSSGROUP的数量通常设置1.事件loopGroup中的Eventloop数量是线程数,以确保1到1之间的关系。** **
首先,初始化两个NioEventloopgroup。其中,BoosGroup用于处理客户端来构建TCP连接请求(接受事件)。WorkerGroup用于处理I/O读写事件以及每个连接的特定业务逻辑。
NioEventloopGroup设置的线程数量的非构造函数-Fre构造函数是CPU Core2。在正常情况下,我们将指定BossGroup的线程数为1(当并发连接的数量不大时)和工作组的线程是CPU核心编号2。
然后创建一个服务器的ServerBootstrap,这是服务器的start -UP指南类/辅助类,它将指导我们启动服务器。ConfigureEventloopGroup,通过ServerBootStrap,Connect connect参数,配置输入,出口事件处理程序等。
最终通过bind()方法绑定端口并开始工作。
首先,初始化NioEventloopgroup。
后来,Bootstrap是客户端的开始 - UP指导类/辅助类,它将指导我们启动客户端。ConfigureEventloopGroup,通过bootstrap,Connect connect参数,配置输入,出口事件处理程序等。
最后,使用连接()方法连接到服务器的IP和端口以开始工作。
TCP通过流进行处理。底部会有一个缓冲区。TCP可以将一个完整的较大软件包分为多个软件包,以发送。数据包发送。
TCP粘包/拆卸的原因:应用程序编写的字节大小大于缓冲沉积的大小,并且会发生拆卸现象。实际性能是无法接收完整的消息。应用程序的应用小于套接字缓冲区的大小,并且网卡将多次将应用程序的应用程序发送到网络。这将发生。实际的性能是一次接收多个粘附消息。
报纸的选项字段是MSS(最大段尺寸,最大的新闻段大小)字段,它指定了可以通过TCP软件包传输的最大字节数,通常1500-20-20-20 = 1460字节,这将是拆除大于该大小。
Netty客户端和服务器使用较长的连接来保持联系。Client和Server完成了读写,并且它们之间的连接不会主动,随后的读取和写作操作将继续使用此连接。连接可以节省更多的TCP建立和关闭操作,从而减少对网络资源的依赖并节省时间。
在保持长时间的TCP连接过程中,可能会发生网络异常(例如互联网断开)。当出现异常的情况下,如果客户端和服务器之间没有相互作用,他们找不到另一方已下降。要解决此问题,我们需要引入心跳机制。
心跳机制的工作原理是:当客户端和服务器之间没有数据交互的一段时间内,即当怠速状态处于空闲状态时,客户端或服务器将发送一个特殊的数据包给另一方。消息后,也立即发送了一条特殊的数据消息来响应发件人,这是ping-poong的互动。因此,当一定端收到心跳时,它知道另一方是仍然在线,这确保了TCP连接的有效性。
TCP实际上具有长连接选项。它还具有心跳软件包机制,即TCP选项:so_keepalive。但是,TCP协议级别的长期连接不够灵活。因此,通常,我们都意识到应用程序层协议上的自定义心跳机制也就是说,通过在Netty级别进行编码。如果心跳机制由Netty实施,则核心类是IdlestateHandler。
哪种心跳类型设置支持Netty:
零拷贝(英语:零拷贝;也翻译为零副本)技术是指CPU,无需在计算机执行操作时将数据从特定区域复制到另一个特定区域。该技术通常用于保存CPU通过网络传输文件时的循环和内存带宽。
Netty中的零副本反映在以下方面:
不同的功能:Tomcat是一个servlet容器。它可以被视为Web服务器。这是已开发的软件。Netty是功能强大的异步网络应用程序框架。
该协议不同:Tomcat是基于HTTP协议的Web服务器,Netty支持各种就绪制作协议,并且可以通过编程来自定义各种协议。由于Netty本身可以编码/解码字节流,因此Netty可以实现HTTP服务器,FTP服务器,FTP服务器,FTP Serverserver,UDP服务器,RPC服务器,Websocket Server,Redis的Proxy Server,MySQL Proxy Server,等等。
客户:
ClientHandler:
NettyServer:
ServerHandler:
参考文章: