Netty能干什么?#
Http服务器#
使用Netty可以编写一个 Http服务器, 就像tomcat那样,能接受用户发送的http请求, , 只不过没有实现Servelt规范, 但是它也能解析携带的参数, 对请求的路径进行路由导航, 从而实现将不同的请求导向不同的handler进行处理
对socket与RPC的支持#
Netty可是实现的第二件事就是Socket编程,也是它最为广泛的应用领域
进行微服务开发时不可丢弃的一个点, 服务和服务之间如果使用Http通信不是不行,但是http的底层使用的也是socket, 相对我们直接使用netty加持socket效果会更好 (比如阿里的Dubbo)
当然Netty能做的事还有很多比如自定义通信协议等等,,,
对WebSocket的支持#
Netty对WebSocket也提供了强大的支持, netty内置的处理器会为我们做好大量的机械性麻烦性的工作, 如WebSocketServerProtocolHandler
内置编解码处理, 心跳检验等, 可以让我们专注于实现自己的业务逻辑
Reactor线程模型#
Reactor线程模型, 顾名思义就像核反应堆一样, 是一种很劲爆的线程模型
最经典的两种图就像下面这样
上面两种图所描述的都是Reactor线程模型
Reactor线程模型五大角色#
- handle
handle本质上表示是一种资源 , 在不同的操作系统上他们的名称又不一样, 比如在windows上称它为文件句柄 , 而在linux中称它为文件描述符, 其实我这样说, handle的概念就显得比较抽象 不容易理解 , 具体一点说handle是啥呢 ? 比如客户端向服务端发送一个连接请求,这个socket请求对操作系统来说, 本质上就是handle
在Reactor线程模型中的Handle 就是限制netty并发量的主要原因, 下面的调优主要也是为了突破这个限制
- Synchronius Event Demultiplexer
意为同步事件分离器, 也是一看这个名字完全没有头绪它是什么, 其实, 在本质上它是一个操作系统层面的系统调用, 操作系统用它来阻塞的等待事件的发生, 具体一点它来说, 比如它可以是Linux系统上的IO多路复用, select(), 或者是 poll(),epoll() , 或者是Nio编程模型中的selector, 总之, 它的特点就是阻塞的等待事件的发生
- EventHandler
事件处理器, 事件处理器是拥有Handle的, 我们可以直观将EventHandler理解成是当系统
中发生了某个事件后, 针对这个事件进行处理的回调, 为啥说是回调, 结合netty的实现中, 我们在启动netty前, 会往他的pipeline中添加大量的handler ,这些handler的地位其实和 EventHandler的地位相当
- **concrete EventHandler **
顾明思议, 具体的事件处理器的实现, 换句话说, 这是我们根据自己的需求, 不同的业务逻辑自己去添加上去的处理器
- InitiationDispacher
初始分发器, 它其实就是整个编程模型的核心, 没错, 他就是Reactor, 具体怎么理解这个Reactor , 比如我们就能把他看成一个规范, 由它聚合, 支配其他的四大角色之间有条不紊的工作, 迸发出巨大的能量
Reactor线程模型五大角色的关系与工作流程#
首先: 我们需要将 EventHandler注册进 Reactor, 通过上图也能看到, EventHandler 拥有 操作系统底层的 Handle,
并且, Reactor 要求, 当EventHandler 注册进自己时, 务必将他关联的handle一并告诉自己, 由Reactor统一进行维护
我们将上面所说的handle , 联想成Nio编程模型中的将channel注册进Selector,也是必须绑定上的这个感性趣的事件, 牢记, Reactor是的这个模型的核心, 待会操作一旦系统发现handle有了某些变动,需要由Reactor去通知具体哪个EventHandler来处理这个资源. 这也是Reactor如何找到正确的EventHandler依赖的就是这个handle , 或者说它是感兴趣的事件
更近一步: 当所有的EventHandler都注册进了Reactor中后, Reactor就开始了它放纵的一生, 于是它开始调与 同步事件分离器通信 ,企图等待一些事件的发生, 什么事件呢? 比如说 socket的连接事件
当同步事件分离器发现了某个handle的状态发生了改变, 比如它的状态变成了ready, 就说明这个handle中发生了感兴趣的事件, 这时, 同步事件分离器会将这个handle的情况告诉Reactor , Reactor进一步用这个handle当成key, 获取出相对应的 EventHandler 开始方法的回调...