一:核心流程源码剖析
Tomcat中的各容器组件都会涉及创建、销毁等,因此设计了生命周期接口Lifecycle进行统一规范,各容 器组件实现该接口。
Lifecycle生命周期接口主要方法示意
Lifecycle生命周期接口继承体系示意
二、核心流程源码剖析
源码追踪部分我们关注两个流程:
Tomcat启动流程和Tomcat请求处理流程 Tomcat启动流程
1、Tomcat启动流程
涉及到很多容器,初始化、启动。下面的各个容器、容器有生命周期,设计时候高端设计,都继承了Lifecycle接口,
同一管理生命周期。
2、Tomcat请求处理流程
请求处理流程分析
3、Mapper组件体系结构
三、点击查看源码流程
Tomcat初始化部分
1
时序图:
源码:

2
时序图:
源码:
3、

4、

protected Digester createStartDigester() {long t1=System.currentTimeMillis();// Initialize the digesterDigester digester = new Digester();digester.setValidating(false);digester.setRulesValidation(true);Map<Class<?>, List<String>> fakeAttributes = new HashMap<>();List<String> objectAttrs = new ArrayList<>();objectAttrs.add("className");fakeAttributes.put(Object.class, objectAttrs);// Ignore attribute added by Eclipse for its internal trackingList<String> contextAttrs = new ArrayList<>();contextAttrs.add("source");fakeAttributes.put(StandardContext.class, contextAttrs);digester.setFakeAttributes(fakeAttributes);digester.setUseContextClassLoader(true);// Configure the actions we will be usingdigester.addObjectCreate("Server","org.apache.catalina.core.StandardServer","className");digester.addSetProperties("Server");digester.addSetNext("Server","setServer","org.apache.catalina.Server");digester.addObjectCreate("Server/GlobalNamingResources","org.apache.catalina.deploy.NamingResourcesImpl");digester.addSetProperties("Server/GlobalNamingResources");digester.addSetNext("Server/GlobalNamingResources","setGlobalNamingResources","org.apache.catalina.deploy.NamingResourcesImpl");digester.addObjectCreate("Server/Listener",null, // MUST be specified in the element"className");digester.addSetProperties("Server/Listener");digester.addSetNext("Server/Listener","addLifecycleListener","org.apache.catalina.LifecycleListener");digester.addObjectCreate("Server/Service","org.apache.catalina.core.StandardService","className");digester.addSetProperties("Server/Service");digester.addSetNext("Server/Service","addService","org.apache.catalina.Service");digester.addObjectCreate("Server/Service/Listener",null, // MUST be specified in the element"className");digester.addSetProperties("Server/Service/Listener");digester.addSetNext("Server/Service/Listener","addLifecycleListener","org.apache.catalina.LifecycleListener");//Executordigester.addObjectCreate("Server/Service/Executor","org.apache.catalina.core.StandardThreadExecutor","className");digester.addSetProperties("Server/Service/Executor");digester.addSetNext("Server/Service/Executor","addExecutor","org.apache.catalina.Executor");digester.addRule("Server/Service/Connector",new ConnectorCreateRule());digester.addRule("Server/Service/Connector",new SetAllPropertiesRule(new String[]{"executor", "sslImplementationName"}));digester.addSetNext("Server/Service/Connector","addConnector","org.apache.catalina.connector.Connector");digester.addObjectCreate("Server/Service/Connector/SSLHostConfig","org.apache.tomcat.util.net.SSLHostConfig");digester.addSetProperties("Server/Service/Connector/SSLHostConfig");digester.addSetNext("Server/Service/Connector/SSLHostConfig","addSslHostConfig","org.apache.tomcat.util.net.SSLHostConfig");digester.addRule("Server/Service/Connector/SSLHostConfig/Certificate",new CertificateCreateRule());digester.addRule("Server/Service/Connector/SSLHostConfig/Certificate",new SetAllPropertiesRule(new String[]{"type"}));digester.addSetNext("Server/Service/Connector/SSLHostConfig/Certificate","addCertificate","org.apache.tomcat.util.net.SSLHostConfigCertificate");digester.addObjectCreate("Server/Service/Connector/SSLHostConfig/OpenSSLConf","org.apache.tomcat.util.net.openssl.OpenSSLConf");digester.addSetProperties("Server/Service/Connector/SSLHostConfig/OpenSSLConf");digester.addSetNext("Server/Service/Connector/SSLHostConfig/OpenSSLConf","setOpenSslConf","org.apache.tomcat.util.net.openssl.OpenSSLConf");digester.addObjectCreate("Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd","org.apache.tomcat.util.net.openssl.OpenSSLConfCmd");digester.addSetProperties("Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd");digester.addSetNext("Server/Service/Connector/SSLHostConfig/OpenSSLConf/OpenSSLConfCmd","addCmd","org.apache.tomcat.util.net.openssl.OpenSSLConfCmd");digester.addObjectCreate("Server/Service/Connector/Listener",null, // MUST be specified in the element"className");digester.addSetProperties("Server/Service/Connector/Listener");digester.addSetNext("Server/Service/Connector/Listener","addLifecycleListener","org.apache.catalina.LifecycleListener");digester.addObjectCreate("Server/Service/Connector/UpgradeProtocol",null, // MUST be specified in the element"className");digester.addSetProperties("Server/Service/Connector/UpgradeProtocol");digester.addSetNext("Server/Service/Connector/UpgradeProtocol","addUpgradeProtocol","org.apache.coyote.UpgradeProtocol");// Add RuleSets for nested elementsdigester.addRuleSet(new NamingRuleSet("Server/GlobalNamingResources/"));digester.addRuleSet(new EngineRuleSet("Server/Service/"));digester.addRuleSet(new HostRuleSet("Server/Service/Engine/"));digester.addRuleSet(new ContextRuleSet("Server/Service/Engine/Host/"));addClusterRuleSet(digester, "Server/Service/Engine/Host/Cluster/");digester.addRuleSet(new NamingRuleSet("Server/Service/Engine/Host/Context/"));// When the 'engine' is found, set the parentClassLoader.digester.addRule("Server/Service/Engine",new SetParentClassLoaderRule(parentClassLoader));addClusterRuleSet(digester, "Server/Service/Engine/Cluster/");long t2=System.currentTimeMillis();if (log.isDebugEnabled()) {log.debug("Digester for server.xml created " + ( t2-t1 ));}return digester;}
5&6、
时序图
7、


8、
时序图:
源码:
点进services[i].init(); 也会出现7的步骤。
9、

12、
13、
点击protocolHandler.init();进去


点击进去endpoint.init();
点击进去bind();

Tomcat启动部分
14、

15、
16、
17、
点进getServer().start();



18&21&22、
点进services[i].start();


19、
点进engine.start();


23、




protocolHandler是一个组合组件
点进去protocolHandler.start();
点进endpoint.start();



点进去startAcceptorThreads();


点进return new Acceptor();
四、Debug断点追踪看源码流程
1、打断点






后续的流程和点击查看的差不太多。



