走近Tomcat(一)

本文主要以Tomcat8.0进行一个原理的讲解

8.0新特性:Tomcat支持Servlet3.1,JSP2.3EL3.0。9.0版本开始支持Servlet4.0,HTTP,AJP采用NIO。8.5开始移除了BIO支持,开始支持HTTP2,默认采用异步日志处理

tomcat整体架构:

一个server对应多个service(多个connector和一个engine),一个engine对应多个host,一个engine对应多个context,一个engine对应多个wrapper(servlet)

各个组件由start、stop等生命周期方法,用LifeCycle init初始化组件,start启动组件,stop停止组件,destroy销毁组件 该接口支持组件状态之间的转换,支持添加事件监听器用于监听组件的状态变化,例如启动分为启动前,启动中,启动后。

Tomcat定义了Pipeline管道和Valve阀两个接口,Pipeline用于构造责任链,Valve代表责任链上的每一个处理器,Pipeline维护了一个基础的Valve,它始终位于Pipeline的末端,即最后执行。

Connector组件:

connector中用ProtocolHandler表示协议处理器,其中包含EndPoint和Processor,endPoint启动socket监听,如Nio2EndPoint表示Nio非阻塞的Socket,processor用于读取数据交给容器处理。Mapper按照Servlet规范定义来组成映射规则查找容器,对应一个mapperListener实现了ContainerListener和LifecycleListen用于在组件状态发生改变时更新mapper的映射信息。Tomcat提供Bootstrap类作为应用程序入口创建Catalina实例(反射),通过执行参数调用Catalina相关方法完成针对应用服务器的操作,Catalina提供一个Shell程序,用于解析server.xml创建各个组件,同时负责启动停止容器

Tomcat类加载器

JVM默认提供3个类加载器,使用委派模式确保应用程序通过自身的类加载器System加载所有可见的JAVA类

  1. Bootstrap:用于加载JVM基础运行类,jre/lib目录下的核心类库
  2. Extension:加载jre/lib/ext目录下的类,JAVA使用该类加载器加载JVM默认提供但不是核心类库的jar,如JCE
  3. System类加载器通常用于加载应用程序jar包及其启动入口类

委派模式加载顺序:

  1. 从缓存中加载
  2. 从父类加载器中加载
  3. 从当前类中加载,没有则抛出异常

Tomcat类加载器

tomcat通常会自行创建类加载器以实现更灵活的空hi,Servlet规范要求每个Web应用有一个独立的类加载器实例

web应用库相互隔离,避免库或者包相互依赖。webApp之间的类加载器相互独立,那么我们就可以只针对一个Web应用进行重新部署,此时该WebApp的类加载器将会被重新创建;每个WebApp一个类加载器,一次在webApp在加载类时,不会搜索其他Web应用包含的jar包

  1. Common加载器:以System加载器为父类,用于加载应用服务器内部和web应用均可见的类,默认指向$Catalina_home/lib下的包
  2. Catalina加载器:以Common为父加载器,用于加载Tomcat应用服务器的类加载器
  3. Shared加载器:以Common为父加载器,是所有web应用的父类加载器
  4. webApp加载器:以Shared为父类加载器,加载WEB-INF/classes目录下的未压缩的Class和资源文件以及/WEB-INF/lib目录下的jar包,该类加载器支队当前webApp可见

webapp类加载器顺序:

  1. 从缓存中加载
  2. 从JVM的Bootstrap类加载
  3. 如果没有则从当前类加载器加载,按照classes和lib的顺序加载
  4. 如果没有,则从父类加载,由于父类采用委派模式,所以加载顺序为System,Common,Shared
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值