Netty是提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架。
例如:dubbo的底层通信是利用netty来实现的。
Reactor是一种线程模式,Reactor是什么?
The reactor design_pattern is an event_handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.
from wiki
通过wiki中的定义我们可以发现Reactor的重点
- 事件驱动
- 可以处理一个或多个输入源
- 通过多路复用将请求的事件分发给对应的处理器处理
根据大神Doug Lea 在 《Scalable IO in Java 》中的介绍,Reacotr模型主要分为三个角色
- Reactor:把IO事件分配给对应的handler处理
- Acceptor:处理客户端连接事件
- Handler:处理非阻塞的任务
例如Redis中就是使用到了IO多路复用的机制,由于其内部是单线程处理的,所以对应的是单线程的Reactor模式。因为Redis中的命令通常很简短,所以不容易产生阻塞的情况,并且由于单线程减少了线程间上下文切换的消耗,大大提高了效率。
Netty中是实现是建立在JDK中NIO的实现之上的。对于传统JDK nio优化了ByteBuffer,内部实现了ByteBuf。
NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。
NIO和传统IO(一下简称IO)之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。
总结
O多路复用使用了NIO模型
Reactor模式使用了IO多路复用的机制
Redis使用了Reactor模式
Netty优化了Java的NIO并且使用了类似Reactor的模式