设为首页 收藏本站
查看: 973|回复: 0

[经验分享] Jetty体系结构概述

[复制链接]

尚未签到

发表于 2017-2-26 10:16:54 | 显示全部楼层 |阅读模式
Jetty 是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的 API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。由于网上关于Jetty的中文资料比较少,本文将其官方文档翻译成中文供初学者学习。英文原文可以参考:http://wiki.eclipse.org/Jetty/Reference/Jetty_Architecture

鸟瞰Jetty



Jetty最上层的体系结构
Jetty Server是处于一组Connectors(接收Http连接)及一组Handler(从连接进行请求并产生响应)并采用线程池进行工作的一个工具。

Jetty请求/响应接口继承自Servlet API,如果相应的Handlers被配置上的话,应该能够支持Servlet API的所具备的所有特征。例如,请求中的会话API是不可用的除非请求经过SessionHandler的处理,且Servlet本身的一些理念也通过ServletHandler实现了。如果Servlet本身是不必要的,就不需要使用Servlet的请求/响应API了。因此,你可以完全采用Connector及Handlers来构建一个Jetty服务器,而不用借助于Servlets.

配置Jetty的任务就是要构建一系列的connectors和handlers及提供个人的一些配置。由于Jetty的组件都是一些POJOs,你可以通过以下几种技术方式来组装和配置这些组件:

l 通过代码的方式,可以参考Jetty 7 Latest Source XRef
l 采用Jetty XML方式
l 使用自己的依赖注入方式如Spring 或XBean.
l 使用Jetty本身的WebApp and Context Deployers.

设计模式





Jetty本身的实现采用了很多通用标准的设计模式,许多抽象的概念如Connectors、Handlers及Buffers均采用接口的方式来实现,对接口一般化的处理则采用了抽象类的方式进行实现如AbstractConnector, AbstractHandler and AbstractBuffer.
JSR77草案中提倡使用的生命周期管理也在Jetty组件中以LifeCycle接口及AbastraceLifeCycle方式来体现,并作为了其基础组件。
Jetty提供基于字符串、字节数组及NIO缓冲方式的自身IO缓存。可以提供更好的可扩展性、简化NIO层的复杂性及支持更高级的特性。

Connectors


Connectors表示一个协议链,用来接受连接,解析请求并产生响应。基于不同的协议、调度模型及IO形成不同类型的Connectors,最常用的有以下几种:
l SocketConnector:用于忙链接请求不多或者没有NIO的方式
l BlockingChannelConnector:用于有NIO的方式且忙链接请求较多的方式
l SelectChannelConnector:用于空闲链接较多或者异步处理 AJAX请求
l SslSocketConnector:没有NIO的SSL方式
l SslSelectChannelConnector:非阻塞的NIO支持的SSL方式
l AJPConnector:对apache mod_jk及mod_proxy_ajp的AJP协议的支持

Handlers




Handler是用于处理接收请求的组件,handler的核心API是handle方法:
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
各个参数的含义:
l target–请求的目标,为URI或者是一个名称;
l baseRequest–原始的未经包装的请求对象;
l request–请求对象或者被包装过的请求。如果有需要可以通过HttpConnection.getCurrentConnection()方法来访问该对象;
l response–响应对象或者是被包装过的请求,如果有需要可以通过HttpConnection.getCurrentConnection()方法来访问该对象;
实现了该方法可以处理请求,将请求传递至另外一个handler(或servlet)或者修改、重新包装该请求并进行传递。在此主要介绍三种类型的handlers:
l 协调整合型Handlers-这种类型的Handlers能够将请求路由至另外一个Handlers(如HandlerCollection,ContextHandlerCollection)
l 过滤型Handlers-这种类型的Handlers用于强化或处理请求,并传至另一个Handlers(如HandlerWrapper,ContextHandler,SessionHandler)
l 生成型Handlers-这种类型的Handlers用于产生所需的内容(如ResourceHandler和ServletHandler)

内嵌的Handlers及序列性的Handlers

你可以组装不同的Handlers用于处理不同的请求,如嵌套型、顺序型或者二者的结合。


l 序列型Handlers执行时,不必依赖于下一次的调用,而且不必依赖于handlers的顺序。它在处理请求并产生响应时不需与其它Handlers的交互,这种的主要类是HandlersCollection.
l 内嵌型Handlers也被称为before/invokeNext/after模式,它的主要代表类是Handler Wrapper.内嵌型Handlers要比序列型的更具通用性。
请参考Writing a Jetty Handler如何写一个具体的Handler

Servlets



ServletHandler是一个处理器,用于将请求传递至配置好的Filters,再通过URI映射好的Servlet而产生具体内容。
ServletHandler一般是被部署在servletContext中,因为它可以提供便捷的将URIs与Servlets进行映射的方法。
Filters和Servlets也可以使用请求转发器将请求路由至另外一个Context或当前Context中的其它的Servlet。

Context

Contexts是将一组特定URI路径或虚拟主机下的Handlers组织在一起的处理器,一个典型的Context包括以下几个方面:
1、一个上下文路径用于定义该请求能够被context处理;(如/myapp
2、对于静态资源访问的基本路径(如docroot
3、用于获取需要装载基本类的地址(如docroot/WEB-INF/classes
4、虚拟主机名
Contexts有以下几种实现:
l ContextHandler
l ServletHandler
l WebApplication Context
Web应用的上下文是集安全、会话及Servlets于一身的处理器,可以通过web.xml进行配置。

Web Applications



WebAppContext继承自servletContext,可以支持标准的Web应用的框架,而且可以通过web应用的WEB-INF中的web.xml进行会话、安全、监听器、过滤器、ServletsJSP配置。
本质上WebAppContext就是一个方便性的类,采用构造、配置其它Handler的方式来完成一个Web应用的标准配置。
配置可以采用插件式的Configuration类或者WebXmlConfiguration来完成。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-347330-1-1.html 上篇帖子: jetty与hessian结合 下篇帖子: jetty-如何配置虚拟主机
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表