一、 总括
你了解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架构分析 - **总括**:Jetty的核心设计理念在于其简洁高效的架构设计,使得开发者能够在短时间内轻松搭建起Web应用环境。 - **主要组成部分**:Jetty可以大致分为四个主要部分——`HttpServer`、`...
i-jetty源码分析 i-jetty是一款基于Java语言实现的轻量级Web服务器和Servlet容器,它在Google Code上可以找到。这个源码库包含了i-jetty项目的版本3.1,提供了对HTTP协议的支持以及对Servlet规范的实现。本文将深入...
2. **Jetty源码分析** - **ServletContainerInitializer**:Jetty通过实现这个接口来支持Servlet 3.0的注解驱动配置。 - **HandlerWrapper**与**HandlerCollection**:提供了一种灵活的方式来组织和管理处理器链。...
源码分析对于理解其工作原理、优化性能以及定制化开发有着至关重要的作用。在这个"jetty 源码 2018 zip"压缩包中,包含的是Jetty 9.4.10.RC1版本的源代码,这为我们提供了一个深入了解Jetty内部机制的机会。 首先,...
本文将深入探讨Jetty的架构及其核心特性,帮助你理解其工作原理和优势。 首先,Jetty的核心设计理念是简洁和高效。与许多其他Web服务器不同,Jetty没有采用多层架构,而是采用了基于事件驱动的单线程模型,这使得它...
通过分析Jetty 6.1.26的源码,开发者可以深入理解Web服务器的工作原理,这对于优化性能、自定义行为或解决特定问题都有极大的帮助。同时,这也有助于开发者更好地过渡到Jetty的更新版本,因为许多基础架构和设计原则...
1. **Jetty架构概述** Jetty采用模块化设计,主要包括Server、Connector、Handler和Servlet等组件。Server是整个框架的核心,负责管理Connectors和Handlers;Connectors负责网络I/O,如HTTP连接;Handlers处理请求...
对于源码分析和自定义扩展,还需要具备一定的Java编程基础,理解Servlet容器的工作原理。 总的来说,Jetty 6.1.9是一个功能强大的服务器平台,特别适合需要高效、轻量级解决方案的开发者。通过学习和使用这个版本,...
一、i_jetty基础架构 i_jetty的核心在于其轻量级的设计,它将Jetty服务器的关键组件移植到Android环境,确保在资源有限的移动设备上高效运行。源码中包含的主要模块有: 1. **Server**: 作为整个Web服务器的入口,...
### Jetty与源码分析 对于希望深入了解Jetty工作原理的开发者,阅读源码是很好的学习途径。Jetty的源码清晰、结构分明,可以帮助我们理解其内部的工作机制,如请求处理流程、线程模型等。 ### 工具支持 为了方便...
5. **模块化设计**:Jetty以其模块化架构著称,源码中可以看到如何通过组合不同的模块来构建一个特定功能的服务器实例。这有助于理解如何根据需求裁剪和扩展Jetty。 6. **性能优化**:通过阅读源码,开发者可以学习...
Hadoop源码分析是深入理解Hadoop分布式计算平台原理的起点,通过源码分析,可以更好地掌握Hadoop的工作机制、关键组件的实现方式和内部通信流程。Hadoop项目包括了多个子项目,其中最核心的是HDFS和MapReduce,这两...
5. **构建脚本**:如Ant或Maven脚本,用于编译、测试和打包Jetty源码。 通过深入研究Jetty源代码,开发者可以学到以下关键知识点: 1. **Servlet容器工作原理**:了解Jetty如何创建和管理Servlet实例,处理请求和...
关于源码分析,Jetty的源代码结构清晰,适合学习和定制。通过阅读源码,我们可以深入理解其内部工作流程,比如请求处理链路、线程池管理、会话管理等高级特性。对于开发者来说,这是一个提升技能的好途径。 在开发...
Jetty 6是较早的版本,尽管现在推荐使用更新的版本,但对于理解Jetty的基本工作原理和架构仍然有参考价值。 学习Jetty不仅可以提升Java Web开发能力,还能帮助你理解服务器内部的工作机制,为开发更高效、更稳定的...
7. **源码分析**: 在博文链接中,可能会详细解析上述步骤中的源代码,包括如何在Java类中配置Jetty,如何定义Spring MVC的Controller,以及如何在pom.xml中管理依赖。 8. **工具的使用**: 除了Maven、Jetty和...
1. **轻量级**:Jetty自身设计轻量,启动快速,对系统资源占用小,适合小型项目或微服务架构。 2. **可扩展**:Jetty支持多种协议(如HTTP/2、WebSocket),并且可以添加自定义的处理器和过滤器,以满足特定需求。 ...
Jetty是一款轻量级、高性能且易于使用的Web服务器和Servlet容器,因其小巧的体积和出色的稳定性而备受开发者喜爱...而对于有经验的开发者,深入研究Jetty的源码和模块化设计,可以帮助优化性能,实现更高效的应用服务。
对于开发者来说,研究Jetty源码不仅可以提升对Web服务器工作方式的理解,还能学习到如何构建高效、可扩展的网络服务。如果你正在进行Java Web开发,或者对服务器性能有较高要求,那么研究Jetty绝对是一个值得投入的...
源码分析可以帮助你理解如何使用JAX-WS创建服务提供者和服务消费者,以及如何处理服务的生命周期。 5. **RESTful Web Services**:尽管标题没有明确指出,但现代Web Service开发中,RESTful风格也相当常见。REST...