tomcat架构分析(概览)

本文深入剖析Tomcat服务器的核心架构,包括Server、Service、Engine、Host和Context等关键组件及其层级关系,阐述了Tomcat如何通过模块化设计实现高度可扩展性。
出处:http://gearever.iteye.com  

Tomcat是目前应用比较多的servlet容器。关于tomcat本身的特点及介绍,网上已经有很多描述了,这里不再赘述。Tomcat除了 能够支撑通常的web  app外,其本身高度模块化的架构体系,也能带来最大限度的可扩展性。目前tomcat版本已经衍生到tomcat7,但是主流的版本还是 tomcat6。此系列架构体系介绍还是以tomcat6为蓝本。 
Tomcat是有一系列逻辑模块组织而成,这些模块主要包括: 
  • 核心架构模块,例如Server,Service,engine,host和context及wrapper等
  • 网络接口模块connector
  • log模块
  • session管理模块
  • jasper模块
  • naming模块
  • JMX模块
  • 权限控制模块
  • ……

这些模块会在相关的文档里逐一描述,本篇文档以介绍核心架构模块为主。 

核心架构模块说明  
核心架构模块之间是层层包含关系。例如可以说Service是Server的子组件,Server是Service的父组件。在server.xml已经非常清晰的定义了这些组件之间的关系及配置。 
需要强调的是Service中配置了实际工作的Engine,同时配置了用来处理时间业务的线程组Executor(如果没有配置则用系统默认的WorkThread模式的线程组),以及处理网络socket的相关组件connector。详细情况如图所示。 
 
图中,1:n代表一对多的关系;1:1代表一对一的关系。 

StandEngine, StandHost, StandContext及StandWrapper是容器,他们之间有互相的包含关系。例如,StandEngine是StandHost的父容 器,StandHost是StandEngine的子容器。在StandService内还包含一个Executor及Connector。 
1) Executor是线程池,它的具体实现是java的concurrent包实现的executor,这个不是必须的,如果没有配置,则使用自写的worker thread线程池 
2) Connector是网络socket相关接口模块,它包含两个对象,ProtocolHandler及Adapter 
  • ProtocolHandler是接收socket请求,并将其解析成HTTP请求对象,可以配置成nio模式或者传统io模式
  • Adapter是处理HTTP请求对象,它就是从StandEngine的valve一直调用到StandWrapper的valve

分层建模  
对于上述的各个逻辑模块,理解起来可能比较抽象。其实一个服务器无非是接受HTTP request,然后处理请求,产生HTTP response通过原有连接返回给客户端(浏览器)。那为什么会整出这么多的模块进行处理,这些模块是不是有些多余。 
其实这些模块各司其职,我们从底层wrapper开始讲解,一直上溯到顶层的server。这样易于理解。通过这些描述,会发现这正是 tomcat架构的高度模块化的体现。这些细分的模块,使得tomcat非常健壮,通过一些配置和模块定制化,可以很大限度的扩展tomcat。 
首先,我们以一个典型的页面访问为例,假设访问的URL是 
引用
http://www.mydomain.com/app/index.html

详细情况如图所示。 
 
  • Wrapper封装了具体的访问资源,例如 index.html
  • Context 封装了各个wrapper资源的集合,例如 app
  • Host 封装了各个context资源的集合,例如 www.mydomain.com

按照领域模型,这个典型的URL访问,可以解析出三层领域对象,他们之间互有隶属关系。这是最基本的建模。从上面的分析可以看出,从 wrapper到host是层层递进,层层组合。那么host 资源的集合是什么呢,就是上面所说的engine。 如果说以上的三个容器可以看成是物理模型的封装,那么engine可以看成是一种逻辑的封装。 

好了,有了这一整套engine的支持,我们已经可以完成从engine到host到context再到某个特定wrapper的定位,然后进行 业务逻辑的处理了(关于怎么处理业务逻辑,会在之后的blog中讲述)。就好比,一个酒店已经完成了各个客房等硬件设施的建设与装修,接下来就是前台接待 工作了。 

