Tomcat8源码解析
Tomcat总体架构
Connector:开启Socket并监听客户端请求,返回响应数据;
Container:负责具体的请求处理;一个Service负责维护多个Connector和一个Container,这样来自Connector的请求只能有它所属的Service维护的Container处理;
Engine:代表整个servlet引擎
Host:表示一个虚拟主机
Context:表示一个应用
wrapper:表示一个servlet
Tomcat源码搭建
- tomcat软件和源码文件下载链接:tomcat.apache.org/download-80…
- 创建一个tomcat目录文件夹,存放下载的文件,然后创建一个pom.xml文件。然后使用idea打开该tomcat目录即可。
- pom.xml文件如下
1 | java复制代码<?xml version="1.0" encoding="UTF-8"?> |
- 在idea设置如下图所示:
- 最后启动即可。启动成功访问路径:http://localhost:8080/
Tomcat源码分析
1.Tomcat初始化阶段
1 | java复制代码# 1.Bootstrap启动类的main方法 |
从上面的代码可以看出,tomcat的启动类入口是Bootstrap类的main方法。
可以看出这里有几个重要的步骤:
1.初始化Bootstrap,主要是反射创建catalina对象;初始化tomcat类加载器
2.调用Bootstrap的load方法,初始化tomcat相关组件,实际上是调用catalina的load方法。
- 执行的catalina.load()方法,接着源码跟踪分析
1 | java复制代码/** |
catalina.load方法,主要是做了2个重要的操作:
1.解析server.xml文件。
2.初始化Server。
- 执行的getServer().init()方法初始化Server,源码分析
1 | java复制代码# 1.LifecycleBase的init()方法 |
Server的初始化init()方法,会先调用父类LifecycleBase的init()方法,然后再调用子类Server的initInternal()方法
这个调用的模式:父类init—>子类initInternal,在后面的services,connector,engine初始化是一样的模式。
- services[i].init(),初始化services,源码分析
1 | java复制代码# 1.standardService的initInternal()方法 |
从services的初始化分析,可以得到services的初始化,会初始化engine和connector。(executor、mapperListener)
- engine.init(),初始化engine,源码分析
1 | java复制代码# 1.standardEngine的initInternal()方法 |
- connector.init(),初始化connector,源码分析
1 | java复制代码# 1.connector的initInternal()方法 |
从connector的初始化分析,可以得到connector的初始化,会初始化protocolHandler
- protocolHandler.init(),初始化protocolHandler,源码分析
1 | java复制代码# 1.AbstractProtocol的init()方法 |
从protocolHandler的初始化分析,可以得到protocolHandler的初始化,会初始化endpoint
- endpoint.init(),初始化endpoint,源码分析
1 | java复制代码# 1.AbstractEndpoint的init()方法 |
到此tomcat的初始化阶段就已经完成了。使用的是责任链模式,一步一步的初始化。
组件初始化的顺序:
Server–>Service–>Engine–>Connector–>ProtocolHandler–>Endpoint
可以看到,Host,Context,Wrapper还没有开始初始化。这些将在tomcat的start启动阶段初始化。
本文转载自: 掘金