`
阅读更多
Jetty 源码分析
一、 总括
     你了解Jetty 吗,就像我们所熟知的Tomcat一样, Jetty是一个免费的开放源码的100%纯Java的Http服务器和Servlet容器。 


     Jetty具备以下特点:

     快速高效 
     。Jetty是最快的Servlet服务器之一

     。Jetty可以处理上千个并发连接 
     小巧嵌入 
     。Jetty的jar只有600多K 
     。可动态嵌入到应用程序,适合开发web2.0等应用 
     应用广泛

     。开源项目有Geronimo, JBoss, JOnAS等

     。商业项目有IBM Tivoli, Sonic MQ and Cisco SESM等

     可到Jetty网站 http://jetty.mortbay.org/jetty/ 查看最新信息

     本文将通过对Jetty最新稳定版 Jetty5.1.5RC2 源码的研究,向读者展示Jetty在设计方面使用的不同设计理念, 希望对广大开发者在设计自己的系统时有所帮助。 
     Jetty按照功能可以分为四个主个主要的部分,HttpServer, HttpContext,HttpHandler,HttpListener,详见如下类图:


<图 1-1>



二、HttpServer及配置
     对于初次接触Jetty的人一定会对上图感到迷惑,其实在Jetty中 HttpServer是一个服务器的核心控制类, 我们可以看到,其它的组件类都是由该类扩展开来,HttpServer的作用就是在一系列的监听器类和处理器类之间搭起了一个桥梁,有效的控制着消息在系统内的传递,如下图: 

<图 1-2 > 
     HttpServer职责是接受从HttpListener传递过来的request(请求),HttpServer通过对request的Host(主机)或Path(路径)进行匹配,然后分发给相应的HttpContext(可以理解为一个web application)。
     这里举个例子,假设我们现在要建立一个提供静态页面web服务,页面内容在c:\root \下,可以通过如此配置HttpServer: 
     HttpServer server = new HttpServer(); // 创建一个新的HttpServer 
     SocketListener listener = new SocketListener(); // 创建一个新监听器 
     listener.setPort(8080);// 设置监听端口为8080 
     server.addListener(listener);// 将监听类注册到server中 
     HttpContext context = new HttpContext(); // 创建一个新HttpContext 
     context.setContextPath("/app/*"); // 设置访问路径 
     context.setResourceBase("c:/root/"); // 设置静态资源路径 
     context.addHandler(new ResourceHandler()); // 为这个HttpContext添加一个静态资源处理器 
     server.addContext(context); // 将这个HttpContext注册到server中 
     server.start();// 最后启动这个server 
     当我们要建立一个提供动态页面web服务时, 假设我们自己的 web 应用放在Jetty目录下的webapps下并打好包文件名为myapp.war, 可以通过如此配置HttpServer: 
     Server server = new Server(); // 创建一个新的HttpServer 
     SocketListener listener = new SocketListener();// 创建一个新监听器 
     listener.setPort(8080); // 设置监听端口为8080 
     server.addListener(listener ); // 将监听类注册到server中 
     server.addWebApplication("myapp","./webapps/myapp/"); // 将这个web应用注册到这个Server中 
     server.start(); // 最后启动这个server 
     短短数行代码就可创建一个web服务器并启动它,这有点类似于我们windows中的即插即用的概念,需要什么就添加什么,把这些类以HttpServer为核心组合在一起,就可以完成强大的功能。
 
三、Jetty Server
     1.上面我们探讨了HttpServer的启动,读者一定还存在这样疑问,整个Jetty 服务器是怎样启动的? 
     首先我们可以在图 1-1 看到左下角有一个Server类,这个类实际上继承了HttpServer,当启动Jetty服务器时,具体来说,在Jetty根目录下命令行下如输入 java -jar start.jar etc/demo.xml,注意这里有一个配置文件 demo.xml做为运行参数,这个参数也可以是其它的配置文件,也可是多个xml配置文件,其实这个配置文件好比我们使用struts时的struts -config.xml文件,将运行Server需要用到的组件写在里面,比如上一节中HttpServer的配置需要的组件类都可以写在这个配置文件中。 
     2.我们自己部署到Jetty的webapps目录下的web application,Jetty如何运行我们自己的web application? 
     首先当我们按上述方法启动Jetty Server时,就会调用Server类里面的main方法,这个入口方法首先会构造一个Server类实例(其实也就构造了一个 HttpServer),创建实例过程中就会构造XmlConfiguration类的对象来读取参数配置文件,之后再由这个配置文件产生的 XmlConfiguration对象来配置这个Server,配置过程其实是运用Java的反射机制调用Server的方法并传入配置文件中所写的参数来向这个Server添加HttpListener,HttpContext,HttpHandler,web application(对应我们自己部署的web应用)。 
     添加我们自己的web application过程中相应的就会读取我们所熟知的/WEB-INF/web.xml来创建一个WebApplicationContext(这个类继承了HttpContext)的实例,同时也会创建WebApplicationContext自身的ServletHandler(实现了 HttpHandler接口),注意到ServletHandler中包含一组ServletHolder指向实际的Servlet,譬如说我们在 web.xml文件中配置了两个Filter和一个Servlet,这里就会有三个ServletHolder,实际处理请求时 ServeletHandler就会依次调用这三个ServletHolder传入request,response处理(实际最后交给这两个 Filter和Servlet处理),这样我们自己做好的一个 web应用就挂载到这个Server上了,可以接受客户端相应的request(请求)。 
 
四、运行原理(请参考如下时序图)

<图 1-7 >

     上图展示了一个request的处理过程,首先HttpListener监听到客户端发来的请求创建一个HttpConnection实例(封装了连接细节,比如从Socket连接中获取的输入流和输出流), HttpConnection对象构建过程中会创建Jetty内部自定义的HttpRequest和HttpResponse对象,接着 HttpListener会调用这个HttpConnection实例的handle方法, HttpConnection实例就调用HttpRequest对象的read()方法读取信息,调用HttpServer的service方法以 HttpRequest,HttpResponse为参数传给HttpServer,HttpServer又将HttpRequest和 HttpResponse分发给相应的HttpCotext,HttpContext最后将HttpRequest和HttpResponse交给自身的 HttpHandler 处理,在这里HttpRequest,HttpResponse被再次封装为ServletHttpRequest和 ServletHttpResponse,其实这两个类实现了我们所熟知的HttpServletRequest和 HttpServletResponse接口。

 
五、高级性能
     1.HttpHandler:

     该接口的实现类用于处理HttpContext分发过来的reqeust,不同的实现类的有不同的处理功能,这里介绍几常用的HttpHandler实现类: 
     ReourceHandler:用于处理静态内容,如以扩展名为.html的文件 
     SecurityHandler:提供基本的安全验证

     ForwardHandler:转发一个request到另一个url

     ServletHandler:用于将request交由具体的Servlet类进行处理 
     2.当你在看图 1-2 时候会注意到HttpServer和HttpListener,HttpServer与HttpContext,HttpContext与 HttpHandler存在一对多的关系,下面就介绍一下它们之间的这种关系如何通过程序来配置. 
     HttpListener & HttpServer:

     HttpListener是所有监听器类的接口,如图中的SocketListener (基于传统的Socket技术)就实现了该接口,Jetty还有其它的实现该接口类,如SocketChannelListener(基于NIO技术)类等,HttpListener职责主要是在服务器启动后监听相应端口的来自客户端请求并建立连接(图 1-1 中所示用HttpConnection封装连接细节),监听器可在同个IP上开启多个端口为同一个HttpServer 进行监听,所以HttpListener和HttpServer是多对一的关系,如下图:


<图 1-3 >

     配置代码:
     HttpServer server = new HttpServer(); 
     HttpListenrer listener1 = new SocketChanneListener(); 
     Listener1.setPort(8080); 
     HttpListenrer listener1 = new SocketListener(); 
     Listener1.setPort(8443); 
     server.addListener(listener1); 
     server.addListener(listener2); 
 
     HttpContext & HttpHandler:

     HttpContext相当于对应客户端请求的URL或某个虚拟机, 其子类中包含若干个HttpHandler, 当接受到request(请求)时,HttpContext会依次(按某个预定的次序)把request交给这些HttpHandler处理,直到这个 request被标示处理过为止, 需要注意的是这个request可能被多个HttpHandler处理,但只能有一个HttpHandler能标示这个request已被处理过.

     一个典型的HttpContext有用于安全处理、静态资源处理及Servlet类的 HttpHandler,如下图: 

<图 1-4> 
     配置代码:
     HttpContext context = new HttpContext(); 
     context.setContextPath(“/myapp/*”); 
     HttpHandler securitHandler = new SecurityHandler(); 
     HttpHandler resourceHandler = new ResourceHandler(); 
     HttpHandler servletHandler = new ServletHandler(); 
     context.addHandler(securitHandler); 
     context.addHandler(resourceHandler); 
     context.addHandler(servletHandler); 
 
     HttpServer & HttpContext: 
     一般的HTTP服务器软件可以同时处理多个web application,同样一个HttpServer可以包含多个HttpContext,如下图可以通过同一个端口的监听类来映射多个 HttpContext: 

<图 1-5 >

     配置代码:
     HttpServer server = new HttpServer(); 
     HttpContext context1 = new HttpContext(); 
     context1.setContextPath(“/app1/*”); 
     HttpContext context2 = new HttpContext(); 
     context2.setContextPath(“/app2/*”); 
     server.addContext(context1); 
  
     HttpServer & HttpLister & HttpContext: 
     另外Jetty对多网卡(多个IP地址,不同的主机名)的服务器也提供了很好的支持,每个 HttpContext都有自身的HttpServer:


<图 1-6 >

     配置代码:
     HttpServer server1 = new HttpServer(); 
     SocketListener listener1 = new SocketListener(); 
     listener1.setHost(“www.app1.com”);//orListener1.setHost(“www.app2.com”)

     listener2.setPort(80);

     HttpContext context1 = new HttpContext();

     context1.setContextPath(“/”);

     server1.addListener(listener1); 
     server1.addContext(context1);

  
     3.Jetty对高并发的支持 

<图 1-8> 
     如果多用户请求服务就会涉及到多线程的管理,如图 1-8,Jetty中主要由ThreadPool负责管理多线程,注意其中Pool.PondLife是Pool的一个内部接口, ThreadPool.PoolThread是ThreadPool的一个内部线程类,我们看到Pool.PondLife和Pool存在一个聚集的关系,实际上Pool对象中存放在是一个个ThreadPool.PoolThread线程对象,当有新用户连接上Server时,ThreadPool就从Pool中取一个空闲的线程为当前用户连接服务。 
 
六、小结
     本文通过图示简要介绍了Jetty整个体系架构和主要的组件类及服务器的启动执行过程,其实Jetty 通常被用来做为内嵌的Web Server来使用,一些常见的服务器软件,如Apache Cocoon、JBoss ,JOnAs等都会采用Jetty作为Web解決方案;另外由于Jetty在性能及稳定性要优于同类HTTP Server的原因,Jetty已在国外已很流行,鉴于这一点,本文作者可以预测在不久的将来Jetty同样也会在国内流行开来。

 
附:
来源:http://blog.leiling.com/CALM/archive/2005/12/23/106662.aspx 
分享到:
评论

相关推荐

    Jetty权威指南.pdf

    通过这些基本操作的学习,用户可以迅速掌握Jetty的基础使用方法。 #### 三、Jetty架构 **3.1 架构概述** Jetty采用了模块化的架构设计,主要包括以下几个核心组件: - **Connector**:负责监听网络连接并接收...

    HelloWorld之jetty运行

    这个例子展示了Jetty的易用性,也为我们提供了深入学习Jetty及其相关技术的起点,如Servlet、JSP和Web容器的管理。对于初学者来说,这是一个很好的实践项目,可以帮助理解Web应用的生命周期和工作原理。

    equinox-jetty-birt:BIRT 报告简单的运行时示例

    这个示例对于学习BIRT与OSGi集成、Jetty服务器的使用,以及如何在Java环境中构建Web报表应用非常有帮助。通过深入研究这个项目,开发者可以了解到如何自定义BIRT查看器、处理数据源以及优化报表性能等高级话题。

    cxf-jetty:说明:使用cxf内置的jetty发布ws(基于soap协议)服务使用spring + cxf发布ws服务案例请下载

    4. **配置Spring**:编写Spring配置文件,定义CXF的bean,包括服务接口、服务实现和端点地址。Spring会根据配置自动装配服务。 5. **配置Jetty**:在CXF的配置中,启用内置的Jetty服务器,并指定服务监听的端口。 ...

    SVN 源码 地址

    ### SVN源码地址知识点概述 #### 一、Apache的SVN库 ...这些SVN地址为开发者提供了一个宝贵的资源库,可以帮助他们更好地了解和学习各种开源技术的核心实现原理,从而促进技术的发展和个人能力的成长。

    给学习J2EE的朋友一些值得研究的开源项目(转)

    - **建议**:对于刚开始接触Servlet容器的学习者来说,Jetty是一个很好的起点。 - **下载地址**:[http://jetty.mortbay.com/](http://jetty.mortbay.com/) 3. **Jigsaw** - **简介**:W3C开发的一款基于Java的...

    appfuse2学习日记

    - Jetty 下载地址:http://dist.codehaus.org/jetty/jetty-6.1.6/jetty-6.1.6.zip - 在 Tomcat 上运行项目的方法: - 方法一:参考链接:http://appfuse.org/display/APF/Tomcat - 方法二:直接将项目构建后的 `...

    solr的学习

    Solr 可以独立运行在 Jetty、Tomcat 等 Servlet 容器中。 - **特点**: - 提供了比 Lucene 更为丰富的查询语言。 - 实现了高度的可配置性和可扩展性,并对索引、搜索性能进行了优化。 - 支持多种索引创建方式和...

    spring-mvc-test:spring-mvc 入门样例工程,可以导入jetty中运行

    通过这个项目,我们可以学习到如何配置和运行Spring MVC项目,以及如何利用Jetty作为开发和测试环境。此外,还可以深入了解Spring MVC的各个核心组件,如DispatcherServlet、HandlerMapping、Controller等,进一步...

    AXIS学习

    - 部署服务:将生成的服务部署到支持JAX-RPC(Java API for XML-RPC)的Web服务器上,例如Tomcat或Jetty。 - 调用服务:客户端可以通过发送SOAP消息到服务的URL来调用服务。 3. 压缩包中的文件: - ...

    solr学习文档简介1

    Solr 学习文档简介 Solr 是 Apache 下的一个顶级开源项目,采用 Java 开发,是基于 Lucene 的全文搜索服务。Solr 可以独立运行在 Jetty、Tomcat 等这些 Servlet 容器中。Solr 提供了一个管理界面,通过管理界面可以...

    pinpoint 中文使用文档,供大家学习

    文档中还提到了Pinpoint的一些资料来源,包括它的源代码托管在Github,官方WIKI地址、用户组提问和讨论的Google Group、介绍文档以及2016年路线图。除了这些,还提到了关于Pinpoint的一些介绍和使用资料视频,如...

    微信点餐系统下载地址

    学习资源方面,"学习视频下载地址.txt"提供了获取相关教程的途径,这对于初学者来说非常有价值,可以通过视频学习如何部署和操作这个微信点餐系统。"weixin-sell-sell-master.zip"则包含了源代码,开发者可以直接...

    java循环解析sokcet内容并格式化输出HTTP实例(httpParser)(内含源码及所需jar)

    Socket类允许我们创建一个连接到特定IP地址和端口的套接字,然后通过输入输出流进行通信。在这个HTTP解析的例子中,我们将通过Socket接收服务器的HTTP响应,并对其进行解析。 `jetty`是一个流行的Java Web服务器和...

    javaservlet的学习及提高

    - **教程阅读器下载**:链接指向一个教程阅读器的下载地址,帮助用户更好地阅读和学习资料。 - **爱书吧**:可能是提供电子书和教程资源的网站,有助于进一步学习Java Servlet。 通过深入学习Java Servlet,不仅...

    学习资料java配置

    根据提供的文件信息,我们可以推断出此文档可能与Java配置相关。然而,描述部分似乎并未提供...通过上述分析,我们不仅了解了Java配置的基础知识,还学习了一些实际应用场景中的配置技巧。希望这些内容对你有所帮助。

    轻量级JavaWeb框架Fast-FrameWork.zip

    源码地址:我的GitHub地址 作者: 李强强 也叫 泥瓦匠 快速入门 1. 必备环境 Git 环境搭建 Maven 环境搭建 2. 下载 fast-framework 项目及 sample 案例 git clone...

Global site tag (gtag.js) - Google Analytics