转载地址:http://blog.csdn.net/cutesource/article/details/6192016
如何正确使用NIO来构架网络服务器一直是最近思考的一个问题,于是乎分析了一下Jetty、Tomcat和Mina有关NIO的源码,发现大伙都基于类似的方式,我感觉这应该算是NIO构架网络服务器的经典模式,并基于这种模式写了个小小网络服务器,压力测试了一下,效果还不错。废话不多说,先看看三者是如何使用NIO的。
Jetty Connector的实现
先看看有关类图:
其中:
SelectChannelConnector负责组装各组件
SelectSet负责侦听客户端请求
SelectChannelEndPoint负责IO的读和写
HttpConnection负责逻辑处理
在整个服务端处理请求的过程可以分为三个阶段,时序图如下所示:
这一过程主要是启动一个线程负责accept新连接,监听到后分配给相应的SelectSet,分配的策略就是轮询。
阶段二:监听客户端的请求
这一过程主要是启动多个线程(线程数一般为服务器CPU的个数),让SelectSet监听所管辖的channel队列,每个SelectSet维护一个Selector,这个Selector监听队列里所有的channel,一旦有读事件,从线程池里拿线程去做处理请求
阶段三:处理请求
这一过程就是每次客户端请求的数据处理过程,值得注意的是为了不让后端的业务处理阻碍Selector监听新的请求,就多线程来分隔开监听请求和处理请求两个阶段。
由此可以大致总结出Jetty有关NIO使用的模式,如下图所示:
最核心就是把三件不同的事情隔离开,并用不同规模的线程去处理,最大限度地利用NIO的异步和通知特性
下面再来看看Tomcat是如何使用NIO来构架Connector这块的。
先看看Tomcat Connector这块的类图:
其中:
NioEndpoint负责组装各部件
Acceptor负责监听新连接,并把连接交给Poller
Poller负责监听所管辖的channel队列,并把请求交给SocketProcessor处理
SocketProcessor负责数据处理,并把请求传递给后端业务处理模块
在整个服务端处理请求的过程可以分为三个阶段,时序图如下所示:
阶段一:监听并建立连接
这一阶段主要是Acceptor监听新连接,并轮询取一个Poller ,把连接交付给Poller
阶段二: 监听客户端的请求
这一过程主要是让每个Poller监听所管辖的channel队列,select到新请求后交付给SocketProcessor处理
阶段三:处理请求
这一过程就是从多线程执行SocketProcessor,做数据和业务处理
最后我们再看看NIO方面最著名的框架Mina,抛开Mina有关session和处理链条等方面的设计,单单挑出前端网络层处理来看,也采用的是与Jetty和Tomcat类似的模式,只不过它做了些简化,它没有隔开请求侦听和请求处理两个阶段,因此,宏观上看它只分为两个阶段。
先看看它的类图:
其中:
SocketAcceptor起线程调用SocketAcceptor.Work负责新连接侦听,并交给SocketIoProcessor处理
SocketIoProcessor起线程调用SocketIoProcessor.Work负责侦听所管辖的channel队列, select到新请求后交给IoFilterChain处理
IoFilterChain组装了mina的处理链条
在整个服务端处理请求的过程可以分为两个阶段,时序图如下所示:
阶段一:监听并建立连接
阶段二: 监听并处理客户端的请求
总结来看Jetty、tomcat和Mina,我们也大概清楚了该如何基于NIO来构架网络服务器,通过这个提炼出来的模式,我写了个很简单的NIO Server,在保持连接的情况下,可以很轻松的保持6万连接(由于有65535连接限制),并能在负载只有3左右的情况下(4核),承担3到4万的TPS请求(当然做的事情很简单,仅仅是把buffer转化为自定义协议的包,然后再把包转为buffer写到客户端)。因此简单地实践一下可以证明这个模式的有效性,不妨再看看这个图,希望对大伙以后写server有用:
相关推荐
### Jetty和Tomcat的比较 #### 相同点 - **Servlet引擎**: Tomcat和Jetty都是基于Java的Servlet容器,支持标准的servlet规范和JavaEE的规范。这意味着开发者可以在这些容器中部署和运行Java Web应用。 #### 不同...
Tomcat、Jetty和Netty都是支持WebSocket的Java服务器平台,各有其优势和适用场景。理解这些技术可以帮助开发者选择最适合他们项目的解决方案,并且能够有效地利用WebSocket实现高效的实时通信功能。
【标题】"how tomcat works和jetty-src和tomcat7-src" ...综上所述,对Tomcat和Jetty源代码的探索,不仅能增进对Web服务器工作原理的认识,还能提升开发者在Java Web开发中的专业技能,从而更好地应对复杂的项目需求。
在这个场景中,我们关注的是两个非常流行的Java应用服务器:Tomcat和Jetty。这两者都是用于托管Java Servlet和JavaServer Pages (JSP) 应用程序的开源平台。 **Tomcat** Tomcat是由Apache软件基金会维护的开源项目...
在这个资源中,我们将详细介绍如何将 XACS 从 Jetty 平台移植到 Tomcat 平台的步骤和过程。这个指南将帮助读者快速掌握移植的步骤,并成功将 XACS 部署到 Tomcat 平台上。 一、准备环境 在开始移植之前,我们需要...
Jetty更适合需要低延迟、高度可定制和嵌入式场景的应用,而Tomcat则在标准支持、社区资源和大型企业应用中表现出色。在实际选择时,应根据项目需求、性能要求和团队熟悉度来决定。 在面试中,理解这两个容器的原理...
"Eclipse SVN Jetty Tomcat jad 等常用插件"这个标题提到了几个在Java开发中非常关键的工具和组件,让我们一一解析它们: 1. **SVN(Subversion)**: - SVN是版本控制系统,用于跟踪和管理项目源代码的变更。在...
Tomcat应用也算非常广泛的web 服务器,支持部分j2ee,免费,出自 apache基金组织 JBoss开源的应用服务器,比较受人喜爱,免费(文档要收费) weblogic应该说算是业界第一的app server,全部支持j2ee1.4, 对于...
本文将深入探讨如何在Spring Boot项目中从Tomcat切换到Jetty容器,以及这两个容器的特点和使用场景。 首先,Tomcat是Apache软件基金会的开源项目,是Java Servlet和JavaServer Pages(JSP)的标准实现。它以其轻量...
本压缩包包含了不同平台——windows以及linux最新的tomcat版本,(包含:tomcat-5.5.36、tomcat-6.0.37、tomcat-7.0.47)。 和jetty-distribution-9.0.6.v20130930。 供java web开发人员去下载
Jetty是一款开源、轻量级的Web服务器和Servlet容器,被广泛用于开发、测试和部署Java Web应用程序。相较于Apache Tomcat,Jetty以其简洁的架构、高性能和低内存占用而受到开发者青睐。在选择Jetty时,必须考虑到与...
与传统的Tomcat服务器相比,Jetty具有更小的内存占用和更快的启动速度。由于它的模块化设计,可以根据实际需求选择需要的功能,从而保持轻量级特性。 2. **安装与配置** - **下载**:根据提供的压缩包文件名"jetty...
在Java开发环境中,Jetty常常作为嵌入式服务器使用,便于快速构建和部署应用。 本资源包提供了Jetty服务器的安装包(jetty-distribution-9.4.14.v20181114.zip),这是Jetty的一个特定版本,9.4.14.v20181114。...
其中,JBoss、Tomcat和Jetty是最为广泛使用的Servlet容器,它们各自拥有独特的架构和工作原理,但同时也具备协同工作的能力。 **一、JBoss的基本架构与工作原理** JBoss是一个功能强大的企业级Java应用服务器,其...
Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,因其开源、小巧且易于集成的特点,被广泛应用于各种项目中。本实例大全将全面解析Jetty在不同场景下的使用,帮助你深入理解和掌握Jetty的特性。 1. **...