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>
<图 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 作者联系方式:陈应刚 dycyg@yahoo.com 熊红阳 Chatopera博客 聊天机器人 机器学习 智能客服 北京华夏春松科技有限公司,为企业交付智能客服系统、智能对话机器人、机器人客服、Chatbot。https://www.chatopera.com