之前写一个简单易用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请求:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3dlbjI1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

图1-- Jetty执行原理图

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

下面是我调试时的截图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3dlbjI1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

图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实现的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3dlbjI1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

这是我用本地的浏览器连接測试的。能够看出一些连接相关的參数。

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3dlbjI1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

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

版权声明:本文博主原创文章,博客,未经同意不得转载。

剖析Jetty实现原理的更多相关文章

  1. 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结

    老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结   本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...

  2. 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例

    老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...

  3. 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列

    老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列   事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...

  4. 老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串

    老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...

  5. 老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

    老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件   从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...

  6. 老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类

    老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类   每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...

  7. 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串

    老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串   从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...

  8. 老李推荐:第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles

    老李推荐:第5章7节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles   poptest是国内唯一一家培养测试开 ...

  9. 老李推荐:第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源

    老李推荐:第5章6节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 初始化事件源   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试 ...

随机推荐

  1. HDU2516-取石子游戏

    取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  2. SVN命令汇总

    1.将文件checkout到本地文件夹  svn checkout path(path是server上的文件夹)  比如:svn checkout svn://192.168.1.1/pro/doma ...

  3. 开源 自由 java CMS - FreeCMS2.0 举APP产生信息数据

    项目地址:http://www.freeteam.cn/ 生成信息数据 生成当前管理网站下同意移动APP訪问的栏目的信息页面. 从左側管理菜单点击生成信息数据进入. 您能够选择须要生成的栏目,然后点击 ...

  4. javascript于&quot;return obj === void 0&quot;这样的书面理由和优势

    得知underscore.js什么时候,查看源代码经常出现的类别似下面的代码: if (context === void 0) return func; if (array == null) retu ...

  5. FreeBSD包管理

    FreeBSD软件没有安装Ubuntu的apt-get.它也不是Gentoo的portage.有三种方式: package ports 自主进行源代码编译安装 这里简介前两种. FreeBSD 6.0 ...

  6. JTextArea Demo

    在往JTextArea中填充数据时,JTextArea上的滚动条也可以拖动.解决办法:主线程放在EDT中,fill JTextArea的操作放在另外一个线程中,这样fill操作与GUI上的操作就分离了 ...

  7. 正确lua简单的扩展,可以加速相关C++数据。

    很早的时候,我有一件事纠结.如果,我在这里C++打开界面脚本.使用C++其中一个目标,和.我的程序有很多不同的lua虚拟机.每个虚拟机与一个关联C++对象,它是多线程,那么如何快速应利用这个好时机lu ...

  8. 于linux已安装moodle

    本文介绍了两个虚拟机的安装linux server 及相关服务,随着后这些基础.安装应用程序服务 moodle 2.7+  它是使用最广泛的平台,网络课程. 在安装过程中moodle之前,需要支持软件 ...

  9. 中文乱码?不,是 HTML 实体编码!(转)

    在 如何用 Nodejs 分析一个简单页面 一文中,我们爬取了博客园首页的 20 篇文章标题,输出部分拼接了一个字符串: var $ = cheerio.load(sres.text); var an ...

  10. 解决 Error:No suitable device found: no device found for connection &quot;System eth0&quot;

    一.底 我们安装在虚拟机,.想模拟几台server.这时就想直接复制已经有的安装好的虚拟机.这样比較省事,不要在反复的安装虚拟机并配置JAVA环境,省掉做相同的事情,这时直接复制,这样之前配置的JAV ...