`
wking_forever
  • 浏览: 61617 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论
阅读更多
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同样也会在国内流行开来。

分享到:
评论

相关推荐

    jetty相关的全部jar包

    jetty-security-9.4.8.v20171121.jar,jetty-io-9.4.8.v20171121.jar,jetty-continuation-9.4.8.v20171121.jar,jetty-client-9.4.8.v20171121.jar,jetty-jmx-9.4.8.v20171121.jar,jetty-plus-9.4.8.v20171121....

    jetty整合springmvc例子

    【标题】:“Jetty整合SpringMVC例子” 在Java Web开发中,Jetty是一个轻量级、高性能的HTTP服务器和Servlet容器,而SpringMVC是Spring框架的一部分,用于构建MVC模式的Web应用。将Jetty与SpringMVC整合可以实现...

    jetty软件包升级版本

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,广泛用于开发、测试和部署Web应用程序。在软件开发过程中,定期更新Jetty版本是非常重要的,因为它可以提供最新的功能、性能优化以及安全修复。本篇将详细...

    eclipse jetty插件run-jetty-run-1.3.3

    eclipse jetty插件,从...下载run-jetty-run.zip文件,解压后再编写个links文件丢到eclipse的dropins目录下即可,省去了使用eclipse update方式安装的麻烦。 link文件样例如: path=d:\\eclipse_plugins\\run-jetty-run

    jetty-6.1.26.zip

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,与Tomcat相似,它为开发和部署Web应用程序提供了一种高效的选择。Jetty在设计上注重灵活性和可扩展性,使得它在处理HTTP协议、WebSocket协议以及部署各种...

    jetty-all.jar

    Jetty-all.jar是一个集合了众多Jetty组件的综合性JAR文件,它的主要目的是为了方便开发者在项目中快速引入和使用Jetty服务器。Jetty是一个开源的HTTP服务器和Servlet容器,它以其轻量级、高性能和易用性而受到广泛...

    maven集成jetty所需jar包maven-jetty-plugin,多版本

    在Java开发领域,Maven和Jetty是两个非常重要的工具。Maven是一个项目管理工具,它可以帮助开发者管理和构建Java项目,而Jetty则是一个轻量级的嵌入式Servlet容器,常用于快速开发、测试以及部署Web应用。本文将详细...

    jetty 8及依赖包

    这个压缩包包含Jetty 8版本的实现及其依赖库,是学习和理解Jetty工作原理,尤其是NIO(非阻塞I/O)和Servlet容器实现的宝贵资源。 Jetty 8在设计时特别强调了性能和可扩展性,它使用了Java NIO(New I/O)API来处理...

    jetty 9.4.9

    Jetty 9.4.9 是一个开源的Java Web服务器和Servlet容器,以其轻量级、高效和灵活性而受到开发者的欢迎。这个版本是Jetty项目的一个重要里程碑,提供了许多性能改进和新特性。在深入探讨之前,让我们先了解一些基本...

    jetty各个版本下载

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,它被广泛应用于各种规模的项目,从小型的个人项目到大型的企业级应用。Jetty以其高效、稳定和易于集成的特点,深受开发者喜爱。在本篇文章中,我们将深入...

    maven-jetty-plugin

    ** Maven Jetty Plugin 知识点详解 ** Maven Jetty Plugin是一款强大的工具,它将Jetty服务器集成到了Maven的构建流程中。这个插件允许开发者在开发过程中快速、便捷地运行和测试Java Web应用程序,而无需进行完整...

    jetty9.4.11+jetty在idea上的配置教程

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,广泛用于开发、测试和部署Web应用程序。在本文中,我们将深入探讨如何在IntelliJ IDEA(简称IDEA)这个流行的Java集成开发环境中配置Jetty 9.4.11版本。...

    jetty v9.2.2版本

    Jetty V9.2.2版本是Jetty项目的一个稳定发行版,专注于提供高效、轻量级且可嵌入式的Web服务器和Servlet容器。Jetty是一个开源的Java HTTP服务器和Servlet容器,它允许开发者在Java应用程序中直接部署和管理Web服务...

    Jetty权威指南.pdf

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

    Jetty9 配置使用HTTPS证书

    配置Jetty9服务器使用HTTPS证书的过程涉及多个步骤,包括申请证书、转换证书格式、以及配置Jetty服务器本身。以下详细描述这些步骤。 首先,申请证书部分通常需要借助第三方服务商,如阿里云、腾讯云等,这些服务商...

    jetty 适合jdk1.8用的服务器

    Jetty是一款开源、轻量级的Web服务器和Servlet容器,被广泛用于开发、测试和部署Java Web应用程序。相较于Apache Tomcat,Jetty以其简洁的架构、高性能和低内存占用而受到开发者青睐。在选择Jetty时,必须考虑到与...

    jetty在eclipse中配置

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,它被广泛用于开发、测试和部署Web应用程序。Eclipse是流行的Java集成开发环境(IDE),开发者可以利用它来管理和运行项目。本教程将详细介绍如何在Eclipse...

    jetty所需jar包

    本篇文章将深入探讨Jetty所需jar包的相关知识点,帮助你理解和配置Jetty运行环境。 首先,让我们了解Jetty的核心组件和它们对应的jar包: 1. **jetty-server.jar**:这是Jetty服务器的基础,包含了处理HTTP连接和...

    jetty-6.1.26官方正式版本.zip

    与Tomcat相似,Jetty也被广泛用于开发和部署Web应用程序。下面是关于Jetty 6.1.26及其组成部分的一些详细知识点: 1. **Jetty简介**:Jetty是一个Java Web服务器和Servlet容器,由Mort Bay Consulting开发。它以高...

    jetty9分拆的各个包下载

    jetty-alpn-client-9.2.26.v20180806.jar jetty-alpn-server-9.2.26.v20180806.jar jetty-annotations-9.2.26.v20180806.jar jetty-cdi-9.2.26.v20180806.jar jetty-client-9.2.26.v20180806.jar jetty-continuation...

Global site tag (gtag.js) - Google Analytics