zoukankan      html  css  js  c++  java
  • 剖析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,可见标准化是多么重要。


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

  • 相关阅读:
    当梦想渐行渐远的时候
    android开发系列之aidl
    看到这页代码,我要疯了
    android开发系列之性能优化
    近期的一个项目反思与总结
    IOS中摇一摇实现截屏(可实现问题反馈的功能)
    IOS设计模式浅析之外观模式(Facade)
    IOS项目开发中的文件和文件夹操作
    XCode 4.6下XIB文件提示“...could not be opened..."的问题
    "Xcode"意外退出
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4806259.html
Copyright © 2011-2022 走看看