Tomcat关键组件介绍

Connector组件

在这里插入图片描述

Tomcat的Connector组件,通常被称为Coyote。

它包含了EndPoint,Processor,Adatper。

EndPoint:它是coyote通信端点,即通信监听的接口,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议。

Processor:协议处理接口,接收来自EndPoint的Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理,Processor是对应用层协议的抽象。

ProtocolHandler:EndPoint和Processor组件统称为ProtocolHandler。

Adapter:由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的Request类来封装请求。但是这个Request不是标准的ServletRequest,不能用Tomcat Request作为参数来调用容器。

Tomcat实例

在这里插入图片描述

Catalina是Server的管理类,它的load,start,stop分别用来管理整个服务器的生命周期。load负责解析server.xml文件创建Server并调用Server的init方法进行初始化。 start方法是启动Server,stop方法是停止Server。

Server就代表一个Tomcat。

Server中包含至少一个Service,用于具体提供服务。

Connector:负责连接相关,一个Service可以创建多个Connector,因为可以监听比如http和https。

Container:包含了Engine(Servlet引擎,用来管理多个虚拟站点), Host(host,不同host访问会到不同的根目录去,比如webapp),Context(一个host下可以有多个Context,即不同的应用,比如webapp),Wrapper(一个Servlet会被包装为一个Wrapper)等容器,统称为Container。

各组件是如何配置的

<Server>
    <Service>
        <Connector /> // 连接器,可以配置多个
        <Engine> // Servlet引擎,管理多个站点
            <Host> // 虚拟站点,比如www.baidu.com
            </Host>
        </Engine>
    </Service>
</Server>

平时我们访问ip:8080能到达对应的host,是因为Engine标签能够配置defaultHost属性,而且为localhost,所以请求会使用Host为localhost的来处理。

Context有三种配置方法:1.通过文件配置。2.将WAR应用直接放到Host目录下,Tomcat会自动找到并添加到Host中。3.将应用的文件夹放到Host目录下,Tomcat也会自动查找并添加到Host中。

Wrapper的配置就是我们在web.xml中配置的Servlet。

Tomcat源码

在这里插入图片描述

Lifecycle接口是Tomcat组件的生命周期接口

在这里插入图片描述

Tomcat是使用的Mapper实现根据URL找到对应的组件的.

Tomcat的类加载机制

JVM的双亲委派模型在Tomcat中为什么不适用?

比如两个应用,一个使用的类是3版本,一个使用的类是2版本.根据双亲委派机制,这个类的全限定名称一样,它应该只会被虚拟机加载一次.那么此时就无法做到不同应用使用不同的类版本.

Tomcat如何解决这个问题?

在这里插入图片描述

上图是Tomcat的类加载器,引导类加载器和扩展类加载器作用不变。

系统类加载器正常情况下加载的是CLASSPATH下的类,但是Tomcat的启动脚本并未使用该变量,而是加载tomcat启动的类.比如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定,位于CATALINA_HOME/bin下。

Common通用类加载器加载Tomcat及应用通用的一些类,位于CATALINA_HOME/lib下,如servlet-api.jar。

Catralina类加载器用于加载服务器内部可见类,这些类应用程序不能访问。

Shared ClassLoader用于加载应用程序共享类

Webapp ClassLoader,每个用用程序都会有一个独一无二的Webapp ClassLoader,他用来加载本应用程序/WEB-INF/classes和/WEB-INF/lib下的类

JasperLoader Jsp类加载器,加载JSP编译而成的class,会检查jsp是否被修改,文件修改了的话类加载器会被替换。

类加载顺序:WebApp ClassLoader的源码,loadClass方法首先会找到引导类加载器和扩展类加载器(保证java.lang等类的加载仍然是安全的),如果这两个都加载不到,则转为WebAppClassLoader加载,如果这个类还加载不到,则交给父类加载即Shared类加载器,而Shared类加载器是遵循双亲委派模型的。

Tomcat性能优化策略

  • 调整tomcat线程池

  • 禁用AJP连接器,AJP是tomcat和其他apache组件通信的,一般用不到。

  • 调整IO模式

由tomcat类加载机制关联到其他

SPI获取对象时,有以下代码

ServiceLoader.load(Driver.class)
Iterator<Driver> driversIterator = loadedDrivers.iterator();

try{
    while(driversIterator.hasNext()) {
        driversIterator.next();
    }
} catch(Throwable t) {
    // Do nothing
}
return null;

SPI库是在java.lang里,也就是说它们是由BootstrapClassLoader加载的,此时要在加载自定义类,根据双亲委派模型,它是无法加载的,所以指定了ThreadClassLoader,线程上下文加载器去加载自定义类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值