一、项目说明
如下图为tomcat项目源码的工程目录,分别标出了项目的输出目录及启动引导类Bootstrap.java
右击上图最后一个文件“build.xml”,选择Run As中"Ant Build"项,然后在根路径输出目录output下“build/bin”路径目录中运行startup.bat文件(如下图所示)
二、架构功能模块说明
1.总体结构 - tomcat总体结构层级:Server>Service>Connector、Engine>Realm(域)、Host>Contex
<?xml version='1.0' encoding='utf-8'?> @b@<Server port="8005" shutdown="SHUTDOWN">@b@ @b@ <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> @b@ <Listener className="org.apache.catalina.core.JasperListener" /> @b@ <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />@b@ <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />@b@ <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" @b@ @b@ <GlobalNamingResources> @b@ <Resource name="UserDatabase" auth="Container"@b@ type="org.apache.catalina.UserDatabase"@b@ description="User database that can be updated and saved"@b@ factory="org.apache.catalina.users.MemoryUserDatabaseFactory"@b@ pathname="conf/tomcat-users.xml" />@b@ </GlobalNamingResources> @b@ @b@ <Service name="Catalina">@b@ @b@ <Connector port="8080" protocol="HTTP/1.1"@b@ connectionTimeout="20000"@b@ redirectPort="8443" /> @b@ <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />@b@ @b@ <Engine name="Catalina" defaultHost="localhost">@b@ @b@ <Realm className="org.apache.catalina.realm.LockOutRealm"> @b@ <Realm className="org.apache.catalina.realm.UserDatabaseRealm"@b@ resourceName="UserDatabase"/>@b@ </Realm>@b@@b@ <Host name="localhost" appBase="webapps"@b@ unpackWARs="true" autoDeploy="true"> @b@ <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"@b@ prefix="localhost_access_log." suffix=".txt"@b@ pattern="%h %l %u %t "%r" %s %b" /> @b@ </Host>@b@ </Engine>@b@ </Service>@b@</Server>
2.容器关系原理 - 如下图,tomcat两大服务是Connector(连接器)和Container(容器),子容器分为Engine、Host、Context、Wrapper组件组成,容器Container依赖关联Pipeline(通道),Loader(类加载)、Manager(session、容器的管理)、Realm(安全授权认证域)接口类实现容器各职能实施及解耦分层,对于子容器(Engine..)和内部依赖接口(Pipeline..)都是基于JMX注册管理资源服务
4个子容器的作用分别是:@b@@b@(1)Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;@b@@b@(2)Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;@b@@b@(3)Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;@b@@b@(4)Wrapper:每一Wrapper封装着一个Servlet
3.流程时序 - 如下图,tomcat个服务、组件及容器类的启动时序流程图,下面结合源码一步步分析
三、源码说明
启动入口类BootStarp初始化init方法加载Catalina类,如下图
2.主容器Catalina类启动方法start启动主实现类StandardServer,如下图
3. 服务类StandardServer启动startInternal方法启动主服务实现类StandardService,如下图
4.主服务类StandardService启动方法startInternal加载连接器类Connector,如下图
5.连接器类Connector通过startInternal方法启动协议解析类如Http11NioProtocol,如下图
6.协议解析类Http11NioProtocol处理类启动原始端子类如NioEndpoint(另JIoEndpoint类、AprEndpoint类),如下图
7.原始端类NioEndpoint,完成线程的初始化启动等,启动线程处理单元网络通信服务Acceptor类,如下图
8.网络通信服务Acceptor类,启动ServerSocket网络通信服务,如下图