Tomcat源码分析(一)------ 架构

废话少说,拉代码,导入eclipse开干,具体步骤可以参考http://hi.baidu.com/hateeyes/blog/item/7f44942a20ad8f9d023bf66d.html

下面谈谈我对Tomcat架构的理解

总体架构:

  • 面向组件架构
  • 基于JMX
  • 事件侦听

1)面向组件架构

tomcat代码看似很庞大,但从结构上看却很清晰和简单,它主要由一堆组件组成,如Server、Service、Connector等,并基于JMX管理这些组件,另外实现以上接口的组件也实现了代表生存期的接口Lifecycle,使其组件履行固定的生存期,在其整个生存期的过程中通过事件侦听LifecycleEvent实现扩展。Tomcat的核心类图如下所示:

Catalina:与开始/关闭shell脚本交互的主类,因此如果要研究启动和关闭的过程,就从这个类开始看起。

Server:是整个Tomcat组件的容器,包含一个或多个Service。

Service:Service是包含Connector和Container的集合,Service用适当的Connector接收用户的请求,再发给相应的Container来处理。

Connector:实现某一协议的连接器,如默认的有实现HTTP、HTTPS、AJP协议的。

Container:可以理解为处理某类型请求的容器,处理的方式一般为把处理请求的处理器包装为Valve对象,并按一定顺序放入类型为Pipeline的管道里。Container有多种子类型:Engine、Host、Context和Wrapper,这几种子类型Container依次包含,处理不同粒度的请求。另外Container里包含一些基础服务,如Loader、Manager和Realm。

Engine:Engine包含Host和Context,接到请求后仍给相应的Host在相应的Context里处理。

Host:就是我们所理解的虚拟主机。

Context:就是我们所部属的具体Web应用的上下文,每个请求都在是相应的上下文里处理的。

Wrapper:Wrapper是针对每个Servlet的Container,每个Servlet都有相应的Wrapper来管理。

可以看出Server、Service、Connector、Container、Engine、Host、Context和Wrapper这些核心组件的作用范围是逐层递减,并逐层包含。

下面就是些被Container所用的基础组件:

Loader:是被Container用来载入各种所需的Class。

Manager:是被Container用来管理Session池。

Realm:是用来处理安全里授权与认证。

分析完核心类后,再看看Tomcat启动的过程,Tomcat启动的时序图如下所示:

 

从上图可以看出,Tomcat启动分为init和start两个过程,核心组件都实现了Lifecycle接口,都需实现start方法,因此在start过程中就是从Server开始逐层调用子组件的start过程。

2)基于JMX

Tomcat会为每个组件进行注册过程,通过Registry管理起来,而Registry是基于JMX来实现的,因此在看组件的init和start过程实际上就是初始化MBean和触发MBean的start方法,会大量看到形如:

Registry.getRegistry(null, null).invoke(mbeans, "init", false);

Registry.getRegistry(null, null).invoke(mbeans, "start", false);

这样的代码,这实际上就是通过JMX管理各种组件的行为和生命期。

3)事件侦听

各个组件在其生命期中会有各种各样行为,而这些行为都有触发相应的事件,Tomcat就是通过侦听这些时间达到对这些行为进行扩展的目的。在看组件的init和start过程中会看到大量如:

lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);这样的代码,这就是对某一类型事件的触发,如果你想在其中加入自己的行为,就只用注册相应类型的事件即可。

  • 26
    点赞
  • 228
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
### 回答1: 您好,如果您使用的是Maven构建项目,并且在pom.xml文件中使用了tomcat7-maven-plugin插件,但是该插件在IDE中报红,可能是因为您的IDE没有正确识别该插件。 您可以尝试更新您的IDE或者手动添加该插件的依赖,以解决该问题。同时,您也可以检查一下您的pom.xml文件中是否正确配置了该插件的版本号和其他相关信息。 ### 回答2: tomcat7-maven-plugin报红可能是因为以下几个原因: 1. 依赖错误:检查项目的pom.xml文件中是否正确配置了tomcat7-maven-plugin插件的依赖。确认依赖的版本是否与当前项目的Tomcat版本相匹配。 2. 版本冲突:如果项目中使用了其他插件或库,可能会导致与tomcat7-maven-plugin存在版本冲突。解决方法是排除冲突的插件或库,或者尝试使用不同的版本。 3. 插件配置错误:检查项目的pom.xml文件中是否正确配置了tomcat7-maven-plugin插件的属性。确保插件的配置正确并与项目的目录结构匹配。 4. Tomcat安装问题:如果您已经正确配置了插件但仍然遇到问题,可能是Tomcat安装或配置有问题。尝试重新安装或配置Tomcat,并确保Tomcat实例正在正确运行。 如果您仍然无法解决问题,建议查看插件的文档或官方网站,寻求更详细的解决方案。您还可以在相关的开发者社区或论坛上提问,寻求其他开发人员的帮助和建议。 ### 回答3: 当Tomcat7-maven-plugin报红时,可能是由于以下几种原因导致的。 首先,可能是因为Tomcat7-maven-plugin版本与Maven版本不兼容。要解决这个问题,可以尝试升级Tomcat7-maven-plugin版本,或者回退到一个与Maven版本兼容的Tomcat插件。 另外,报红可能是由于项目的依赖冲突引起的。当项目中使用了多个依赖且这些依赖中包含了相同的类时,就会出现依赖冲突。解决方案是检查项目的依赖,移除冲突的依赖或调整版本。 还有一种可能是由于项目POM文件中Tomcat7-maven-plugin的配置有误导致的。可以检查POM文件中的插件配置是否正确,特别是是否设置了正确的Tomcat版本和路径。 另外,报红可能是由于没有正确配置插件仓库导致的。可以检查Maven的settings.xml文件,确保插件仓库的配置正确,可以尝试切换到其他的插件仓库进行测试。 最后,报红可能是由于网络问题导致的。可以尝试检查网络连接是否正常,或者尝试使用代理进行网络访问。 总结来说,要解决Tomcat7-maven-plugin报红问题,可以尝试升级或回退插件版本、解决依赖冲突、检查插件配置是否正确、检查插件仓库配置是否正确、检查网络连接是否正常等方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值