先说线程池,这是典型的线程池的应用。首先从线程池中取出一个可用线程(如果有的话),来处理请求,这个组件就是connector。它就像酒店 的前台服务员登记客人信息办理入住一样,主要完成了HTTP消息的解析,根据tomcat内部的mapping规则,完成从engine到host到 context再到某个特定wrapper的定位,进行业务处理,然后将返回结果返回。之后,此次处理结束,线程重新回到线程池中,为下一次请求提供服 务。 

如果线程池中没有空闲线程可用,则请求被阻塞,一直等待有空闲线程进行处理,直至阻塞超时。线程池的实现有executor及worker thread两种。缺省的是worker thread 模式。 

至此,可以说一个酒店有了前台接待,有了房间等硬件设施,就可以开始正式运营了。那么把engine,处理线程池,connector封装在一起,形成了一个完整独立的处理单元,这就是service,就好比某个独立的酒店。 

通常,我们经常看见某某集团旗下酒店。也就是说,每个品牌有多个酒店同时运营。就好比tomcat中有多个service在独自运行。那么这多个service的集合就是server,就好比是酒店所属的集团。 

作用域  
那为什么要按层次分别封装一个对象呢?这主要是为了方便统一管理。类似命名空间的概念,在不同层次的配置,其作用域不一样。以tomcat自带的打印request与response消息的RequestDumperValve为例。这个valve的类路径是: 

引用
org.apache.catalina.valves.RequestDumperValve


valve机制是tomcat非常重要的处理逻辑的机制,会在相关文档里专门描述。 如果这个valve配置在server.xml的节点下,则其只打印出访问这个app(my)的request与response消息。 

Xml代码   收藏代码
  1. <Host name="localhost" appBase="webapps"  
  2.           unpackWARs="true" autoDeploy="true"  
  3.           xmlValidation="false" xmlNamespaceAware="false">  
  4.              <Context path="/my" docBase=" /usr/local/tomcat/backup/my" >  
  5.                    <Valve className="org.apache.catalina.valves.RequestDumperValve"/>  
  6.              </Context>  
  7.              <Context path="/my2" docBase=" /usr/local/tomcat/backup/my" >  
  8.              </Context>  
  9.   </Host>  

如果这个valve配置在server.xml的节点下,则其可以打印出访问这个host下两个app的request与response消息。 
Xml代码   收藏代码
  1. <Host name="localhost" appBase="webapps"  
  2.                 unpackWARs="true" autoDeploy="true"  
  3.                 xmlValidation="false" xmlNamespaceAware="false">  
  4.                     <Valve className="org.apache.catalina.valves.RequestDumperValve"/>  
  5.                     <Context path="/my" docBase=" /usr/local/tomcat/backup/my" >  
  6.                     </Context>  
  7.                     <Context path="/my2" docBase=" /usr/local/tomcat/backup/my" >   
  8.                     </Context>  
  9.   </Host>  


在这里贴一个缺省的server.xml的配置,通过这些配置可以加深对tomcat核心架构分层模块的理解,关于tomcat的配置,在相关的文档里另行说明。为了篇幅,我把里面的注释给删了。 
Xml代码   收藏代码
  1. <Server port="8005" shutdown="SHUTDOWN">  
  2.          <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />  
  3.          <Listener className="org.apache.catalina.core.JasperListener" />   
  4.          <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />  
  5.          <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />  
  6.          <GlobalNamingResources>  
  7.               <Resource name="UserDatabase" auth="Container"  
  8.                       type="org.apache.catalina.UserDatabase"  
  9.                      description="User database that can be updated and saved"  
  10.                      factory="org.apache.catalina.users.MemoryUserDatabaseFactory"  
  11.                      pathname="conf/tomcat-users.xml" />   
  12.           </GlobalNamingResources>  
  13.           <Service name="Catalina">  
  14.                <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"   
  15.                      maxThreads="150" minSpareThreads="4"/>  
  16.                <Connector port="80" protocol="HTTP/1.1"   
  17.                      connectionTimeout="20000"   
  18.                      redirectPort="7443" />  
  19.                <Connector port="7009" protocol="AJP/1.3" redirectPort="7443" />  
  20.                <Engine name="Catalina" defaultHost="localhost">  
  21.                     <Realm className="org.apache.catalina.realm.UserDatabaseRealm"  
  22.                            resourceName="UserDatabase"/>  
  23.                     <Host name="localhost" appBase="webapps"  
  24.                            unpackWARs="true" autoDeploy="true"  
  25.                            xmlValidation="false" xmlNamespaceAware="false">  
  26.                            <Context path="/my" docBase="/usr/local/tomcat/backup/my" >  
  27.                            </Context>   
  28.                     </Host>   
  29.                 </Engine>  
  30.             </Service>  
  31.   </Server>  

