如何正确使用NIO来构架网络服务器一直是最近思考的一个问题,因而乎分析了一下Jetty、Tomcat和Mina有关NIO的源码,发现大伙都基于相似的方式,我感受这应该算是NIO构架网络服务器的经典模式,并基于这种模式写了个小小网络服务器,压力测试了一下,效果还不错。废话很少说,先看看三者是如何使用NIO的。后端
Jetty Connector的实现服务器
先看看有关类图:网络
其中:多线程
SelectChannelConnector负责组装各组件异步
SelectSet负责侦听客户端请求测试
SelectChannelEndPoint负责IO的读和写spa
HttpConnection负责逻辑处理.net
在整个服务端处理请求的过程能够分为三个阶段,时序图以下所示:线程
阶段一:监听并创建链接orm
这一过程主要是启动一个线程负责accept新链接,监听到后分配给相应的SelectSet,分配的策略就是轮询。
阶段二:监听客户端的请求
这一过程主要是启动多个线程(线程数通常为服务器CPU的个数),让SelectSet监听所管辖的channel队列,每一个SelectSet维护一个Selector,这个Selector监听队列里全部的channel,一旦有读事件,从线程池里拿线程去作处理请求
阶段三:处理请求
这一过程就是每次客户端请求的数据处理过程,值得注意的是为了避免让后端的业务处理阻碍Selector监听新的请求,就多线程来分隔开监听请求和处理请求两个阶段。
由此能够大体总结出Jetty有关NIO使用的模式,以下图所示:
最核心就是把三件不一样的事情隔离开,并用不一样规模的线程去处理,最大限度地利用NIO的异步和通知特性