互联网架构-Tomcat8深度源码分析-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实现处理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值