至此,头脑中应该有tomcat整体架构的概念。有时间在写些其他模块的东西。
内容概要:本文详细介绍了一种基于Simulink的表贴式永磁同步电机(SPMSM)有限控制集模型预测电流控制(FCS-MPCC)仿真系统。通过构建PMSM数学模型、坐标变换、MPC控制器、SVPWM调制等模块,实现了对电机定子电流的高精度跟踪控制,具备快速动态响应和低稳态误差的特点。文中提供了完整的仿真建模步骤、关键参数设置、核心MATLAB函数代码及仿真结果分析,涵盖转速、电流、转矩和三相电流波形,验证了MPC控制策略在动态性能、稳态精度和抗负载扰动方面的优越性,并提出了参数自整定、加权代价函数、模型预测转矩控制和弱磁扩速等优化方向。; 适合人群:自动化、电气工程及其相关专业本科生、研究生,以及从事电机控制算法研究与仿真的工程技术人员;具备一定的电机原理、自动控制理论和Simulink仿真基础者更佳; 使用场景及目标:①用于永磁同步电机模型预测控制的教学演示、课程设计或毕业设计项目;②作为电机先进控制算法(如MPC、MPTC)的仿真验证平台;③支撑科研中对控制性能优化(如动态响应、抗干扰能力)的研究需求; 阅读建议:建议读者结合Simulink环境动手搭建模型,深入理解各模块间的信号流向与控制逻辑,重点掌握预测模型构建、代价函数设计与开关状态选择机制,并可通过修改电机参数或控制策略进行拓展实验,以增强实践与创新能力。
根据原作 https://pan.quark.cn/s/23d6270309e5 的源码改编 湖北省黄石市2021年中考数学试卷所包含的知识点广泛涉及了中学数学的基础领域,涵盖了实数、科学记数法、分式方程、几何体的三视图、立体几何、概率统计以及代数方程等个方面。 接下来将对每道试题所关联的知识点进行深入剖析:1. 实数与倒数的定义:该题目旨在检验学生对倒数概念的掌握程度,即一个数a的倒数表达为1/a,因此-7的倒数可表示为-1/7。 2. 科学记数法的运用:科学记数法是一种表示极大或极小数字的方法,其形式为a×10^n,其中1≤|a|<10,n为整数。 此题要求学生运用科学记数法表示一个天文单位的距离,将1.4960亿千米转换为1.4960×10^8千米。 3. 分式方程的求解方法:考察学生解决包含分母的方程的能力,题目要求找出满足方程3/(2x-1)=1的x值,需通过消除分母的方式转化为整式方程进行解答。 4. 三视图的辨认:该题目测试学生对于几何体三视图(主视图、左视图、俯视图)的认识,需要识别出具有两个相同视图而另一个不同的几何体。 5. 立体几何与表面积的计算:题目要求学生计算由直角三角形旋转形成的圆锥的表面积,要求学生对圆锥的底面积和侧面积公式有所了解并加以运用。 6. 统计学的基础概念:题目涉及众数、平均数、极差和中位数的定义,要求学生根据提供的数据信息选择恰当的统计量。 7. 方程的整数解求解:考察学生在实际问题中进行数学建模的能力,通过建立方程来计算在特定条件下帐篷的搭建方案数量。 8. 三角学的实际应用:题目通过在直角三角形中运用三角函数来求解特定线段的长度。 利用正弦定理求解AD的长度是解答该问题的关键。 9. 几何变换的应用:题目要求学生运用三角板的旋转来求解特定点的...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值