`
jimichan
  • 浏览: 280352 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Jetty6 指南书 - 第一章 Jetty介绍

阅读更多

写在前面 :使用jetty已经很久了,它是一个很出色的web容器和工具,特在此和大家分享jetty6的知识。网络上有一些关于jetty的资料,但过去陈旧且不具有系统性,导致很多人误解jetty的功能,国外目前也没有关于jetty的书籍,所以那些搞翻译的人也没有翻译来源,故决定写一本关于jetty6的书,以推广jetty在国内的使用。记住jetty不仅仅是一个web容器!

 

 

由于这一些系列文章正在编写过程中,写好一章就发一章,难免有很多错误的地方,欢迎哥们指正!

 

第1章 Jetty介绍

 

    Jetty是一个100%由Java实现的、开源的HTTP服务器和javax.servlet容器,它不仅仅作为一个独立服务软件(如Tomcat)被使用,而且 优良的组件(Componet)设计、高内聚低耦合、高扩展性等特性使得Jetty非常易于作为嵌入式工具使用,在这一领域已经成功应用于多个产品当中。
    

    Web2.0时代的来临使得Web服务器不得不去处理更多的请求,而花费更多的时间去处理请求,服务器压力和稳定性必将 受到极大的挑战。Jetty率先为解决这类问题从服务器底层提供了一个名为 Continuations 机制,来实现异步Servlet功能, 帮助开发者轻松实现Ajax Push功能。另外Jetty提供IO多路复用的连接器实现,使得服务器可以花费较少的资源来并发服务多个请求,也提高Web应用程序在高负载情况下的稳定性和健壮性,所以Jetty完全胜任企业级应用。如上这些特性都是为在web2.0时代下Web应用程序量身打造,并且Jetty开发团队一直关注这一方向的进展。

 

    Jetty不只在作为独立服务器使用时表现优秀,在嵌入式使用或者作为独立工具使用领域也取得了非常优秀成绩。目前已被广泛应用在多个项目和产品中。由于Jetty构架优秀、实现优雅,所 它被广泛嵌入的到移动设备、工具、框架(frameworks)、应用程序服务器(Application Server)等等领域。使用jetty服务的各领域代表如下:

 

  • 大型集群系统,如Yahoo Hadoop Cluster(http://developer.yahoo.net/hadoop/)
  • 云计算服务,如Google AppEngine (http://code.google.com/appengine/)
  • SaaS系统,如Yahoo! Zimbra(http://www.zimbra.com/)
  • 应用程序服务器,如Apache Geronimo(http://geronimo.apache.org/)
  • 应用框架,如GWT(http://code.google.com/webtoolkit/)
  • 工具,如 Eclipse IDE(http://www.eclipse.org/) , 
  • 移动设备,i-jetty(http://code.google.com/p/i-jetty/)在手机设备运行web应用
  • 其他请访问http://docs.codehaus.org/display/JETTY/Jetty+Powered查看
 
    Jetty可是标准化的拥护者,它支持HTTP1.1,很好的实现了Servlet2.4/2.5、Jsp2.0/2.1规范和JEE部分规范。就是说服务JEE web容器标准的应该程序在Jetty下会被很好地执行。另外在Servlet 3.0规范的定制过程当中Jetty也起着积极的作用和贡献,将来在Servlet3.0的实现上也会成为佼佼者之一。

 

    Jetty的构架非常优秀,高组件化设计,Jetty给我们提供各种可用的零件和组装这些零件的工具,使得Jetty在服务器配置时积极灵活,而且在我们把Jetty作为工具使用时也非常便捷。打个比方,Jetty就是真实版本变形金刚,不仅性能强劲可以打败敌人 完成保卫地球的任务 ,而且你可以重新组装各个零部件把它变成一个部高级跑车,如果你还觉得它不够酷的话还可以自己打造部分零件定制自己特有的版本。呵呵,很酷吧,对 这些都将不是梦想,你的很多想法Jetty都可以为你实现。    

    
    如上所描写的强大功能,那么Jetty的开源协议是什么 ?会不会有商业限制这些都不必担心。 要知道Jetty是基于Apache Licence 2.0  和 Eclipse Public License 1.0 开源协议发布的,因此你可以在任意地方使用它,并可以免费 用于商业行为。
    
    目前稳定版是jetty6系列,本书的使用的版本是Jetty6.1.22。
 
 
1.1 Jetty功能介绍
    


HTTP服务

 

    HTTP协议 Web浏览器和Web服务之间沟通的语言,实现Http协议 是作为web服务器最基本的能力。
    实现HTTP协议,Jetty 才能接收 User Agent(浏览器或者其他支持HTTP协议的客户端)发起的Http请求,然后根据请求内容进行响应。
    顺便提示下,HTTP协议是应用层协议,TCP/IP是传输层协议。Jetty6实现的是HTTP/1.1 协议。
 
    
    
    为了给大家直观的认识,下面展示一个HTTP请求和响应的例子:
 
浏览器请求地址 http://www.mortbay.org/jetty/,然后发送请求的内容如下:
 
GET                         /jetty/ HTTP/1.1
Host:                     www.mortbay.org
User-Agent:             Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 GTB6 (.NET CLR 3.5.30729)
Accept:                 text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language:         zh,zh-cn;q=0.7,en-us;q=0.3
Accept-Encoding:         gzip,deflate
Accept-Charset:         GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive:             300
Connection:             keep-alive
 
    

jetty在接收到请求后,更加请求地址,读取目标文件内容,向客户端返回以下响应结果:


HTTP/1.0 200 OK
Accept-Ranges: bytes
Content-Type: text/html
Content-Length: 10169
Last-Modified: Thu, 30 Jul 2009 07:13:38 GMT
Server: Jetty(6.1-SNAPSHOT)
Age: 458
X-Cache: HIT from cache.incesoft.net
Via: 1.0 cache.incesoft.net:3128 (squid/2.6.STABLE20)
Connection: keep-alive
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional .dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <title>jetty - Jetty WebServer</title>
...省略...

    jetty工作就是启动服务器以后,监听服务器80端口,当浏览器请求时建立TCP连接,通过TCP连接来接收并解析http请求的内容,再根据HTTP协议将请求的资源数据发送给浏览器。
 
    具备http服务的功能之后,才能够进一步成为web容器,来提供动态的http内容。但如果你不需要动态内容服务,只是静态文件服务,那么你只需加载Http服务相关组件即可,这就是Jetty过人之处。
    
    提示:jetty3.0之后的版本都实现了HTTP1.1协议。HTTP1.1协议是目前使用最普遍的协议!
 
 

Servlet容器

 

    Servlet 规范是SUN公司制定 的web容器规范,不仅提出了一组规范API,同时还说明了如何部署web应用等等一系列的问题。(大家熟知的Servlet接口、web.xml文件格式都是这个规范规定)。有了Servlet规范便可以用Java语言编写能提供动态内容的WEB应该程序(绝大部分站点都是动态内容),但是编写好一个符合Servlet规范的web应用之后,需要如何运行它呢?Servlet容器 就是这个问题的答案了。
 
 
    
 
    如上图所示,HTTP服务组件和Servlet容器协同工作,使得Jetty成为一个动态WEB服务器。
 
    这里提 下Servlet规范的版本问题,由于多年的发展,Servlet存在较多的版本,jetty实现了servlet2.4和servlet2.5版本,其他web容器tomcat6和glassfish也都实现了2.5版本。建议大家使用2.5规范,新的2.5规范提供了更好的易用性和更多的功能,这里暂不讨论。即将到来的Servlet3.0规范会在Jetty7中实现。
 
 

Jetty Client组件

 

    Jetty还为我们提供了一个HTTP Client组件,作为可编程的HTTP User Agent。使用它可以方便地向Web服务器发送HTTP请求和处理HTTP响应。Client使用no-blocking或者blocking的方式和服务器进行交互。使用非阻塞的好处是,你可以发送一个请求,然后异步地等待响应结果。关于详细功能在后续章节中描述。
 
 

异步Servlet

 

    在Servlet2.5之前(包括2.5),Servlet API只是以同步(synchronous) 方式被调用。同步 意味着在收到一个Http 请求之后,一直到请求完成响应的过程中,该请求一直占用一个服务器线程。也许你已经已经习惯了这种处理方式,认为就事情本该如此。但我要告诉你的是在某些场合下,这是个非常大的问题,在以前你肯定遇到过web应用程序的在线用户过多时,系统响应速度严重变慢,这就是由于此时服务上存在过多的活跃的服务线程,每个线程都在等待cpu时间片来执行,也或许 很多线程同时访问数据库造成数据瓶颈。
    同步模式很容易造成,过多请求=过多服务线程的问题=需要更多的内存和cpu资源。
    
    
 
    可以说 Jetty在Servlet3.0到来之前,为我们提供了一个异步Servlet方案--Continuations机制。异步Servlet方案允许我们在某个时刻挂起当前请求,释放被绑定的线程,然后当该请求需要被执行时,Jetty会在分配一个线程来继续执行该请求。
 
    拥有异步Servlet功能之后,当一个请求需要等待其他资源时(等待一个异步事件或一个远程系统调用),此时便可以挂起当前请求(注意:不要 理解为挂起的线程),释放和该请求使用的线程回到线程池。这样一个线程可以在一段时间内服务于多个请求。
    
    
 
    后续会有专门的章节来讨论异步Servlet和Continuations机制。
 
 

1.2 Jetty的特点

    可独立运行

 

    和tomcat一样jetty可以作为web服务器软件使用。
 

    可嵌入

 

    jetty凭借其设计精良的api和小巧的体积可以被嵌入到移动设备、工具、 框架、应用程序服务器和集群等任意场所。
 

    可定制

 

    jetty凭借其优秀的面向接口的设计和开放的开源协议,使我们可以根据特殊的应用程序需求来扩展jetty的功能来为我们所用。
 

    稳定性

 

    即使在有大量服务请求的情况下,系统的性能也能保持在一个可以接受的状态。

    灵活性

 

    可以根据你 的需要任意配置jetty启用的功能。比如是否支持Session,关闭session可以提高性能。
    利用可嵌入特性,我们甚至不需要按照servlet规范,也可以提供动态http内容的功能。总之jetty赋予了我们所有的权利,可以将jetty的功能发挥到极致。

 

1.3 jetty项目历史和现状

   Jetty是由Greg Wilkins在1995开发,开始只是作为Mort Bay公司的一个问题跟踪系统的Http服务组件,后来Jetty经历了很多版本和分支,后来逐渐包含了Http Client,servlet容器等相关组件和工具。
        
    jetty从版本1到版本 4的一直是mortbay提供管理服务的,后来jetty5在sourceforge托管,jetty6在codehaus托管,现在从版本7之后由eclipse基金会管理。
 
    现在Jetty已经成为一个优秀的开源软件,在国外逐渐被广泛使用。在国内由于java web开始初期Tomcat占了很多的市场份额,网络也有大量的关于Tomcat的中文资料,所以了解Jetty并熟练使用它的人不多,网络上关于Jetty全面的资料和书籍也很少,这也是制约Jetty在国内被普及的一个原因。下一个章节中我们会将Jetty和Tomcat做个比较。
 

1.4 jetty vs tomcat

    Tomcat是大多数Java web开发人员所熟知的开源servlet容器。从表面功能上Jetty和Tomcat都是差不多的,都提供Http Server 和 Servlet容器功能。那么区别呢?接下来我们从各个方面进行比较。        
 

    Tomcat项目提供了一个实用的Java Web容器,在通常情况下已经可以满足使用要求 ,在国内也存在大量的用户,使用比较普遍。但是它只是一个服务器软件,当你有更多的需求和要求时,便不再实用了,此时Jetty的出现可以解决这些问题。

 

    从构架方面分析

 

     把jetty和tomcat 看作一个黑盒子,在部署符合servlet2.5标准的应用程序方面,除了服务器配置方式不同之外其他也看不出区别。
 
    不过的当我们拆开黑盒子来比较内部实现时,它们的结构就是完全不一样的。这种结构上的差异,不仅和不同的设计目标有关,还和项目的历史演变过程相关。
 
    Tomcat作为第一款成功 web容器,被大部分人熟知,用户群体庞大。在过去的一段时间里面,Tomcat是Servlet2.4规范的公认的参考 实现,具有学院派的风格。最常见的Tomcat使用方式是将其作为一个服务器软件安装到操作系统上,然后在里面部署web应用。当然它也可以被嵌入到其他JEE服务器中以提供Web容器功能,或者作为组件嵌入到其他应用程序中,不过操作以来还是比较复杂的。
 
    打开Jetty的盒子,你会发现它是由多个可以独立运行的软件组件(software component )通过彼此之间的可插拔接口组装在一起,甚至它还赠送了些方便的工具箱!回想一下你打开电脑机箱时看到的情景,Cpu,内存,硬盘,网卡等设备插接在主板上,然后各司其职、协同工作。只要你愿意可以换掉其中任何一个符合标准接口的设备,如DDR3的内存。
 
    组件特性就是Jetty主要的设计特点。有了这个特性,我们就可以 让Jetty为我所用,按照我们 自己意愿和需求来定制Web服务器。所以Jetty为我们 提供的不仅仅是完整的web服务器软件,而且还提供了良好的面向接口的,灵活的软件组件,以便我们 随心所欲的使用。
        
    正是这种灵活的基于组件的构架,使得Jetty应用范围非常之广:
        1.可以部署的环境:小到手机移动设备,大到集群服务器中。
        2.嵌入到其他框架或工具中,比如OSGi Equinox, OSGi Felix, Spring, Plexus, Cocoon, Tapestry, Maven, Continuum, Fisheye, Grails, JRuby, Xbean, etc.
        3.为JEE应用服务提供web容器功能,比如 Geronimo, Jboss, Sybase EAServer, JOnAS and Glassfish等
 
    除了上面介绍的应用,Jetty还广泛应用在其他多个开源软件或公司产品中。
 
    这说明由于构架上的不同Jetty的应用领域比Tomcat更为广泛。Tomcat更多时候只能作为一个软件整体被安装使用。    
 
 

从性能方面分析

        
    Jetty和Tomcat在实际使用过程中都具有良好的性能表现,不过在不同应用场景下表现不一,所以很难提供一个公平的测试基准。
    根据各自特点做出如下分析:
  • Tomcat在耗时请求连接数量不多时,也就是大多数请求能非常短的时间处理完毕的情况下,具有较好的执行效率。
  • 在静态文件服务方面,jetty具有更好的性能优势。这 由于Jetty使用了文件内存映射机制和NIO来对静态内容进行输入输出,这种方式将占用更少的系统内存和更快发送速度。
  • Jetty在存在大量并发连接,大多数连接又需要更多的处理时间(业务逻辑计算占用的时间)的情况下,具有更好的性能和伸缩性。这种情况是现在大多数web应用具有的特点。Jetty的高性能,伸缩性,都是得益于NIO特性。而且这种高性能使得 jetty本身不会占用很多的内存,这样便把有限的内存资源留给应用程序来使用。
 


标准规范

    

    Tomcat曾是sevlet2.4规范的参考实现,从Servlet2.5之后,Tomcat不再是参考实现了,Sun公司自己创建了Glassfish,并作为Servlet2.5、Servlet3.0、Jsp2.1的参考实现。Jetty在执行规范方面做的非常好,是Servlet2.5规范的一个优秀实现。Jetty的开发者在servlet2.5和 servlet3.0规范的讨论和定制过程中表现得相当活跃,并作出了贡献。Jetty不但在实现相应规范上做的很好,而且一些新的研究和创意都在影响将来新规范的诞生。比如Servlet3.0中,Jetty自有的continues机制也成为规范备选方案之一。

 

 

1.5 本章小结

15
1
分享到:
评论
11 楼 宋建勇 2013-05-21  
最近在学jetty,很好的文章啊!
10 楼 whmyahoo 2013-04-27  
jimichan 写道
whmyahoo 写道
我现在在作openfire 嵌入jetty的开发,不知道怎么改contextpath,能指导一下吗

详细内容可以发邮件给我

己经解决。谢谢
9 楼 wangbing9577 2012-11-20  
图片能显示出来的话就更好了
8 楼 jimichan 2012-07-31  
whmyahoo 写道
我现在在作openfire 嵌入jetty的开发,不知道怎么改contextpath,能指导一下吗

详细内容可以发邮件给我
7 楼 whmyahoo 2012-07-30  
我现在在作openfire 嵌入jetty的开发,不知道怎么改contextpath,能指导一下吗
6 楼 sankby 2011-12-28  
为什么图出不来
5 楼 it289644511 2011-09-27  
4 楼 DarkMeteor 2011-09-26  
看完了,如果是原版的话,顶一个。
3 楼 sangmin214 2011-02-10  
看至少第二遍了
2 楼 liu_hliang 2010-07-01  
最近我也在研究jetty,博主写的非常好,很全面、很透彻
希望继续坚持下去
1 楼 xgj1988 2010-06-01  
  顶一个

相关推荐

    Jetty权威指南.pdf

    ### Jetty权威指南知识点梳理 #### 一、Jetty简介 **1.1 Jetty功能介绍** Jetty是一个完全由Java编写的高性能HTTP服务器及servlet容器,它不仅能够作为一个独立的服务运行,还具备强大的可嵌入性。Jetty的设计...

    JEECMS V6系统使用说明书

    **第一章:系统简介** 1. **jeecms产品介绍** JEECMS是一款开源的Java CMS(内容管理系统),设计目标是提供高效、稳定、易用的网站解决方案。它集成了内容发布、用户管理、论坛、博客等多种功能,适合构建各类...

    JIRA教程—用户使用指南

    #### 第一章:前言 - **JIRA简介**:JIRA是一款由澳大利亚Atlassian公司开发的问题跟踪管理软件,主要用于追踪和管理项目中的各类问题,如缺陷、任务、需求、改进等。该软件采用J2EE技术构建,支持跨平台部署,并因...

    ZCS+开源版管理员指南

    #### 第一章 介绍 **目标读者** 本指南主要面向负责ZCS部署的系统管理员,要求具备以下背景知识和技能: 1. **熟悉相关技术与标准**:比如RHEL(Red Hat Enterprise Linux)、SUSE等操作系统以及开源的基本概念。...

    第一章、STRUTS2.0开发环境

    Struts2.0是Java Web开发中的一款著名MVC框架,它基于Model-View-Controller设计模式,旨在简化Web应用程序的开发。本章将深入探讨Struts2.0的开发环境搭建及其核心概念,帮助开发者快速上手。 一、Struts2.0概述 ...

    Manning Portlets and Apache Portals

    ### 第一章:我的第一个Portlet #### 1.1 当前Java Portlet规范的状态 - **Java Portlet Specification**:介绍了当前版本的Java Portlet规范(如JSR 168、JSR 286等),包括其发展历程、特点和优势。 - **Portlet...

    Spring Security权限管理开发手册

    - **第6章:控制用户信息** - **MD5加密:** 使用MD5算法对用户密码进行加密存储。 - **盐值加密:** 为了提高密码的安全性,在MD5加密基础上增加盐值。 - **用户信息缓存:** 使用缓存技术来提高用户信息的读取...

    Restlet in Action

    ##### 第一部分:入门 (GETTING STARTED) 这部分主要介绍Restlet框架的基础知识和简单的应用案例。 1. **第1章:介绍Restlet框架**(Introducing the Restlet Framework) - **章节概述**:本章介绍了Restlet框架...

    Maven权威指南 很精典的学习教程,比ANT更好用

    Maven权威指南是一本关于Apache Maven的书。 Copyright 1. Creative Commons BY-ND-NC Foreword: Beta 0.16 Preface 1. How to Use this Book 2. Your Feedback 3. Font Conventions 4. Maven Writing ...

    jaas in action

    在提供的文件列表中,我们看到包括了从第一章到第十章的部分章节,这表明书籍涵盖了从基础概念到高级特性的全面讲解。每个章节的PDF文件可能分别专注于不同的主题,例如,第九章和第十章的某些部分可能涉及到了更...

    JSP范例宝典 第1章

    **JSP范例宝典** 是一本专注于JavaServer Pages(JSP)技术的实践指南,旨在帮助开发者深入理解和掌握JSP的各种应用场景和技术要点。在**第1章** 中,我们通常会从基础出发,逐步引入JSP的核心概念,为后续章节的...

    JSP开发实例

    第1章“JSP和J2EE开发环境指南”主要介绍如何配置和搭建JSP与J2EE的开发环境。首先,你需要安装Java Development Kit (JDK),这是运行所有Java相关技术的基础。接着,设置Java环境变量如JAVA_HOME、PATH和CLASSPATH...

Global site tag (gtag.js) - Google Analytics