1.1. 第二篇:Tomcat架构源码解析
1.1.1. Tomcat源码准备工作
Tomcat启动时序图。
生命周期Lifecycle接口。
由于所有的组件均存在初始化、启动、停止等生命周期方法.拥有生命周期管理的特性,所以Tomcat在设计的时候, 基于生命周期管埋抽象成了一个接口Lifecycle ,而组件Server、 Service. Container、 Executor、 Connector 组件,都实现了一个生命周期的接口,从而具有了以下生命周期中的核心方法:
1) init() :初始化组件
2) start() :启动组件
3) stop() :停止组件
4) destroy() : 销毁组件
Tomcat各个组件的默认实现
上面我们提到的sexver、Service、 Engine、 Host、 Context都是接口,下图中罗列了这些接口的默认实现类。 当前对于Endpoint组件来说,在Tomcat中没有对应的Endpoint接口,但是有一个抽象类AbstractEndpoint , 其下有三个实现类: NioEndpoint、Nio2Endpoint、AprEndpoint。
ProtocolHandler接口及其实现
1.2.2 Tomcat初始化源码解析
通过启动脚本的方式找入口,打开startup.bat文件,可以看到
根据代码内容打开 Catalina.bat 文件
找到启动类 org.apache.catalina.startup.Bootstrap
执行该类的main方法。
然后调用init方法,初始化Catalina对象。
执行load方法
底层通过反射的方式去执行Catalina的load方法。
执行Catalina类的load方法,解析server.xml配置文件,构建Server Service等对象,构建完成后,准备执行初始化的方法。
解析server.xml配置文件,构建StandardServer等对象。
构建对象
构建对象源码
1.1.3. Server初始化服务器解析
服务初始化源代码
此处使用的是模板方法设计模式
Server的;类图。
Server是Tomcat最顶层的容器,代表着整个服务器
Tomcat中其标准实现:org.apache.catalina.core.StandardServer类
StandardServer继承结构类图如上图:除了实现Server接口还需要继承Lifecycle
好处:生命周期统一接口Lifecycle把所有的启动、停止、关闭等都放在一起统一管理
1.1.4. Service初始化服务解析
启动执行service初始化操作。
Service的类图
Service:一个Tomcat包含多个Service
Tomcat中其标准实现:org.apache.catalina.core.StandardServic类
StandardService继承结构类图如上图:除了实现Service接口还需要继承Lifecycle
好处:生命周期统一接口Lifecycle把所有的启动、停止、关闭等都放在一起统一管理
1.1.5. Executor线程池与Connector连接器解析初始化
配置的线程池及其使用线程池。
使用线程池
使用JDK自带的jconsole工具查看线程信息。
Connector连接器的作用是监听8080端口,使用request和response处理请求。网络通信:
Connector(连接器),监听网络端口、接受网络连接请求、读取请求网络字节流。
根据具体应用层协议(HTTP/AJP)解析字节流,生成统一的Tomcat Request对象
将Tomcat Request对象转成标准的ServletRequest,调用Servlet容器,得到ServletResponse,将ServletResponse转成 Tomcat Response对象。将Tomcat Response对象转成网络字节流,将响应字节流写会服务器。
ProtocolHandler由包含了三个部件:Endpoint、Processor、 Adapter
Endpoint用来处理底层Socket的网络连接。
Processor用于将Endpoint接收到的Socket封装成Request。
Adapter充当适配器,用于将Request转换为ServletRequest交给Container进行具体的处理。
选择IO模型。
协议处理器初始化。
端点初始化
绑定IO模型
绑定NIO模型
1.1.6. Tomcat启动源码解析
当所有的组件全部初始化完成后,下面需要让所有的组件启动。
执行Catalina对象的start方法
Catalina启动
StandardServer启动。
StandardService的启动方法。
Connector连接器启动。
协议处理器启动。
端点启动。
具体的IO模型启动。
NioEndpoint的启动方法中,创建线程去接收和处理请求。
启动Acceptor和Poller线程来接收和处理客户端发送过来的请求。
使用Acceptor用来接收客户端请求。
使用Poller线程来处理读写操作。
StandardEngine启动代码。
启动子容器
启动子容器的方法。
通过JDK本地线程池,启动线程的方式启动子容器。执行AbstractExecutorService 类的submit方法。
执行JDK的线程代码。
StandardHost启动。
StandardContext启动。
看到这里,对tomcat有没有一个更深入的了解了呢?如果没有,没关系!小编这里有个0元深入了解tomcat的机会,继续往下看。。。
0元学编程!Tomcat源码架构与性能优化!3天到课率即返学费!直播课更是穿插抽奖环节,报名就送10G的java架构师课程视频!!!此次课程适合哪些人:1. 想深入学习tomcat架构的小伙伴2. 想精通tomcat源代码的小伙伴3. 想掌握百万并发tomcat性能优化的小伙伴 7月15日 下周三直播开讲 点击下方了解更多,直接报名,不明白的小伙伴也可以私信我哦!
0元课程大纲: