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

[经验分享] Jetty 服务器架构分析(上)

[复制链接]

尚未签到

发表于 2017-2-27 12:06:43 | 显示全部楼层 |阅读模式
   以jetty7作为分析目标,Jetty是由一个或多个connector核心组件以及一些列handler组件和一个线程池组成,看一下结构图:
DSC0000.gif
           Connector负责监听接收客户连接请求,而handler组件则负责处理请求并给予响应,前面两个组件工作所需要的线程资源都直接从线程池ThreadPool中获取。Jetty  Server 可以有多个connector在不同的端口上监听客户请求,而每个connector根据具体的使用场景不同可以有不同的实现,例如采用非阻塞NioConnector、阻塞SocketConnector等等,而对于请求处理的handler组件,也根据具体需要可以使用不同的handler,此种设计提高了jetty的灵活性,需要servlet,则可以使用servletHandler,需要session,则再增加一个sessionHandler,也就是说我们完全可以不使用servlet或者session,只要不配置这个handler就行了。
    要启动和协调上诉核心组件工作,Jetty提供了一个Server类来做这个事情,也就是说Server是应用的起始点,他负责创建并初始化connector、handler、ThreadPool组件,然后调用start方法启动他们,让所有组件都处于待命状态,因此Server类是一个比较重要的Façade,值得注意的Server类本身也是一个handler.
一、      组件生命周期
对于jetty来说,每个组件都有其生命周期,jetty采用了统一的LifeCyle接口来控制,我们来看下,类图结构:
DSC0001.gif
connector,handler等组件全部都直接或间接实现了LifeCyle接口,刚才说了Server也是Handler,同时他也是启动或协调组件工作的类,也就是说Server可以通过LifeCyle接口控制其他组件的生命周期,通过start方法可以启动server,通过stop则关闭了server。
二、      Connector组件
DSC0002.gif
Connnetor在实现上有NIO、BIO两种实现方式,并且支持AJP协议、和SSL。

三、      Handler组件
DSC0003.gif
所有的handler组件都实现了Handler接口,可以看到,Handler是可以以链表的形式相互组合的,Server作为服务入口,本身也是handler,他继承了HandlerWrapper接口,我们看以看到他带了一个handler的引用变量,我们可以注入ServletHandler支持servlet,注入WebAppContext则支持我们的webapp应用。
  
四、      启动过程
   先看下jetty的目录结构
DSC0004.gif

看几个主要目录的含义,
Bin目录定义了启动jetty需要的sh文件,主要用在linux中,windows中可以直接java start.jar启动服务器,
Contexts目录主要放置跟应用相关的context配置文件,跟应用相关
etc 目录放置跟服务器相关的配置文件,其中会定义contexts目录所在的位置
lib是服务器所需要的jar包
webapps 是放置应用程序的位置,当然也可以通过在contexts中或者etc中自定义

我们从外部启动一个jetty服务器的过程:
DSC0005.gif
首先从Start.jar开始,这个jar定义了解析命令行的Main这个类,Main主要负责解析start.ini配置文件,start.ini中定义了JVM需要的参数以及etc目录中用到的xml配置文件,如下图:

DSC0006.gif




然后由Config类解析出stat.ini中OPTIONS选项指定的模块的包的位置用来加入到classpath中,这些模块的包都定义在start.config文件中(该文件可以在start.jar包中找到),截取一个片段给大家看下:
DSC0007.gif
这个文件的配置是需要有一定的语法在里面的,有兴趣的可以研究一下,也就是说,通过在start.ini中定义OPTIONS以及在start.config中定义模块路径就可以确定把哪些jar加入到环境变量中。
         以上准备工作做完之后,就可以真正开始服务器的处理了,这时你有两种选择,第一种是在本进程中通过反射方式启动,但是缺点是start.ini中配置的JVM参数就形同虚设了,因为java进程已经起来了,不能再按照新的堆参数等重新设置了;第二种方式就是重新启动一个进程,就可以重新设置参数,前面说了,start.ini中得到了启动参数,start.config中有了MainClass和Classpath需要的jar包,则可以直接用java xxx方式启动了,要使用这种方式启动,只需要在start.ini中配置–exec 参数即可。
         MainClass默认是XmlConfigration类,当然自定义的话,可以在start.config中去更改,XmlConfigration做几件事情:1、根据start.ini中的定义的配置文件进行解析,例如etc/jetty.xml等 2、通过自己的IOC将这些服务组件组装在一起 3、最后调用start方法启动这些组件。


==========================
   未完待续.....

运维网声明 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-347973-1-1.html 上篇帖子: Jetty 服务器架构分析(中) 下篇帖子: 1.3.2 Jetty 的基本配置(1)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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