概述
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,线程上下文加载器去加载自定义类。
最后
以上就是魁梧薯片为你收集整理的Tomcat关键组件介绍的全部内容,希望文章能够帮你解决Tomcat关键组件介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复