皮皮网
皮皮网

【均线源码】【云呼死你源码】【lineage源码镜像】netty nio 源码

来源:云oa系统源码 发表时间:2024-12-22 16:15:41

1.Java的源码并行世界-Netty中线程模型源码讲解-续集Handler、Channel
2.Netty原理-从NIO开始
3.Netty源码-Reactor线程模型之NioEventLoopGroup研究
4.netty源码解析(三十五)---Netty启动3 成功bind 等待连接

netty nio 源码

Java的源码并行世界-Netty中线程模型源码讲解-续集Handler、Channel

       Netty 的源码核心组件 ChannelHandler 在网络应用中扮演着关键角色,它处理各种事件和数据,源码实现业务逻辑。源码ChannelHandler 子类众多,源码均线源码根据功能可分为特殊Handler(如Context对象)、源码出入站Handler,源码以及用于协议解析和编码的源码Decoder和Encoder。例如,源码ChannelInboundHandlerAdapter 和 ChannelOutboundHandlerAdapter 分别用于处理入站和出站事件,源码ByteToMessageDecoder 和 MessageToByteEncoder 则负责数据的源码解码和编码。

       特殊Handler如ChannelHandlerContext 提供了处理器与Channel交互的源码云呼死你源码上下文,而ChannelDuplexHandler 则用于双向通信,源码如聊天服务器。源码SimpleChannelInboundHandler 是简化版的入站处理器,自动管理消息引用,避免内存泄漏。而出站处理器如SimpleChannelOutboundHandler 则在消息处理后自动释放引用,简化编码流程。

       Channel 是数据传输的抽象,NioServerSocketChannel 和 EpollServerSocketChannel 分别对应基于NIO和Epoll的服务器端套接字。ChannelInitializer 是初始化新Channel的关键,它配置处理器形成处理链,用于处理连接操作和事件,lineage源码镜像从而实现自定义业务逻辑。

       通过理解这些概念和类的作用,可以构建和配置Netty应用,以满足不同的网络通信需求。想要深入学习,可以研究Netty 4.1源码中如EventLoopGroup、ChannelPipeline、CustomChannelInitializer等核心类。后续会分享详细的中文注释版本,持续关注以获取更多资源和知识。

Netty原理-从NIO开始

       Netty是基于NIO的异步通信框架(曾经引入过AIO,后来放弃),故要说Netty原理我们要先从NIO开始。

        NIO 是JAVA在JDK4中引入的同步非阻塞通信模型,在NIO出现之前(JDK4之前)市场上只有一个BIO模型顾名思义BLOCKING IO (同步阻塞通信模型)

        BIO(BLOCKING I/O):

        BIO 为一个连接 一个线程的模式,当有连接时服务器会开启一个线程来处理请求

        若此请求啥都不想干此时线程会怎么样?

        此线程会进入阻塞模式(BLOCKING)!---啥也不干,干等着zzZZ~

        这种一连接,一线程的模式会造成服务器资源不必要的开销并且在大量连接访问时 服务器会发生什么?车道(线程)不足,车太多--我堵车了

        由此就出现了NIO

        ↓

        NIO(new/NONBLOCKING I/O):

        NIO为同步非阻塞通信模型,Select(多路复用器)为此模型的核心,实现了多个连接一个线程

        当有客户端连接请求时 此连接请求会被注册至select上,当select检测到此连接有I/O请求时才会打开一个线程去对此I/O请求进行处理-----单线程模型

        这个时候有人问了:这么多操作都在一个线程里,线程忙不过来怎么办?

        此时 由于网络请求、I/O读写、业务操作都在一个线程下,会导致在高并发的情况下存在性能瓶颈 于是乎有人就提出来 将业务操作丢到另一个线程怎么样?

        于是出现了第三种reactor模型-使用线程池进行操作网络请求、IO在一个线程,业务操作在另个一个线程 的业务分离----线程池模型

        从此图中可以看出此时 模型中使用一个线程池来进行网络请求、IO读取

        当读取完成后将业务操作绑定在线程池中另外的线程上-------网络IO与业务操作可以同步进行了!一切都完美了起来!

        但是!事情还没完!!这个时候又有人提出问题:在高并发的时候咋办?会不会有性能瓶颈

        因为网络IO是非常消耗CPU的,当网络请求与网络IO在同个线程中时,造CK的情况下单个线程并不足以支撑起所有的IO操作!因此也形成了在高并发状态下的性能瓶颈

        于是大佬们就想着,如果把IO拆出来让单个线程池去接收网络请求,用另一个线程池来进行IO与业务操作会不会更好

        于是第四种Reactor模型应运而生--主从Reactor多线程模型

        此模型中 mainReactor只用于接收网络请求,而subReactor中为一个线程池,线程池中每个线程上绑定一个select

        当mainReactor接收到请求时(一个描述符) 系统会生成一个新的描述符代表此连接生效,此时mainReactor会将新的描述符通过一个算法在线程池中选定一个线程 将此描述符绑定至此线程池上的select上,由此线程来对请求进行I/O 与业务操作

        从此百万连接高并发不是问题

        写到这 我们是不是想起了Netty的启动过程

        1、声明两个EventLoopGroup一个为boss(mainReactor)一个为worker(subReactor)

        EventLoopGroup(线程池)初始化的时候会生成(懒加载)指定数量的EventLoop(线程)若无指定 则会生成CPU数X2的线程

        2、声明一个启动辅助类Bootstrap并将EventLoopGroup注册到启动辅助类BootStrap上(bootStrap.group)

        接着再给bootstrap指定channel模型等属性,再添加上业务流水线(channelpipeline)并且在pipeline中添加上业务操作handler,(通过channelpipeline可以对传入数据为所欲为)

        3、绑定端口

        Netty启动完成

        这时候可能有人会问了:这和你上面说的reactor?NIO有啥关系?

        这个时候我们要这么看

        ↓

        若我们将boss与worker线程池设置为相同的一个线程池,那么会发生什么事?

        此时关注一下第三个Reactor模型时就会发现 当BOSS=WORKER时候 netty实现的就是第三种Reactor模型 使用线程池模型

        而当boss不等于worker的时候使用的就是第四种 主从多线程模型

        Netty就是基于Reactor模型来对NIO进行了易用化封装,从Netty源码中就可以看出来其实底层还都是NIO的接口

        此次处为自己读源码之后的理解 如有误请指正

        感恩

        反手拿下第一个赞

