Netty初步理解

一、基础介绍

Netty是一个基于NIO通信、高性能、高可靠性的网络服务器和客户端程序的编程框架,如果实现一些网络通信,则需要使用TCP,目前操作TCP的技术是SOCKET, 那么Netty就是封装Socket的框架,可以让我们更加好的操作网络通信,解决粘包、拆包等问题。

并且Netty提供异步的、事件驱动的网络应用程序框架,可以让我们开发高性能的服务器。

二、Netty简单使用介绍

Netty核心组件是channel, 一个socket TCP连接则会创建一个对应的channel,每个 Channel 都是独立的通信流,它有自己的缓冲区、状态和处理器链。通过为每个 Channel 分配不同的处理器链,可以实现不同的数据处理逻辑,从而提高灵活性和可维护性。那么socket通信的数据则会在channel流转,然后在channel上有一个handler执行链,用于处理发送的数据以及读取的数据。

handler处理器就可以用来进行拆包、粘包以及解析对应的数据
在这里插入图片描述
在这里插入图片描述
在inBoundhandler最后的处理器可以声明自己写的处理器,用于处理最后的结果数据。

这个处理器必须实现ChannelInboundHandler,也就是声明是一个入站拦截器。该接口也就是netty提供的基础回调接口,当对应事件发生后,会调用对应回调接口。

在这里插入图片描述

三、ChannelInboundHandler 类图

ChannelInboundHandlerAdapter 实现 ChannelInboundHandler

SimpleChannelInboundHandler 继承 ChannelInboundHandlerAdapter

如果我们解码后的数据是特定的格式,可以使用SimpleChannelInboundHandler,
该抽象类提供消息类型,使得我们更加好地处理消息数据。

在这里插入图片描述

四、netty中的work工作组

在netty服务端中,需要声明netty的boss group 和work. group
在这里插入图片描述
第一个就是boss group ,如果监听一个端口的话,则设置为1,这个是用来accept socket的请求的,也就是检查事件的,如果有读事件到达了,则将读事件注册到worker group中的selector中作为一个taskQueue。selectotr循环执行,可以获得就绪的事件,并且调用对应回调函数处理真正的逻辑读写,如果此时该逻辑读写使用很长时间,会导致整个worker线程堵塞,一般要求读写是cpu执行,如果是io任务居多的话,可以将worker 线程数设置很多。
第二个就是work group ,是用来进行工作处理的,如果不填值的话,则是核数*2的数量。

在这里插入图片描述
为什么Netty网络的通信必传统的BIO快,就来自它这个NIO的select模型,BIO每一个工作线程就专门服务一个socket,即使这个socket没有读写操作,这个线程也会被堵塞住,因此BIO叫做同步堵塞,但是这里的NIO一个线程可以服务多个socket,NioEventGroup有一个selector组件,当socket有读写的话,那么事件循环机制则会读取到该信息,并且执行第pipline操作。如果没有读写的话,线程就去服务有读写的socket了,所以NIO被称为同步非堵塞。

注意点

这里的同步非堵塞,并不是说如果在处理读写事件的时候发生了IO操作,比如请求网络接口,这个线程就会执行其他的,其实不然,这个线程则会进行睡眠被挂起,等待该网络返回数据,这个过程叫成同步,而不是堵塞。因此如果要开发高并发服务器,需要注意在pipline处理的时候不能有过度的io操作,不然会导致线程被挂起,这样就会导致work工作组没有多余的线程进行执行业务操作。

问题

1. netty多个客户端是不是会创建多个tcp

是的,当多个客户端连接到Netty服务器时,Netty会为每个客户端创建一个独立的TCP连接。每个TCP连接都有自己的Socket和对应的IP地址、端口号等网络参数,用于在客户端和服务端之间传输数据。

在Netty中,每个TCP连接对应一个Channel对象,它封装了底层的Socket连接和事件驱动的I/O处理逻辑。当一个新的客户端连接到达时,Netty会创建一个新的Channel对象,并将其加入到EventLoopGroup中的某个EventLoop线程池中进行管理。在后续的I/O操作中,Netty会通过选择器(Selector)来监听并处理各个Channel上的就绪事件,从而实现高效的多路复用和事件驱动模型。

因此,Netty可以同时管理多个客户端连接,每个连接都运行在自己的独立线程中,互不干扰。这种基于事件驱动的非阻塞I/O模型可以极大地提高网络应用程序的性能和可扩展性,适用于高并发、高吞吐量的网络应用场景

2. 那一个机器能够连接多少个socket

一个机器能够连接的socket数量取决于多个因素,包括操作系统、硬件性能、网络带宽、应用程序逻辑等。

在Linux平台下,每个进程都有一个最大文件描述符数(file descriptor)限制(通常为1024),其中一部分被系统占用,剩余的可以用于打开文件、网络IO等操作。当一个进程需要同时管理大量的socket连接时,可能会超过该限制,从而导致连接失败或异常。

为了解决这个问题,Linux内核提供了一种称为epoll的高效事件驱动IO机制,它可以同时管理大量的文件描述符,并且支持水平触发和边缘触发两种事件处理方式。通过使用epoll机制,可以极大地提高网络应用程序的并发性能和可扩展性,支持数十万到数百万级别的并发连接。

另外,硬件性能、网络带宽等因素也会影响一个机器能够连接的socket数量。如果机器的CPU、内存等硬件资源不足,或者网络带宽受限,那么可能会导致连接数量受限或者性能下降。因此,在设计和实现高并发网络应用时,需要综合考虑各种因素,并进行适当的优化和调试。

3. Nio的优点

Nio每一个客户端都是会进行TCP创建,然后服务器维护对应的SOCKET ,BIO是一个TCP创建一个线程,但是NIO,比如netty是基于事件驱动,因此可以存在使用线程池来进行管理多个TCP连接,并且只有当事件就绪了才会执行,因此被称为同步非堵塞。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值