Tomcat架构解析 读书笔记 (1)

在这里插入图片描述

  • tomcat 的基本架构,下面是上图中一些实体的概念
组件名称说明
Server表示整个Servlet容器,在单个Tomcat进程中只有唯一一个Server实例
ServiceService 表示一个或者多个Connector集合,这些Connector共享一个Container处理请求,同一个Tomcat实例内包含任意多个Service实例,他们彼此独立
Connector连接器,用于监听并转化Socket请求,同时将读取的Socket请求交给Container处理,支持不同协议以及不同的I/O方式
ContainerContainer 表示执行用户请求并返回响应的对象,Tomcat中包括不同级别的容器:包括 Engine Host Context Wrapper
Engine表示整个Servlet引擎,作为最高级的容器对象,尽管Engine不是直接处理请求容器。是获取目标容器的入口
Host表示Servlet引擎中的虚拟机,与域名有关的
ContextContext作为一类容器,用于表示ServletContext,即表示一个独立的Web应用
WrapperWrapper作为一类容器,用于表示Web应用中定义的具体的Servlet
ExecutorTomcat组件间可以共享的线程池,由Service维护,同一个Service共享同一个线程池
Mapper维护容器映射信息,同时按照映射规则查找容器(比如Servlet规范查找)
MapperListener用于在容器组件状态发生变化时,注册或者取消对应容器映射信息
ProtocolHandler一个协议处理器,针对不同协议和I/O 提供不同实现,通常关联一个Endpoint:用于启动Socket的监听,还关联一个Processor用于按照指定协议读取数据
LifeCycle生命周期的抽象接口,每个组件都有类似的生命周期
BootStrap 和 CatalinaBootStrap作为应用服务器的启动入口。Catalina作为Shell程序,用于启动/停止服务器(PS:我也没弄懂书上的意思)

JVM 的endorsed standands Override Mechanism机制

  • 通过该机制,应用程序可以提供新版本的API 替换JVM默认实现
  • J2SE包含大量的拓展,这些拓展由JVM加载供所有程序使用 JAXP(解析xml的API).作为核心类库 (作为rt.jar)由BootStrap类加载器加载。因此即使应用程序提供新版本JAXP,也会使用jvm的老版本,该机制就是为了解决该问题
  • JVM 的默认的 Endoresd目录为 %JAVA_HOME%/lib/endorsed,复制到该目录下的Jar包,将优先于JVM中的类加载
  • 有的应用服务器也实现了该机制,如Tomcat 和 jBoss,都有相应配置
  • 不是所有的Java核心类都可以被覆盖,只有部分类可以被覆盖

Tomcat加载器

  • 隔离性:Web应用类库相互隔离,避免依赖库或者应用包相互影响,web采用不同的类加载器实现隔离
  • 灵活性:既然Web应用之间的类加载器相互独立,当我们只针对特定一个Web应用进行重新部署,web加载器会重新创建,如果只采用一个类加载器,是无法高效梳理类之间的关系,无法完整的移除特定Web应用的类文件
  • 性能:由于每个web应用有特定的类加载器,那么加载类的时候,只会搜索特定web应用包含的jar文件
Tomcat类加载器的层级

在这里插入图片描述

Tomcat提供了三个基础类加载器和应用类加载器,具体配置在catalina.properties中,默认情况下 Common/Catalina/Shared为同一个类加载器

  • Common:以System为父类加载器,是位于Tomcat应用服务器顶层的公用类加载器。其路径为common.loader 默认为$CATALINA_HOME/lib
  • Catalina:以Common为父加载器,用于加载Tomcat应用服务器的类加载器,默认为空,此时Tomcat使用Common加载器加载应用服务器
  • Shared: 以Common为父加载器,是所有Web应用的父加载器,默认为空,此时Tomcat使用Common加载器作为Web应用的父加载器
  • Web应用:以Shared为父加载器,加载/WEB-INF/classes目录下的未压缩的Class和资源文件以及/WEB-INF/lib下的Jar包。该类加载器只对当前Web应用可见,对其他Web应用均不可见
应用类加载顺序

Tomcat提供delegate属性用于控制是否启用Java委派属性,默认为false(不启用),加载顺序如下:

1) 从缓存中加载
2) 如果没有,则从JVM的BootStrap类加载器加载
3) 如果没有, 则从当前类加载器(即web应用加载器)加载(按照/WEB-INF/classes、/WEB-INF/lib顺序)
4) 如果没有, 则从父类加载器加载,由于父类加载器采用默认的委派模式,所以加载顺序为 system -> common ->shared

delegate为true,采用默认的Java加载委派机制,加载顺序如下:

1) 从缓存中加载
2) 如果没有,则从JVM的BootStrap类加载器加载
3) 如果没有, 则从父类加载器加载,由于父类加载器采用默认的委派模式,所以加载顺序为 system -> common ->shared
4) 如果没有, 则从当前类加载器(即web应用加载器)加载(按照/WEB-INF/classes、/WEB-INF/lib顺序)
  • 总结
    • Tomcat通过上述加载顺序机制,实现web应用中的Jar包覆盖服务器提供的Jar包。但是java核心类库(比如JAXP)由于加载顺序优先所以是无法被覆盖的
    • Servlet规范相关API禁止通过Web应用加载器加载,所以,Web应用中不能包含这些包,那么这些jar包,就只能通过Common(默认情况也是shared,catalina加载器加载),所以如果某个tomcat版本提供的Servlet实现版本不符合要求,我们无法再web应用中通过提供相应实现来覆盖
    • 针对上述两种情况,可以采用endorsed方式实现覆盖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值