传统IO模型:
传统IO模型就是阻塞IO,即处理业务逻辑的线程去进行IO,当然IO操作很耗时,然后线程就得阻塞,当然CPU会回收该线程的时间片,把该线程挂起,切换到其他线程去执行,在并发量大的场景中,会造成大量的线程切换,而每一次线程切换都会消耗一定的资源,造成性能低下。
Netty是什么:
Netty是一个基于Java NIO(非阻塞IO)的异步事件驱动的网络应用框架,它提供了高性能、可扩展和易于使用的网络编程接口。
Netty做了件什么事情呢,就是把业务逻辑线程从IO操作中解放出来了,它内部搞了线程池,这个线程池里面的线程专门负责去做IO,但是对外表现出来,业务逻辑线程只要过来就立刻可以拿到它想要的内容而不需要去做IO操作了。
Netty的网络模型基于Reactor模式。首先来看看什么是Reactor模式。
Reactor模式:
Reactor模式是一种基于事件驱动的设计模式,用于处理并发I/O操作。它的核心思想是将I/O操作和事件处理解耦,使得程序能够高效地处理多个并发的I/O请求。
Reactor模式由以下几个关键组件组成:
-
Reactor:Reactor是事件分发器,负责接收并分发事件,一般只用一个线程足矣。它会监听各种事件,如连接请求、数据到达等,并将事件分发给对应事件处理器进行处理。
-
Handlers:Handlers是事件处理器,负责实际处理事件,也就是实际去执行IO操作的线程,一般会弄一个线程池。当Reactor将事件分发给Handlers时,Handlers会执行相应的操作,如读取数据、写入数据等。
-
Event:Event是发生的事件,如连接建立、数据到达等。它会被封装成事件对象,传递给Reactor进行分发。
-
Event Loop:Event Loop是一个事件循环器,一般也是一个线程足矣。在Event Loop中,这个事件循环线程会不断地监听事件,并将事件分发给对应的事件处理器进行处理。
Reactor模式的工作流程如下:
-
Reactor监听Event,并等待Event的到达。
-
当Event到达时,Reactor将Event封装成事件对象。
-
Reactor将事件对象分发给对应的Handlers。
-
Handlers执行相应的IO操作,如读取数据、写入数据等。
-
处理完事件后,Handlers将控制权交还给Reactor。
Reactor模式的出现就是为了解决线程处理I/O时的阻塞和频繁线程切换所带来的性能问题。通过避免线程的阻塞和频繁的线程切换,Reactor模式能够有效地提高程序的性能。相比于传统的线程模型,它可以处理更多的并发连接,提高了系统的吞吐量和响应性能。
总结起来,Reactor模式是一种基于事件驱动的设计模式,通过解耦I/O操作和事件处理,使程序能够高效地处理多个并发的I/O请求。它由Reactor、Handlers、Event和Event Loop等组件构成,通过事件分发和处理来实现并发处理。
Netty网络通信模型:
下面是Netty的网络通讯模型概述:
-
Boss线程池:Boss线程池负责接受客户端的连接请求,并将连接注册到Worker线程池中的某个线程上进行处理。通常情况下,Boss线程池只有一个线程。Boss线程大致对应了Reactor模式中的Reactor。
-
Worker线程池:Worker线程池负责处理实际的网络I/O操作,包括读取、写入和处理请求等。Worker线程池中可以有多个线程,每个线程都会被分配一个或多个连接进行处理。Worker线程池对应了Reactor模式中的Handlers。
-
Channel、EventLoop和ChannelPipeline:Netty中的核心概念是Channel、EventLoop和ChannelPipeline。一个Channel代表一个实际的网络连接,EventLoop是一个处理事件的循环,而ChannelPipeline则是一个处理事件的管道。EventLoop对应了Reactor模式中的EventLoop。
-
事件驱动模型:Netty的网络模型是基于事件驱动的,当有事件发生时(如连接建立、数据到达等),Netty会将事件封装成事件对象并派发给对应的事件处理器进行处理。事件处理器可以是用户自定义的处理器,也可以是Netty提供的预定义处理器。
-
异步和非阻塞:Netty采用异步和非阻塞的方式进行网络操作,这意味着它可以同时处理多个连接,并且不会因为某个连接的慢速操作而阻塞其他连接的处理。
总的来说,Netty的网络模型基于Reactor模式,通过Boss线程池接受连接请求并将连接注册到Worker线程池中的某个线程上进行IO处理。Netty采用异步和非阻塞的方式进行网络操作,通过事件驱动模型和ChannelPipeline来处理网络事件。这种模型使得Netty在高性能、可扩展和易于使用方面具有优势,并广泛应用于构建高性能的网络应用程序。