首先先回顾传统的Http
1.创建一个ServerSocket,监听并绑定一个端口
2. 一系列客户端来请求这个端口
3. 服务器使用Accept,获得一个来自客户端的Socket连接对象
4. 启动一个新线程处理连接
4-1. 读Socket,得到字节流
4-2 解码协议,得到Http请求对象
4-3 处理Http请求,得到一个结果,封装成一个HttpResponse对象
4-4 编码协议,将结果序列化字节流 写Socket,将字节流发给客户端
5. 继续循环步骤3
当然这里因为用的是http协议所以称之为http服务器,改成别的协议就是别的服务器了。
为什么说这个呢?
因为使用Netty你就可以定制编解码协议,实现自己的特定协议的服务器,比如Dubbo就是基于Netty的,而Dubbo有自己的传输协议还可以用别的一些传输协议。
现在有另一个叫https协议,是基于http协议二次开发的,关于他俩的区别可以参考http和https有什么区别?
NIO
这讲到NIO是因为netty就是一个标准的NIO,说道NIO就肯定要知道BIO、NIO、AIO这三者的区别和联系,这个需要你自己去搜索,这不多啰嗦
我是写java的,你说多线程,就有NIO等,一开始我也认为是java独有的,但是事实不是,其实想想也知道,多线程是很多编程语言都有的名词,那NIO它们肯定也有
NIO俗称IO多路复用,它是由操作系统提供的系统调用,早期这个操作系统调用的名字是select,是慢慢的更新换代,补丁什么的就演化成了Linux下的epoll,
而Netty就是基于Java NIO技术封装的一套框架,所以你可以认为Netty是java所独有的,但是NIO不是,
对于为什么封装如果你学过javaweb和框架你就会明白这里面的区别是多么的便捷,还有一个重要原因是因为有空轮询的Bug,最后一个不怎么了解,你可以百度一下
Reactor模型
这为什么说这个模型呢?
因为这个模仿了NIO也就是IO多路复用
别人画的模型很好,虽然有的地方还是不准确,我就不画了,直接copy了
(1)Reactor单线程模型
看这张图和介绍大家可能看懂了,但是一开始我没看懂,仔细琢磨才看懂。这个真像上面传统的Http
原理: 可以先不看绿色的acceptor, client是客户端,Reactor 负责给客户端的请求发送到read ,而read后面是串行的逻辑程序,执行完再通过send 发送给Reactor,再通过Reactor返回给客户端,read到send 那一段可以想象成后端程序,就露了两个接口,接收数据和发送数据。而acceptor你可以理解为不是通过client 连接Reactor的,比如淘宝不光可以用客户端访问,也可以通过网页访问
(2) Reactor多线程模型
Thread Pool和workerthreads就是我们经常干后端所用的线程池,各种线程池都有,可以是人家的C3P0,也可以自己创建一个线程池,关于线程池就不多讲了。
(3) Reactor主从模式
这个图中acceptor 的功能可以和图一相同。
主从模式和平常的主从模式还是有区别的,很像zookeeper的主从模式,主节点负责接收信息,处理信息交给从节点。
上面的介绍可以,基本上不用再说明。
总结:
而Netty又是NIO的基础上,所以上面这三种Netty都可以配置。
当然 acceptor 也可以用单独的线程池,这样更加灵活。
对于线程池也可以合并,这个合并就看你自己怎么满足自己的高性能的并发模型了