之前写一个简单易用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. MVC常用特性

    MVC常用特性使用   简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将 ...

  2. SQL Server中的TempDB管理——TempDB基本知识(为什么需要版本存储区)

    原文:SQL Server中的TempDB管理--TempDB基本知识(为什么需要版本存储区) 参考资料来自: http://blogs.msdn.com/b/sqlserverstorageengi ...

  3. javascript基金会——鼠标事件,系统对话框,等等。

    1.鼠标事件 (1).onclick:用户点击鼠标左键,并且当焦点处于button准时,按用户Enter关键,发生onclick事件 (2).ondblclick:当用户双击鼠标左键.发生ondblc ...

  4. Windows下 C++ WT +VS2013配置

    引出 最近在学习使用C++,另外对建站有点兴趣,所以就找到了WT.对于WT的详细介绍,这里不讲,直接看官网就好. 此文为本人原创,转载请注明出处. 先丢出官网上的干货: WT官方网站: https:/ ...

  5. Oracle cloud control 12c 的启动与关闭

    Oracle cloud control 12c整个安装比較复杂,光是安装路径的选择,登录password,端口号等众多个配置不免让人眼花缭乱,目不暇接.本文描写叙述的是安装完成后怎样获取安装时设定的 ...

  6. [SignalR]注册路由

    原文:[SignalR]注册路由 1.注册SignalR路由 在Asp.Net中,若是SignalR 1.*版本,在Global.asax文件中定义如下: 在Asp.Net中,若是SignalR 2. ...

  7. PHP微信SDK——Zebra-Wechat

    Zebra-Wechat 微信SDK 眼下处于开发状态,眼下实现了下面功能: 接收微信server推送信息,对推送信息类型进行识别 微信APIclient封装(用户管理.用户组管理.客服管理.自己定义 ...

  8. 在.NET Fiddle有趣的沙盒代码

    在.NET Fiddle有趣的沙盒代码 笔者:Tony Patton | 托尼·巴顿译:PurpleEndurer,2014-11-18,第1版 C#和VB.NET开发者能够使用.NET Fiddle ...

  9. 【日报C在23】堆和栈的深入了解

    每日一C之堆与栈的深入理解        每天拾一个C语言贝壳,厚积薄发,积跬步以致千里.  今日贝壳:内存中堆与栈的深入理解.认识一个清晰地内存                          假 ...

  10. Ubuntu 14.04 LAMP搭建(Apache 2.47+MySQL 5.5+PHP5.5)

    原文:Ubuntu LAMP搭建 为了数据库课程设计,只好自己搭一个数据库系统,采用LAMP方式. 一.安装 1.安装Apache sudo apt-get install apache2 Apach ...