`
ss1
  • 浏览: 81400 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

《How Tomcat Works》读书笔记(四):容器初探

阅读更多

第四章:容器初探

接触JAVA EE以来,最初对“容器”一词满头雾水、无比崇拜,后来听到耳朵长茧,一直觉得这个词的定义有点太广了,很多情况下不管沾没沾点关系的都往上靠,力图通过 此术语使自己显得“专业”一些(老实说我写文档也这么做过)。但不论如何,发明这个计算机术语的人还是相当牛的,充分体现了JAVA EE“分层”的思想。

唯一不爽的是,一直以来都处于“容器”的黑盒之外,更加上那些大厂商对自己的JAVA EE“容器”产品的神乎其神的吹嘘宣传,一直没法想象外国那些鬼佬怎么就这么牛能做出这么厉害的东西,我们只有乖乖使用的份?还好有开源,还好有这本 《How Tomcat Works》,可以满足我的好奇心,一窥“容器”的奥秘

Tomcat的容器架构

我们一般都把tomcat、weblogic、websphere app server和JBOSS AS称为“J2EE容器”,是一种广义的说法;而这里的“容器”,指的是tomcat中的两大组件之一的“容器”,属于狭义的说法(另一种组件当然就是 Connector了)。

tomcat的容器架构,一直都没有太大变化,基本元素都是四个接口:

  • engine:表示一整个Catalina Servlet引擎
  • host:表示一个虚拟主机。什么是虚拟主机可以百度一下“tomcat 虚拟主机配置”
  • Context:表示一个web app应用,比如你做的一个网站
  • Wrapper:表示单个Servlet

以上四个基本元素由上至下逐渐细分,成树状结构,构成了tomcat容器结构的主体,它们都位于org.apache.catalina包

值得一提的是,这四个接口并不是同时必须的,例如,你完全可以做一个只有Wrapper的“迷你版”tomcat,这在一些资源受限的环境中,比如嵌入式系统很有用(说不定将来能放到手机里面跑,O(∩_∩)O哈哈~)

类图如下:

image

一般来说,容器里头都还有session管理、日志等功能,不过这一章暂时还不作讨论。

PipeLine & Valve

熟悉Servlet的人一定接触过Servlet filter,在Servlet处理请求之前,先会由filter“过滤”一下。tomcat内部同样也有类似的东西,那就是Valve——阀门。而所有 的Valve都是装在一个pipeline(管道)里头的,tomcat的开发者估计对水管工之类的活比较感兴趣。这些Valve的功能各异,你也可以自 己开发然后放到tomcat的配置文件里面。

那具体是如何工作的呢?首先 ,Connector调用容器的invoke方法,把Request给容器,容器再把Request对象给自身的pipeline:

public void invoke(Request request, Response response)
   throws IOException, ServletException {
   pipeline.invoke(request, response);

   ...
}

然后 ,在pipeline内部有个内部类ValveContext,它来管理所有的Valve。pipeline一般会调用ValveContext的invokeNext

public void invokeNext(Request request, Response response)

ValveContext又调用第N个Valve的invoke方法(N是一个计数器,记录调用到第几个Valve了),不过参数稍微有点不同

public void invoke(Request request, Response response,
   ValveContext ValveContext ) throws IOException, ServletException

它把自己作为参数传了进去给Valve,有什么用呢?其实很简单,看看Valve的invoke是怎么实现的

public void invoke(Request request, Response response,
   ValveContext valveContext) throws IOException, ServletException {
   // Pass the request and response on to the next valve in our pipeline
   valveContext.invokeNext(request, response);
   // now perform what this valve is supposed to do
     ...
}

秘密就在这里!Valve又回调 了ValveContext的invokeNext,这样就相当于递归一样,把全部Valve都调用一遍。

仔细推敲会发现,每个Valve都是先调用ValveContext的invokeNext,然后才做自己的工作,所以“第一个”被 pipeline调用的Valve,实际却是最后一个完成自己工作的,有点类似“压栈”操作,第一个Valve最先被压进去,却是最后一个从堆栈中弹出来 的。如果不信,可以做个试验,眼见为实。

修改BasicValve

每个pipeline默认会有一个basicvalve,做一些基本工作,比如把Request传递给下一级子容器,或者把Request交给 Servlet(Wrapper的basicvalve就是做这个的)。从pipeline的源码来看(书中的源码,未必是tomcat的源 码),basicvalve是最后一个被调用的。

if (subscript < valves.length) {        valves[subscript].invoke(request, response, this);
     }
     else if ((subscript == valves.length) && (basic != null)) {
       basic.invoke(request, response, this);
     }

以上是ValveContext.invokeNext方法的一部分,basic就是指BasicValve,很明显是最后一个被加进去的。

我们在basicvalve的invoke方法第一行增加一个简单的输出,运行之后就会发现,basicvalve的输出在其他Valve的前面,可见上面的推断是正确的!

关于Wrapper的疑问

这一章最后是两个简单的程序:第一个只有Wrapper容器,另一个则由两个Wrapper包含在一个Context容器里组成。Wrapper和 Context接口就不啰嗦了,在后续章节有专门的详细解说。但在这里,每个Wrapper对应一个Servlet,如果是个大项目,那里面的 Servlet起码有几十个,很难想像有那么多的Wrapper在同时跑,会不会导致性能低下呢?也许要看完这本书才能找到答案了

keep moving,坚持每周看一章~!

分享到:
评论

相关推荐

    Tomcat源码研究.pdf

    #### 1.14《How Tomcat Works》读书笔记(四):容器初探 - **容器概念**:Container是Tomcat中的核心组件之一,负责管理Web应用程序及其资源。 - **层级关系**:容器按照层次结构组织,包括Engine、Host、Context...

    mmexport1746490103849.jpg

    mmexport1746490103849.jpg

    scratch少儿编程逻辑思维游戏源码-纸片马里奥:撕裂现实 v0.0.8.zip

    scratch少儿编程逻辑思维游戏源码-纸片马里奥:撕裂现实 v0.0.8.zip

    scratch少儿编程逻辑思维游戏源码-小型杯头人游戏引擎.zip

    scratch少儿编程逻辑思维游戏源码-小型杯头人游戏引擎.zip

    基于S7-PLC和组态王组态的变频恒压供水系统:3泵三泵的梯形图程序及原理图

    内容概要:本文详细介绍了一种基于西门子S7-200和S7-300 PLC以及组态王软件的三泵变频恒压供水系统。主要内容涵盖IO分配、接线图原理图、梯形图程序编写和组态画面设计四个方面。通过合理的硬件配置和精确的编程逻辑,确保系统能够在不同负载情况下保持稳定的供水压力,同时实现节能和延长设备使用寿命的目标。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和组态软件使用的专业人士。 使用场景及目标:适用于需要稳定供水的各种场合,如住宅小区、工厂等。目标是通过优化控制系统,提升供水效率,减少能源消耗,并确保系统的可靠性和安全性。 其他说明:文中提供了详细的实例代码和调试技巧,帮助读者更好地理解和实施该项目。此外,还分享了一些实用的经验教训,有助于避免常见的错误和陷阱。

    拨叉831003加工工艺及钻φ22花键底孔夹具设计.rar

    拨叉831003加工工艺及钻φ22花键底孔夹具设计.rar

    scratch少儿编程逻辑思维游戏源码-像素冒险.zip

    scratch少儿编程逻辑思维游戏源码-像素冒险.zip

    三相交流调压技术:探究触发角变化与带中性线桥式半控整流电路仿真中的波形差异

    内容概要:本文深入探讨了单相和三相交流调压技术,详细介绍了这两种技术的工作原理、应用场景以及波形变化规律。首先,文章解释了单相交流调压的基本概念,即通过对单一相位的交流电进行触发角调整来实现电压调节。接着,重点讨论了三相交流调压的特点,特别是在带有中性线的情况下,它能提供更稳定的参考点并支持复杂的工业应用。此外,文中还涉及了桥式半控整流电路的仿真实验,展示了不同触发角和负载条件下的波形变化情况。最后,文章展望了未来交流调压技术面临的挑战和发展机遇。 适合人群:从事电力电子相关行业的技术人员、研究人员及高校师生。 使用场景及目标:帮助读者深入了解单相和三相交流调压技术的具体实现方式,掌握波形变化规律,提升实际操作能力。 其他说明:文章结合理论与实践,既包含了基础知识介绍又涵盖了最新的研究成果和技术趋势。

    实训商业源码-恐龙快跑游戏小程序 4.1.3-毕业设计.zip

    实训商业源码-恐龙快跑游戏小程序 4.1.3-毕业设计.zip

    scratch少儿编程逻辑思维游戏源码-闲暇礼物制作.zip

    scratch少儿编程逻辑思维游戏源码-闲暇礼物制作.zip

    实训商业源码- 深蓝健身房瑜伽馆行业小程序V4.15.0 前端+后端-毕业设计.zip

    实训商业源码- 深蓝健身房瑜伽馆行业小程序V4.15.0 前端+后端-毕业设计.zip

    基于python+YOLO的火灾视频监测算法+源码+项目文档(毕业设计&课程设计&项目开发)

    基于python+YOLO的火灾视频监测算法+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于python+YOLO的火灾视频监测算法+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python+YOLO的火灾视频监测算法+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于python+YOLO的火灾视频监测算法+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于python+YOLO的火灾视频监测算法+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于python+YOLO的火灾视频监测算法+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档

    实训商业源码-二次元带音乐404页面源码-毕业设计.zip

    实训商业源码-二次元带音乐404页面源码-毕业设计.zip

    【数字经济】大数据标注系统设计方案.pdf

    【数字经济】大数据标注系统设计方案

    scratch少儿编程逻辑思维游戏源码-粘粘世界物理.zip

    scratch少儿编程逻辑思维游戏源码-粘粘世界物理.zip

    少儿编程scratch项目源代码文件案例素材-自然.zip

    少儿编程scratch项目源代码文件案例素材-自然.zip

    scratch少儿编程逻辑思维游戏源码-物理引擎 V2.2.zip

    scratch少儿编程逻辑思维游戏源码-物理引擎 V2.2.zip

    ssm社区物业信息管理系统小程序(文档+源码)_kaic

    ssm社区物业信息管理系统小程序(文档+源码)_kaic

    JiYuTrainer

    反极域和远程机惨的好工具

    西门子SICAR标准模板程序案例详解:基于S7-1500 PLC的PN总线应用与TSL汽车项目实践

    内容概要:本文详细介绍了西门子SICAR标准模板在TSL汽车项目中的应用,涵盖模板的核心架构、PN总线配置、工艺参数管理、调试技巧以及环境避坑指南。SICAR模板采用了分层架构,将设备和工艺分离,确保代码的模块化和可复用性。文中还展示了具体的代码示例,如急停逻辑、Profinet动态配置、UDT参数管理和Trace调试方法。此外,文章强调了SICAR模板在提高代码可维护性和稳定性方面的价值。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉西门子PLC编程和Profinet通信的从业者。 使用场景及目标:适用于需要理解和应用SICAR模板进行工业控制系统开发的场景,帮助工程师掌握模板的核心设计理念和最佳实践,提升项目开发效率和代码质量。 其他说明:文章不仅提供了详细的代码示例,还分享了许多实用的经验和技巧,如如何处理第三方设备的GSD文件版本不兼容问题、如何利用Trace功能进行调试等。

Global site tag (gtag.js) - Google Analytics