Jetty介绍

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是基于ApacheLicence 2.0  和 EclipsePublic License 1.0 开源协议发布的,因此你可以在任意地方使用它,并可以免费地用于商业行为。

   

    目前稳定版是jetty6系列,本书的使用的版本是Jetty6.1.22。

1.1 Jetty功能介绍

   

 

HTTP服务

 

   HTTP协议是 Web浏览器和Web服务之间沟通的语言,实现Http协议是作为web服务器最基本的能力。

    实现HTTP协议,Jetty 才能接收 UserAgent(浏览器或者其他支持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; WindowsNT 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:38GMT

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//DTDXHTML 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机制也成为规范备选方案之一。


 

来至:http://jimichan.iteye.com/blog/601149

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使得浏览器和服务器之间的数据交换变得更加简单,更快速,更实时。 在传统的 HTTP 协议中,客户端发送请求到服务器后,服务器会响应一个完整的 HTML 页面或者一个数据 JSON,这种请求响应模式被称为“请求-响应模式”。 而 WebSocket 通过建立一条长连接,使得浏览器和服务器之间可以进行双向实时通信。客户端可以向服务器发送数据,服务器也可以主动向客户端发送数据,这种通信模式被称为“推送模式”。 Jetty 对 WebSocket 的支持非常好,它提供了完整的 WebSocket API,可以方便地实现 WebSocket 服务器和客户端。下面是一个简单的示例: ```java import org.eclipse.jetty.server.Server; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.annotations.*; import org.eclipse.jetty.websocket.server.WebSocketHandler; import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; @WebSocket public class MyWebSocketHandler { @OnWebSocketConnect public void onConnect(Session session) throws Exception { System.out.println("Connected: " + session.getRemoteAddress().getHostName()); session.getRemote().sendString("Hello, world!"); } @OnWebSocketClose public void onClose(int statusCode, String reason) { System.out.println("Closed: " + statusCode + ", " + reason); } @OnWebSocketMessage public void onMessage(String message) { System.out.println("Message received: " + message); } public static void main(String[] args) throws Exception { Server server = new Server(8080); WebSocketHandler wsHandler = new WebSocketHandler() { @Override public void configure(WebSocketServletFactory factory) { factory.register(MyWebSocketHandler.class); } }; server.setHandler(wsHandler); server.start(); server.join(); } } ``` 在这个示例中,我们定义了一个 WebSocket 处理器 `MyWebSocketHandler`,并通过 `@WebSocket` 注解标记了它。在 `onConnect` 方法中,我们打印了客户端的连接地址,并向客户端发送了一条消息。在 `onClose` 方法中,我们打印了客户端关闭连接的状态码和原因。在 `onMessage` 方法中,我们打印了客户端发送过来的消息。 最后,在 `main` 方法中,我们创建了一个 Jetty 服务器,并将 WebSocket 处理器注册到了 `WebSocketServletFactory` 中,然后启动了服务器。这样,当有客户端连接到服务器时,就会自动调用 `MyWebSocketHandler` 中对应的方法进行处理。 除了使用注解的方式,Jetty 还提供了一种基于接口的方式来实现 WebSocket 处理器,具体可以参考 Jetty 的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值