Netty源码-Reactor线程模型之NioEventLoopGroup研究

       在Netty网络编程中,NioEventLoopGroup作为线程池的diy相册源码核心组件,其作用至关重要。从初始化的逻辑分析来看,NioEventLoopGroup扮演多重角色,不仅提供了线程池相关功能,同时也继承了线程模型的ScheduledExecutorService,ExecutorService和Executor接口,体现其多功能性。

       其层次结构显示,NioEventLoopGroup从底层向上层层封装,实现了线程池模型的关键功能。进一步深入分析,NioEventLoopGroup通过继承自MultithreadEventLoopGroup,服装社区源码并在构造函数中执行关键初始化操作,展现了其独特的设计。首先,NioEventLoopGroup在初始化时创建线程工厂,构建线程执行器Executor,如果未提供自定义Executor,将使用DefaultThreadFactory创建FastThreadLocalThread线程执行任务。其次,根据指定数量nThreads创建子线程组,若nThreads未定义或设为0,则默认设置为2倍的CPU线程数。最后,在初始化子线程组时,NioEventLoopGroup通过newChild()方法执行初始化,这一步操作具体实现由NioEventLoop类完成,其初始化参数包括线程选择器chooser,以及其他多个关键参数,确保线程高效运行。

       NioEventLoopGroup与Java线程池之间的区别主要体现在其面向特定应用场景的设计上,尤其在事件驱动和非阻塞IO模型的支持方面。Netty通过NioEventLoopGroup实现了更灵活、高效的并发处理机制,使得在处理高并发、高网络流量场景时,性能得到显著提升。

       在研究NioEventLoopGroup的过程中,我们深入学习到了设计模式的应用,如单例模式确保了线程选择器的唯一性,工厂模式则负责创建不同类型的线程组。此外,模板设计模式的使用,使得NioEventLoopGroup能够提供高度抽象的初始化逻辑,同时保持了代码的复用性和可扩展性。通过这种设计,Netty不仅优化了资源管理,还提升了系统的整体性能和稳定性。

netty源码解析(三十五)---Netty启动3 成功bind 等待连接

       Netty启动过程中的bind操作在AbstractBootstrap类中启动,由于异步特性,ChannelFuture在register0方法后交给事件执行器处理,此时isDone返回为false。在sync同步等待时,主线程会阻塞在PendingRegistrationPromise上,等待绑定完成。

       PendingRegistrationPromise的创建和ChannelFuture的监听器是为了在绑定成功后执行后续操作。当bind0方法中的safeSetSuccess成功后,会触发监听器,进一步调用AbstractChannel的bind方法。这个过程会通过DefaultChannelPipeline的tail处理,最后在AbstractChannelHandlerContext的HeadContext中,调用handler的bind方法,其中HeadContext的unsafe.bind方法会调用到NioServerSocketChannel的unsafe的dobind方法。

       在NioServerSocketChannel中,真正的绑定操作是调用原生的jdk的bind方法。当绑定成功后,AbstractChannel的dobind方法会设置promise为success,从而唤醒主线程,继续执行后续代码。至此,Netty的bind操作等待连接的到来。

       总结整个流程:Bootstrap创建Promise等待,然后通过管道传递到AbstractChannel,通过HeadContext调用unsafe.bind,最终在NioServerSocketChannel中调用原生bind,主线程等待并处理bind结果。当连接到来时,整个绑定过程结束。

相关栏目:探索