背景
-
在学习Netty之前,有必要学习Reactor论文中的知识。
-
Reactor反应器模式:
a)它处理一个或者多个客户端发来的请求。b) 想象成由多个方法组成的一个服务。
c) Selector接收所有的请求。Dispatcher中一开始就注册了handler,这个时候dispatcher进行事件分发给具体的handler进行处理,这些所有的handler都被添加到ChannelPipeline中。这个ChannelPipeline是Netty中的概念。并且每个Channel都有唯一与之对应的ChannelPipeline。
5大角色
-
Handle(句柄(windows)或者描述符(Linux)),本质上是表示一种资源,是由操作系统来提供的。该资源用于表示一个个的事件,比如说文件描述符,针对网络编程中的Socket描述符。事件既可以来自外部,也可以来自内部。外部事件比如说客户端的连接请求,客户端发送过来的数据等。内部事件比如说操作系统产生的定时器事件等。它本质上就是一个文件描述符。Handle是事件的产生的发源地。
-
Synchronous Event Demultiplexer(同步事件分离器)。它本身是一个系统调用,用于等待事件的发生(事件可能是一个,也可能是多个)。调用方在调用它的时候会被阻塞,一直阻塞到同步事件分离器上有事件产生为止。对于Linux说,同步事件分离器指的是常用的I/O多路复用机制,比如select,poll,epoll等。在Java NIO领域中,同步事件分离器对应的组件就是Selector,对应的阻塞方法就是select方法。(Java nio中的select也就是基于Linux中的epoll来实现的)。
-
Event Handler(事件处理器),本身由多个回调方法构成,这些回调方法构成了与应用相关的对于某个事件的反馈。(Java nio中没有实际的对应组件)(Netty中就有很多对应组件,ChannelInboundHandlerAdapter)。Netty相比于Java NIO来说,在事件处理器这个角色上进行了一个升级,它为我们开发者提供了大量的回调方法,供我们在特定事件产生时实现相应的回调方法进行实际的业务处理。
-
Concreate Event Handler(具体事件处理器),是事件处理器的实现。它本身实现了事件处理器所提供的各个回调方法,从而实现了特定业务的逻辑。它本质上就是我们所编写的一个个的处理器实现。Netty对应的组件就是MyServerHandler extends SimpleChannelInboudHander。
问题:在Netty中,channelRead0是谁调用的?在什么时候被调用?
答:workerGroup调用的,其实就是subReactor(Initiation Dispatcher), Initiation Dispatcher回调此方法,时间过长的话,需要另起业务线程去执行业务逻辑。 -
Initiation Dispatcher(初始分发器),实际上就是Reactor角色。它本身定义了一些规范,这些规范用于控制事件的调度方式(selectionKey),同时又提供了应用进行事件处理器的注册和删除等设施。它本身是整个事件处理器的核心所在,Initiation Dispatcher会通过同步事件分离器来等待事件的发生。一旦事件发生, Initiation Dispatcher 首先会分离出每一个事件(遍历set, selectionKey),然后调用事件处理器,最后调用相关的回调方法来处理这些事情。Netty是采用两个Reactor工作(bossGroup和workerGroup)。
小结
- 记录了Reactor论文中的核心图片。
- 对这个图片的角色进行理解。