Tomcat从看源码到跑路

Tomcat 从入门到跑路,大师兄,妖怪被师傅抓走了。。。

Tomcat 关键名词

Service

  • 将 Connector、Container 作为一个整体,Connector 负责对外进行交流,Container 负责处理请求。
  • 一个 Service 可以设置多个 Connector,但是只能有一个 Container容器。
  • 所有组件的生命周期在一个 Lifecycle 的接口中控制。
  • Tomcat 中 Service 接口的标准实现类是 StandardService,它不仅实现了 Service 接口,同时还实现了 Lifecycle 接口,这样就可以控制下面组件的生命周期了。

Server

  • 提供一个接口让其他程序能够访问这个 Service 集合。
  • 同时维护它所包含的所有 Service 的生命周期。
  • Service 和 Server 是相互关联的。

Lifecycle

  • 组件的生命周期都是通过 Lifecycle 接口来控制的,组件只要继承这个接口并实现其中的方法就可以统一被拥有它的组件控制了。
  • 如此一层层,直到最高层组件是 Server 控制,而控制 Server 的是 Startup,也就是启动和关闭 Tomcat。
  • 组件的声明周期由包含它的父组件控制,所以它的 Start 方法自然就是调用它下面的组件的 Start 方法,Stop 方法也是一样。

Connector

  • 负责接收浏览器发过来的 TCP 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据。
  • 然后产生一个线程来处理这个请求,并把产生的 Request 和 Response 对象传给处理这个请求的线程,处理这个请求的线程就是 Container 组件要做的事了。

Container

  • Container 是容器的父接口,所有子容器都必须实现这个接口,Container 容器的设计用的是典型的责任链设计模式。
  • Container 容器由4个容器组件构成,分别是 Engine、Host、Context 和 Wrapper,并且组件之间是依次是父子关系。

Engine

  • 一个 Engine 可以配置多个虚拟主机 Host,每个主机都有一个域名,当 Engine 获得一个请求时,会把这个请求发送到相应的 Host 上,Engine 有一个默认的虚拟主机,如果没有虚拟主机能够匹配这个请求,那就由这个默认的虚拟主机来进行处理请求;

Host

  • 代表一个 Virtual Host,每个虚拟主机都和某个网络域名相匹配。
  • 每个虚拟主机下面可以部署一个或者多个 web app,每个 web 对应一个 context,有一个 context path,当一个 host 获取请求时,就把该请求匹配到某个 context 上。

Context

  • 一个Conetext 对应一个 web application,一个 web 有一个或多个 Servlet 组成。
  • Context 在创建的时候将根据配置文件 CATALINA_HOME/conf/web.xml 和 WEBAPP_HOME/WEB-INF/web.xml 载入Servlet 类,当 Context 获取请求时,将在自己的映射表中寻找想匹配的 Servlet 类,如果找到,则执行该类,获得请求的回应,并返回。

Tomcat 处理请求

现在我们来模拟 Tomcat 处理一个 Http 请求的过程:

假设来自客户端的一个 URL 请求: http://localhost:8080/webgateway/index

容器总体设计

  • Context 可以定义在父容器 Host 中,Host 不是必需的。
  • 但是要运行 war 程序,就必须用到 Host,因为在 war 中必有 web.xml 文件,这个文件的解析就需要 Host。
  • 如果要有多个 Host 就要定义一个 top 容器 Engine。
  • Engine 没有父容器了,一个 Engine 代表一个完成的 Servlet 引擎。

源码导入

  • 首先下载源码包和程序包,并且都解压出来

  • 在源码文件夹中新建一个 catalina-home 文件夹,把程序内容复制到其中

  • 在源码文件夹中添加一个 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.5</artifactId>  
        <name>Tomcat8.5</name>  
        <version>8.5.30</version>  
    
        <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>org.apache.ant</groupId>  
                <artifactId>ant</artifactId>  
                <version>1.10.1</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</groupId>  
                <artifactId>org.eclipse.jdt.core</artifactId>  
                <version>3.13.0</version>  
            </dependency>  
        </dependencies>  
    
        <build>  
            <finalName>Tomcat8.5</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>  
    
    </project>  
  • 修改intellij 文件启动配置

    • 文件以 maven 项目导入
    • 配置如下:
    • 之后就可以完美启动。

参考链接:


文章作者: HoldDie
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 HoldDie !
评论
 上一篇
系统活动接口防刷 系统活动接口防刷
需求:小游戏接口签名验证,两个系统之间接口对接,能够做到活动防刷。 要点: 增加同一个用户的调用次数限制(比如说一天只可以玩三次) 限制同一个玩家的对接口的调用频率(同一用户在一定次数内每个10秒可以调用一次,超过一定次数,间隔时间翻倍)
2018-03-02
下一篇 
Tomcat+Servlet Tomcat+Servlet
一直在用 Tomcat ,一直感觉有些嘘嘘嘘! Tomcat 概念Connector 运行模式 BIO(Blocking I/O) 传统的 Java I/O,同步且阻塞IO。 NIO(Non-Blocking I/O) JDK1.4
2018-02-06
  目录