当前位置: 首页 > 网络应用技术

Netty系列(2)-Netty简介

时间:2023-03-07 01:55:44 网络应用技术

  如果我们网络编程基于本机NIO,则需要使用大量编程来实现许多问题,例如连接异常,网络闪烁,粘袋,半数据包,网络拥塞,异常代码流,请求排队等。WAIT。开发人员需要加深线程,IO和Internet的概念,这些概念很容易导致复杂而模糊的代码,并且很难快速编写高可靠性实现。Java自己的Nio Nio设计更底层,其复杂性和复杂性和复杂性和可伸缩性有一定的局限性。

  根据基金会Nio,Netty使用精致的设计事件机制来隔离业务逻辑和无关的技术逻辑,封装了许多复杂的网络通信细节,提供了相对简单易用的API,非常适合网络编程。Developersit可以基于IT开发非常复杂的网络通信程序。

  Netty是一个客户/服务器网络应用程序框架,用于快速开发网络服务器和客户端程序。Netty是行业中最受欢迎的Java开源之一。它被广泛用于各种分布式,即时消息传递和中间件,例如Dubbo,Elasticsearch,RocketMQ,等。

  从Netty的官方模块部门的角度来看,它主要包括三个主要模块:

  Netty是Java Nio框架的超级集合。除核心事件机制外,Netty还提供了许多功能,例如:

  本系列文章中使用的Netty版本是。

  Maven取决于如下:

  Netty Github:https://github.com/netty/netty

  参考书:“ Netty权威指南”

  让我们看一下Netty编写的客户/服务方面网络通信程序。代码注释说明了每个行代码的含义。

  让我们看一下演示程序中使用的一些组件和配置。

  ServerBootstrap

  这是Netty服务器的开始 - UP类条目,主要是设置服务器以通过它启动相关参数。底层通过外墙模式通过各种功能抽象,以防止用户处理太多的基础API并减少开发难度。相应地,它是客户的启动助手。

  最后,通过该方法调用操作系统和功能,以开始监视客户端请求。

  EventloopGroup

  EventLoop是Netty处理事件的核心机制。EventLoopGroup类似于具有多个Eventloop Inside的线程组。Eventloop的责任是处理注册到此线程多通道复制器选择器的频道,并且Selector的报告操作由Eventloop界限进行了线程。

  ServerBootstrap设置两个,一个是Bossground,另一个是WorkerGroup。Bossground负责聆听港口的itu告;WorkerGroup负责处理插座连接请求。

  serversocketchannel

  然后设置监视端口的管道,负责处理基础操作系统,监视端口和创建。

  相应的是serversocket,而serversocketchannel在nio中对应。

  ChannelHandler

  通过设置管道初始化设备,您可以通过此初始化器添加Socketchannel自定义处理器。在演示中,我们实现了网络数据交互以及客户端和服务器之间的请求处理,并在自定义的NetTyclinewhandler和NetTyServerhandler中。

  ChannelHandler是用户为用户展开和自定义的关键接口。使用ChannelHandler可以完成大多数功能自定义,例如业务逻辑,消息编码,心跳,安全认证,流量控制等。

  通道私线

  Socketchannel创建管道时会初始化管道。该管道可以通过Socketchannel获得,并且可以添加一系列自定义处理器。

  网络事件以事件流的形式以事件的形式流动。ChannelPipeline负责处理网络事件的责任链,并负责管理和执行ChannelHandler。

  渠道

  Netty中的所有I/O操作都是异步的,也就是说,该操作不会立即返回。频道对象代表异步操作本身,这是Netty实现异步IO的基础之一。

  Netty的异步编程模型基于未来和回调概念。Netty扩展了Java标准未来,为自己的场景提供了独特的未来定义。

  so_backlog

  设置积压参数,此参数对应于TCP三 - 时间握手队列的大小。此参数是调用侦听功能时所需的参数。

  Linux标头文件和函数的功能定义如下:

  侦听函数将根据传输的参数采用两者的较小值。如果接受队列已满,则将拒绝客户端连接。

  so_keepalive

  设置KeepAlive参数。

  通过三个握手建立TCP网络连接后,当默认值在2小时内未发送任何网络包时,如果设置了keepalive = true,此时,您将向其他派对欧洲资源发送一个检测包。

  维护TCP长连接时系统配置的参数如下:

  BYTEBUF

  当我们执行数据传输时,经常使用缓冲区,通常使用的是java.nio.nio.buffer。

  在ChannelRead中,我们将MSG转换为BYTEBUF,因为Socketchannel中接收到的字节数据将放置在Bytebuf Buffer.Though Bytebuf的可读取Bytes方法中,您可以获得可以可读的可读数字,可以根据可读的字节阵列创建可读的字节阵列编号,然后通过Bytebuf的ReadBytes方法将缓冲区中的字节数组复制到新构建的字节数组。最后,新的字符串构造函数获得了请求消息。当响应数据时,还需要将消息写入缓冲区bytebuf,然后将其写入Socketchannel。

  让我们使用下面的图组合演示程序,并查看Netty的核心组件如何工作。

  维护组,EventLoop用于处理在频道生命周期中发生的事件。EAVENEVENTLOOP将绑定线程和选择器。Netty的频道将在Eventloop中注册。最后,实际上是注册的。选择器将收听频道事件。事件发生后,它通过线程处理。

  Netty服务器由服务器启动。ServerBootstrap首先需要设置两个EventloopGroup以监视客户端的TCP连接请求;IO要求建立连接的渠道的请求。

  当ServerBootstrap调用bind()方法绑定地址时,操作系统的socket(),bind()和list()函数将调用底层的操作系统,然后获取一个Monitoring Channel Serversocketchannel。这将在Eventloop中注册,并且由IT绑定的选择器将收听Serversocketchannel中的事件。

  启动了Netty客户端,并且Bootstrap需要设置EventloopGroup.bootstrap调用连接服务器的Connect()方法,并且底层将调用socket()和连接操作系统的connect()函数。通过TCP连接三次,双方都将获得一个,然后注册到Eventloop,然后由IT绑定的选择器侦听Socketchannel中的事件。

  可以通过TCP的三个时间握手来创建连接socketchannel,然后在初始化时创建它,然后通过ChannelInitializer初始化,添加各种输入/输出处理器来处理IO请求。ChannelPipeLine将负责有序的散布事件责任链以及责任链可以选择监视和处理他们关心的事件。

  原始:https://juejin.cn/post/7100845891346497549