之前写一个简单易用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. therefore/so/hence/then/accordingly/Thus

    这几个词的区别大致可从以下几方面去看:1.therefore adv.因此, 所以=for that reason=consequently常用于连接两个并列分句,其前加“and”或分号“:”.He ...

  2. ignore,neglect,omit,overlook

    一:简介——ignore :通常指有意不顾,或不理显而易见的事物.neglect :侧重指有意的忽略或忽视,也可指粗心与疏忽.omit :指有意或无意地忘记做某事,也指删去被视作不重要.不合意的东西. ...

  3. OpenWrt wireless通过配置uci生效

    [转载请注明出处:钱正柱 http://blog.csdn.net/qianguozheng/article/details/24412673] 配置无线 vi /etc/config/wireles ...

  4. machine learn in python 第二章2.1.1

    1大约 sklearn.datasets from sklearn.datasets import load_iris import numpy as np data = load_iris() da ...

  5. 模拟Vue之数据驱动3

    一.前言 在"模拟Vue之数据驱动2"中,我们实现了个Observer构造函数,通过它可以达到监听已有数据data中的所有属性. 但,倘若我们想在某个对象中,新增某个属性呢? 如下 ...

  6. Java读书笔记三(字符串)

    1.介绍 本篇博客将对JAVA中的字符串类的基本知识进行介绍.主要字符串类的一些经常用法等内容. 2.字符串对象的创建 1.有两种形式.可是在开发中常常习惯于String 变量名的形式来进行操作. & ...

  7. 记一次tomcat故障排查(转)

    1~1024之间的端口号是保留端口,通常是为特定目的预留的.虽然你的问题不是由于保留端口引起的,但是仍然建议你不要随意使用保留端口作为自定义服务的端口,如果你能早早遵循这一规则压根就不会遇到这个问题. ...

  8. BZOJ 1823 JSOI 2010 盛宴 2-SAT

    标题效果:有着n材料的种类,m陪审团. 每种材料具有两种不同的方法.每个法官都有两个标准.做出来的每一个法官的菜必须至少满足一个需求. 问:是否有这样一个程序. 思考:2-SAT经典的内置图形问题.因 ...

  9. POJ 1252 Euro Efficiency

    背包 要么 BFS 意大利是说给你几个基本的货币,组成 1~100 所有货币,使用基本上的货币量以最小的. 出口 用法概率.和最大使用量. 能够BFS 有可能 . 只是记得数组开大点. 可能会出现 1 ...

  10. 拆分字段优化SQL

    拆分字段优化SQL 今天看到一条用函数处理连接的SQL,是群里某位网友的,SQL语句如下: SELECT SO_Order.fdate , SO_Order.fsn FROM so_order INN ...