剖析Jetty的运行原理

简介: 之前写过一篇简单使用Jetty的文章,Jetty对于做JAVA Web方面开发的人来说并不陌生,他是一个servlet容器,不过相对Tomcat来说设计的比较简单,而且使用起来也比较简单灵活,我是在学习和使用openfire时接触的Jetty,openfire使用Jetty开发其强大的管理后台。

之前写过一篇简单使用Jetty的文章,Jetty对于做JAVA Web方面开发的人来说并不陌生,他是一个servlet容器,不过相对Tomcat来说设计的比较简单,而且使用起来也比较简单灵活,我是在学习和使用openfire时接触的Jetty,openfire使用Jetty开发其强大的管理后台。

在我最近的一个项目里我也想用Jetty来开发一个后台管理程序,不过用Jetty来开发后台管理程序的缺点在于集群环境下,对于集群环境下的管理后台最好用Tomcat这样的单独部署起来,方便管理。

先从代码简单地介绍下Jetty的几个核心:

核心类:org.mortbay.jetty.Server

核心接口:org.mortbay.component.LifeCycle

核心线程池封装:org.mortbay.thread.QueuedThreadPool

核心IO处理类:org.mortbay.jetty.nio.SelectChannelConnector

核心Servlet处理类:org.mortbay.jetty.servlet.ServletHandler

根据对源码的Debug跟踪,我画了一个简单的运行原理图,该图说明了Jetty如何HTTP请求:

                                                               图1-- Jetty运行原理图

我在windows上调试的Jetty,所以这里没有epoll,只有selector的IO多路复用模型。

以下是我调试时的截图:

                                       图2-- 调试截图

图2要从下往上看线程模型。

可以看出虽然处理连接请求的线程处理具体请求数据的线程都由QueuedThreadPool管理,但这却是两个完全不同的线程,在设计模式里这其实是观察者模式的体现,也叫发布与订阅模式。在NIO里,流程的进行基本上是事件驱动的,也就是没有事件就休息。

Jetty的原理基于NIO,这里简单地说一下selector的IO多路复用思想:

1,监听者注册要监听的事件类型到管理器中;

2,当有事件注册到管理器里时,若有监听者注册的类型的事件,管理器就将此事件通知给之前注册的监听者;

3,监听者拿到事件后将其从管理器中删除并对其进行相关的处理。

这里建议读者去了解下观察者模式,毕竟他的思想还是应用挺广的。

Jetty里还有两个关键的工具就是将Http的请求数据解析的工具类:org.mortbay.jetty.HttpParser 和用于生成响数据的工具类:org.mortbay.jetty.HttpGenerator,读这两个类的同时可以了解下HTTP协议和Servlet规范。

由于HTTP的底层是TCP/IP,所以这里给出一个直观的TCP连接,当然这里用的是Socket实现的:

这是我用本地的浏览器连接测试的,可以看出一些连接相关的参数。

当然,Jetty还支持HTTPS,如下:

和Tomcat相同,需要安全证书,可以用JDK生成一个证书,然后测试一下Jetty的HTTPS连接,这个以后再续,感兴趣可以研究下TLS,最近暴SSL3.0和openssl都不安全,虽然TLS是在SSL3.0上标准化的,但TLS对SSL3.0的不合理之处进行了修改,毕竟标准化了还是可靠的。

关于TLS的题外话:苹果宣布其APNS对SSL3.0关闭了,我仔细看了一下我们项目中的代码,原来我们一直用的都是TLS,可见标准化是多么重要。


目录
相关文章
|
JSON Java 数据格式
用Jetty 9.1运行Java WebSockets微服务
  Jetty 9.1的发布将Java WebSockets (JSR-356) 带入了非Java EE环境,从而开启了微服务时代。我们可以将Jetty的容器包含在java应用程序中(注意,不是Java代码运行在容器中,而是相反),这种微服务轻量概念开始得到提倡推广,为模块化开启新的探索方向。
821 0
|
缓存 分布式计算 API
Spark Netty与Jetty (源码阅读十一)
  spark呢,对Netty API又做了一层封装,那么Netty是什么呢~是个鬼。它基于NIO的服务端客户端框架,具体不再说了,下面开始。   创建了一个线程工厂,生成的线程都给定一个前缀名。      像一般的netty框架一样,创建Netty的EventLoopGroup:      在常用...
1068 0