Tomcat源码解析

下载和部署源码:

GitHub地址:https://github.com/oliver-csu/tomcat/tree/8.5.x

ant地址:http://ant.apache.org/

配置环境变量:

ANT_HOME=apache-ant-1.9.8
PATH=%ANT_HOME%\bin
ClassPath=%ANT_HOME%\lib

下载依赖并打包:

1.ant下载依赖并打包;

2.将~/tomcat-build-libs加到idea的classpath中;

3.idea启动的时候增加环境变量参数:-Dcatalina.home=”./output/build” -Duser.language=en。

启动入口类:Bootstrap

启动大致流程:

1.Bootstrap -> Catalina -> Server -> Service

2.Engine -> Executor -> MapperListener -> Connector

3.CoyoteAdapter -> ProtocolHandler

Tomcat顶层结构:

![image-20201113133131241](2020-11-12 07-Tomcat源码解析.assets/image-20201113133131241.png)

  • Server:服务器,代表整个Tomcat服务器,一个Tomcat只有一个Server;
  • Service:Server中的一个逻辑功能层, 一个Server可以包含多个Service;
  • Connector:连接器,是Service的核心组件之一,一个Service可以有多个Connector,主要是处理客户端的连接请求;
  • Container:Service的另一个核心组件,按照层级有Engine,Host,Context,Wrapper四种,一个Service只有一个Engine,其主要作用是执行业务逻辑;
  • Jasper:JSP引擎;
  • Naming:命名服务;
  • Session:会话管理;
  • Loggin:日志相关;
  • Java EL:EL表达式相关。
Server:

Server是Tomcat最顶层的容器,代表着整个服务器。

Tomcat中其标准实现:org.apache.catalina.core.StandardServer

StandardServer继承结构类图:

![image-20201113141651697](2020-11-12 07-Tomcat源码解析.assets/image-20201113141651697.png)

除了实现Server接口还需要继承Lifecycle,这样做的好处:生命周期统一接口Lifecycle把所有的启动、停止、关闭等都放在一起统一管理,更加方便。

Service:

一个Tomcat可以包含多个Service,其标准实现:org.apache.catalina.core.StandardServic。

StandardService继承结构类图:

![image-20201113141953092](2020-11-12 07-Tomcat源码解析.assets/image-20201113141953092.png)

除了实现Server接口还需要继承Lifecycle,这样做的好处:生命周期统一接口Lifecycle把所有的启动、停止、关闭等都放在一起统一管理,更加方便。

Service拓展出Tomcat原型:

Service中请求监听和请求处理分开为两个模块:

  • Connector负责处理请求监听;
  • Container负责处理请求处理。

![image-20201113184639627](2020-11-12 07-Tomcat源码解析.assets/image-20201113184639627.png)

一个Service可以有多个Connector,但只能有一个Container。

任何容器都有启动start()和关闭stop()方法。

Connector解析:

Connector是使用ProtocolHandler来处理请求的。

![image-20201113185120213](2020-11-12 07-Tomcat源码解析.assets/image-20201113185120213.png)

ProtocolHandler由包含了三个部件:

  • Endpoint
  • Processor
  • Adapter

Endpoint用来处理底层Socket的网络连接。

Processor用于将Endpoint接收到的Socket封装成Request。

Adapter充当适配器,用于将Request转换为ServletRequest交给Container进行具体的处理。

Container解析:

![image-20201113191650313](2020-11-12 07-Tomcat源码解析.assets/image-20201113191650313.png)

  • Engine:引擎、只有一个,Tomcat的示例配置中定义了一个名为Catalina的Engine。

  • Host:站点、虚拟主机。一个Engine包含多个Host的设计使得一个服务器实例可以承担多个域名的服务,是很灵活的设计。

  • Context:一个应用,默认配置下webapps下的每个目录都是一个应用;

  • Wrapper:一个Servlet。

Tomcat启动流程:

![image-20201113191735730](2020-11-12 07-Tomcat源码解析.assets/image-20201113191735730.png)

启动的两大核心流程:

  • init流程:分别在Bootstrap、Catalina、StandardServer、StandardService的init方法;

  • start流程:分别在Bootstrap、Catalina、StandardServer、StandardService 的start方法。

Lifecycle与模板方法模式:

模板方法就是为多种类似业务提供一个算法执行的统一框架,把这些业务中共同的部分抽取出来进行具体实现,而某些业务中特定的需求推迟到子类中进行重写实现。

案例:

Tomcat的启动过程中Catalina调用StandardService中的start()方法,但是StandardService自身没有start()方法。

分析:

StandardService继承了抽象类LifecycleBase,它有start()并且它在此方法中调用了一个未实现的抽象方法startInternal(),Catalina调用StandardService中的start()最后会调用至startInternal()。

优点:

这种模式使得StandardService等这些类抽出一个共同的start()在LifecycleBase中进行实现(方便统一生命周期管理),如果它需进行特殊的业务处理的话可以在startInternal()中处理。