057:Tomcat8底层架构模式
1 Tomcat8底层源码分析课程介绍
课程内容
1.Tomcat8启动方式有哪些
2.Tomcat底层是如何实现启动
3.idea如何导入Tomcat8源码实现断点调试
4.Tomcat8核心架构流程源码分析
2 Tomcat8基本的介绍
Tomcat8介绍
Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理。
主流Web服务器:tomat/jetty
Tomcat开源框架,属于Java语言编写web服务器
3 Tomcat8目录结构的介绍
Tomcat8目录
/bin:存放windows或Linux平台上启动和关闭Tomcat的脚本文件
/conf:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xml
/lib:存放Tomcat服务器以及所有web应用都可以访问的jar文件
/logs:存放Tomcat执行时的日志文件
/work:存放JSP编译后产生的class文件
/webapps:Tomcat的主要Web发布目录,默认情况下把Web应用文件放于此目录
4 Tomcat8四种部署的方式
Tomcat8四种部署项目方式
1.项目打war包直接放入到tomcat webapps目录下,里面每个文件夹相当于每个上下文目录,每个上下文对应不同的应用程序。
2.在conf/server.xml目录下 host节点下新增
docBase表示加载的内容地址 path 访问路径
3.conf\Catalina\localhost目录下创建 test2021.xml
注意不需要 path,默认是.xml文件名称
4.使用内嵌入Tomcat方式(SpringBoot底层原理实现)
5 使用jconsole连接tomcat内存
Jconcole远程连接Tomcat
Jconsole是jdk bin目录下java自带的调试工具。
选择Tomcat启动类 org.apache.catalina.startup.Bootstrap
配置tomcat多线程使用
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-mayikt"
maxThreads="150" minSpareThreads="50"/>
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" executor="tomcatThreadPool" />
maxThreads表示最多创建150个线程,minSpareThreads表示该Connector先创建50个线程等待客户请求,每个请求由一个线程负责
6 将tomcat8源码导入idea开发工具中
Tomcat8源码下载
将下载下来的源码压缩包解压,然后在解压后的目录中新建catalina-home目录和pom.xml文件,将跟目录中的conf和webapps文件夹移动到catalina-home目录中。
catalina-home目录下新建文件夹lib、logs、temp、work。
Pom文件新增
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.tomcat</groupId>
<artifactId>Tomcat8.0</artifactId>
<name>Tomcat8.0</name>
<version>8.0</version>
<build>
<finalName>Tomcat8.0</finalName>
<sourceDirectory>java</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
<resources>
<resource>
<directory>java</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>test</directory>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.5.1</version>
</dependency>
</dependencies>
</project>
直接idea open项目即可。
7 启动tomcat8源码项目
将源码导入到idea工程中 运行配置参数
Main class org.apache.catalina.startup.Bootstrap
Vm启动参数
-Dcatalina.home=D:\Workspaces\mayikt_5Phase\mayikt_tomcat_57\catalina-home
-Dcatalina.base=D:\Workspaces\mayikt_5Phase\mayikt_tomcat_57\catalina-home
-Djava.endorsed.dirs=D:\Workspaces\mayikt_5Phase\mayikt_tomcat_57\catalina-home/endorsed
-Djava.io.tmpdir=D:\Workspaces\mayikt_5Phase\mayikt_tomcat_57\catalina-home/temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
启动项目报错
test/util/TestCookieFilter找不到符号,直接删除该类
java.lang.ClassNotFoundException: websocket.drawboard.DrawboardContextListener 只需将/webapps/example 文件夹删除即可。
启动成功之后访问127.0.0.1:8080 报错
在org.apache.catalina.startup.ContextConfig类中手动将JSP解析器初始化
context.addServletContainerInitializer(new JasperInitializer(), null);
8 亲手画图分析Tomcat8架构
Tomcat底层架构原理流程图
Tomcat8架构模式
1.Server:代表整个tomcat服务器,Server管理整个tomcat所有组件,一个tomcat只有一个Server;
2.Service:表示Server服务处理的一个业务逻辑,一个Server可以包含多个Service;
3.Connector:连接器,Service的核心组件,监听Http请求并且封装请求与响应,一个Service可以有多个Connector;
4.Executor线程池
5.Container:Service的另一个核心组件,按照层级有Engine,Host,Context,Wrapper四种,一个Service只有一个Engine,其主要作用是执行业务逻辑;
6.Host:虚拟主机站点,Container分为多个Host,Host其实就是独立存放的webapps应用程序,每个host可以存在多个context上下文
7.Wrapper其实指的就是每个server类
9 总结Tomcat8架构设计思想
Tomat架构流程分析:
tomcat启动的时候,默认情况下会创建两个Connector监听端口号,分别是为Http协议Connector8080监听端口号和AJP协议Connector8009监听端口号。Http协议Connector8080监听到了Http请求之后会交给Container实现处理,Container处理完请求之后再交给Connector连接器封装响应的结果集返回给客户端。
AJP协议与Http协议区别:
Http协议是超文本传输协议;AJP协议端口号是内部之间通讯端口号可以实现tomcat集群。
客户端发送Http请求的时候,交给我们Server,一个Server可以存在多个Service,
请求会交给我们的Connector(连接器) ,采用Executor(线程池)处理请求,最终交给我们Container实现处理。