`
heavensay
  • 浏览: 9612 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Tomcat学习1-架构与启动流程

阅读更多

 

一、Tomcat的启动流程与架构

 

Tomcat启动的时候的debug的运行轨迹图,框出来的代表主要容器的执行方法。


 

 

Tomcat执行大致的流程图

 

 

 

 

 

 

整体上看一看Tomcat的概览图


 

 

顶层元素:Server,Service
连接器元素:Connector(HTTP,AJP等)
容器元素:Engine(跟Connector结合,处理http请求),Host(对应于多个主机 i.e. mail.test.com,www.test.com,www.test2.com),Context(对应于一个个webapp应用),Wrapper(对应于一个个Servlet)
组件元素:Logger,Value ,Realm,Listener,Cluster等

 

 

二、Tomcat启动的步骤:

 

 1. tomcat的启动从Bootstrap.main()开始-->init()-->start()。

 

Bootstrap

    public void start()
        throws Exception
    {
.........
        // Set Catalina path
        setCatalinaHome();
        setCatalinaBase();
       //设置StandardClassLoader,加载${catalina.home}/lib,${catalina.home}/lib/*.jar
        initClassLoaders();  

        Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
        method.invoke(catalinaDaemon, (Object [])null);
.........
}
 
  

2. Catalina.start().  

 

 

Catalina

public void start() {
.....
        initDirs();
// 初始化JNDI名称
        initNaming();
// 创建解析config/server.xml的规则
        Digester digester = createStartDigester();
......
       //正式解析。至此相关的Server->Service->Enginer->Host,
       //也包括LifecycleListence、Connection等的实例和相关属性都组装配置完成
            digester.push(this);
            digester.parse(inputSource);
 ...........
        // 启动server服务
        if (getServer() instanceof Lifecycle) {
            try {
                ((Lifecycle) getServer()).start();
            } catch (LifecycleException e) {
                log.error("Catalina.start: ", e);
            }
        }
........
        if (await) {
        //阻塞在默认的8005端口,监听shutdown命令,来关闭tomcat
            await();  // -->serverSocket.accept();  8005端口
            stop();   //-->  ((Lifecycle) getServer()).stop();  
        }
.........

}
  
 

 

 

 3. StandardServer.start() ,server启动。

 

 

StandardServer

   public void start() throws LifecycleException {
.......
        // 开启service,一个Server有多个Service,Service互相独立
        synchronized (services) {
            for (int i = 0; i < services.length; i++) {
                if (services[i] instanceof Lifecycle)
                    ((Lifecycle) services[i]).start();
            }
        }
........
}
 
  

 4. StandardService.start(),Service启动

 

StandardService

    public void start() throws LifecycleException {
.........
         //初始化各种connection,在这里绑定tomcat需要的端口,或者抛出已绑定端口的异常
        connectors[i].initialize();
..........
        // 启动Enginer容器
        if (container != null) {
            synchronized (container) {
                if (container instanceof Lifecycle) {
                    ((Lifecycle) container).start();
                }
            }
        }
......
        // 但Enginer、Host、Context、Wrapper等容器都启动完成,那么启动connection,接受各种请求。
        synchronized (connectors) {
            for (int i = 0; i < connectors.length; i++) {
                try {
                    ((Lifecycle) connectors[i]).start();
                } catch (Exception e) {
                    log.error(sm.getString(
                            "standardService.connector.startFailed",
                            connectors[i]), e);
                }
            }
        }
.........
}
  

5. Connector.start(),启动Connector;这步就是建立用户Socket,解析http请求,封装成request。最终request经过Engine->Host->Context->Wrapper等容器的Valve处理,在经过FilterChina的处理,最终由Servlet处理。

 

 

Connector

    public void start() throws LifecycleException {
........
        if( !initialized )
            initialize();
        //HTTP/1.1或AJP/1.3协议的处理器的启动,听见来自用户的请求Socket
            protocolHandler.start();
........
}
 
 

 

-----------------------------------------------------------------------------------------------------------

     下面步骤中的组件都是继承ContainerBase容器,看一下简略的关系图 

 

 

 

ContainerBase

  public synchronized void start() throws LifecycleException {

        // Validate and update our current component state
        if (started) {
            if(log.isInfoEnabled())
                log.info(sm.getString("containerBase.alreadyStarted", logName()));
            return;
        }
        
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);

        started = true;

        // 启动各种组件,各种组件由server.xml、web.xml、context.xml等配置文件提供
        if ((loader != null) && (loader instanceof Lifecycle))
            ((Lifecycle) loader).start();
        logger = null;
        getLogger();
        if ((logger != null) && (logger instanceof Lifecycle))
            ((Lifecycle) logger).start();
        if ((manager != null) && (manager instanceof Lifecycle))
            ((Lifecycle) manager).start();
        if ((cluster != null) && (cluster instanceof Lifecycle))
            ((Lifecycle) cluster).start();
        if ((realm != null) && (realm instanceof Lifecycle))
            ((Lifecycle) realm).start();
        if ((resources != null) && (resources instanceof Lifecycle))
            ((Lifecycle) resources).start();

        // 启动各种子容器Engine->Host->Context->Wrapper
        Container children[] = findChildren();
        for (int i = 0; i < children.length; i++) {
            if (children[i] instanceof Lifecycle)
                ((Lifecycle) children[i]).start();
        }

        // 启动pipeline组件
        if (pipeline instanceof Lifecycle)
            ((Lifecycle) pipeline).start();

        // 触发事件
        lifecycle.fireLifecycleEvent(START_EVENT, null);

        // Start our thread
        threadStart();

        // 触发事件
        lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);

    }

  -----------------------------------------------------------------------------------------------

 

6. StandardEngine.start(),启动Engine;这步开始容器类的start

 

 

StandardEngine

  public void start() throws LifecycleException {
        if( started ) {
            return;
        }
        if( !initialized ) {
            init();
        }
......
       //一个Engine可以有多个Host,Host的启动
        Container children[] = findChildren();
        for (int i = 0; i < children.length; i++) {
            if (children[i] instanceof Lifecycle)
                ((Lifecycle) children[i]).start();
        }
.......
       //启动各种组件和子容器start()
       super.start();
.........
}
 

 

 7. StandardHost.start(),启动Host,

 

StandardHost

    public void start() throws LifecycleException {
.........
        //启动各种组件和子容器start()
        super.start(); -->ContainerBase -->HostConfig 
..........
        //   目录webapps/ 
        File appBase = appBase(); 
        //  conf/Catalina/localhost目录
        File configBase = configBase();
        // 解析conf\Catalina\localhost\*.xml文件,对每个webapp生成一个context
        HostConfig --> deployDescriptors(configBase, configBase.list());
        // 部署WEBAPPS/目录下的WARs
        HostConfig--> deployWARs(appBase, filteredAppPaths);
        // Deploy expanded folders
        HostConfig--> deployDirectories(appBase, filteredAppPaths);

        
}
 
 
   

8. StandardContext .start(),启动Context,

 

 

StandardContext

    public synchronized void start() throws LifecycleException {
............
        //一个Context对应一个WebappLoader,也就是关联到了WebappClassLoader
        //用于每个app下面的WEB-INF/classes和WEB-INF/lib类的加载
        if (getLoader() == null) {
            WebappLoader webappLoader = new WebappLoader(getParentClassLoader());
            webappLoader.setDelegate(getDelegate());
            setLoader(webappLoader);
        }
...........

        // 创建work目录,当做临时工作目录
        //比如 \work\Catalina\localhost\host-manager
        postWorkDirectory();
..............
          //初始化classloader
          if ((loader != null) && (loader instanceof Lifecycle))
               ((Lifecycle) loader).start();
..............
           //初始化各种组件
                if ((logger != null) && (logger instanceof Lifecycle))
                    ((Lifecycle) logger).start();                
                if ((cluster != null) && (cluster instanceof Lifecycle))
                    ((Lifecycle) cluster).start();
                if ((realm != null) && (realm instanceof Lifecycle))
                    ((Lifecycle) realm).start();
                if ((resources != null) && (resources instanceof Lifecycle))
                    ((Lifecycle) resources).start();
.............

        //触发start事件
         lifecycle.fireLifecycleEvent(START_EVENT, null);
         //解析系统默认的 conf/web.xml文件,完成默认的filterChina、servlet的各种组装
         ContextConfig --> defaultWebConfig();
        //解析apps下的自定义 /WEB-INF/web.xml 文件,完成filterChina、servlet的各种组装
         ContextConfig --> applicationWebConfig();
         // 如果设置了 <load-on-startup>,则初始化Servlet,执行init()或servlet为jsp页面,则complile生成servlet文件,再init;
         loadOnStartup(findChildren());
..........
}
 
   

 )

 

 

 9. StandardWrapper.start(),启动wrapper,standardWrapper就是Servlet的包装类

 

StandardWrapper

    public void start() throws LifecycleException {
..........
        //启动各种组件和子容器start()
        super.start();
.........

    //加载Servlet,此组件也就是Servlet的包装类,跟Servlet的关系通过此类
    public synchronized void load() throws ServletException {
        instance = loadServlet();
    }
}
 

 

 

--------------------------------------------------------------------------

 

三、Tomcat的生命周期关键组件Lifecycle

 

以上就是整个tomcat的启动过程,tomcat调用一个个组件的start(),父组件调用子组件start(),就这样一步步启动,直至整个tomcat启动完成。

tomcat的启动与关闭的生命周期跟Lifecycle接口息息相关.

图:Lifecycle接口的结构图


 

图:Lifecycle的实现类

 

参考资料:

http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/Tomcat 系统架构与设计模式,第 1 部分: 工作原理

http://www.ibm.com/developerworks/cn/java/j-lo-tomcat2/(Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析)

 

  • 大小: 71.6 KB
  • 大小: 34.8 KB
  • 大小: 43.1 KB
  • 大小: 31.7 KB
  • 大小: 21.9 KB
  • 大小: 57 KB
分享到:
评论

相关推荐

    tomcat-redis-session-manager jar包

    1. **安全策略**:考虑使用SSL加密Redis通信,避免Session数据在传输过程中被窃取。 2. **性能优化**:根据实际负载调整Redis配置,例如设置合理的缓存淘汰策略,避免内存溢出。 3. **监控与报警**:定期监控Redis和...

    tomcat9+tomcat-cluster-redis-session-manager_4.0.zip

    5. 测试和调整:启动多个Tomcat实例,验证Session是否能在不同实例间正确同步,根据性能和需求进行调优。 通过这种方式,你可以构建一个高可用、可扩展的Tomcat集群,同时利用Redis的强大功能来处理Session管理,...

    官方原版apache-tomcat-10.0.0-M1-windows-x64.zip 64位

    3. **启动与停止Tomcat**: - **启动**: 进入命令提示符,使用`startup.bat`脚本启动Tomcat服务器,这个脚本位于`%CATALINA_HOME%\bin`目录下。 - **停止**: 使用`shutdown.bat`脚本关闭Tomcat服务器。 4. **配置...

    tomcat-redis-session-manager-tomcat-7.zip

    《Apache Tomcat与Redis结合实现非粘性会话管理》 在现代Web应用程序开发中,会话管理是一项至关重要的任务,它确保用户在不同页面之间的交互保持一致性。Apache Tomcat作为广泛使用的Java Servlet容器,提供了丰富...

    apache-tomcat-7.0.42-windows-x64免安装包

    1. **Tomcat的架构与组件** - **Catalina**:这是Tomcat的核心组件,负责处理Servlet和JSP的请求。 - **Jasper**:JSP编译器,将JSP页面转换为Java类,然后由Catalina执行。 - **Connector**(又称HTTP Connector...

    apache-tomcat-6.0.20-src

    1. **bin**:包含启动和停止Tomcat的脚本,如`catalina.sh`或`catalina.bat`,以及管理工具如`startup.sh`和`shutdown.sh`。 2. **conf**:存储所有配置文件,如`server.xml`(定义服务器配置)、`webapps.xml`...

    apache-tomcat-7.0.57-src.zip

    1. **Catalina**:这是Tomcat的主要部分,实现了Servlet和Java EE的Web容器规范。Catalina负责管理Web应用程序的生命周期,处理HTTP请求,并将这些请求分发到相应的Servlet。 2. **Jasper**:Jasper是Tomcat中的JSP...

    最新版linux apache-tomcat-10.0.0-M9.tar.gz

    1. **Java EE 9支持**:Tomcat 10主要目标是与Java EE 9兼容。Java EE 9是企业级Java平台的最新版本,它引入了新的规范,如JSR 380(Bean Validation 2.0)和JSR 375(Java EE Security API)。 2. **Servlet 4.0**...

    apache-tomcat-7.0.16-windows-x86.zip(免安装版)

    首先,让我们深入了解Tomcat的架构。Tomcat是基于Java的Servlet容器,它是Java EE Web应用程序规范的主要实现。Servlet是Java编程语言中用于动态创建Web内容的一组API,而JSP则是Servlet的一种简化方式,允许开发者...

    apache-tomcat-8.5.35-windows-x64

    Tomcat支持JSP规范,允许开发者用JSP编写视图层,与Servlet一起实现MVC(模型-视图-控制器)架构。 3. **Java EE (Enterprise Edition)**: Java EE是企业级Java应用的标准,提供了一套API和服务器平台,用于开发和...

    apache-tomcat-5.5.25-src.tar.gz

    1. **bin**:包含启动和停止Tomcat的脚本,如`catalina.sh`和`startup.sh`,以及管理工具。 2. **conf**:存储服务器和应用的配置文件,如`server.xml`、`web.xml`和`context.xml`。 3. **lib**:存放Tomcat运行所需...

    jakarta-tomcat-connectors-jk2.0.2-win32-IIS.zip

    5. **测试与调整**:启动IIS和Tomcat服务,通过访问网站进行测试,根据实际情况调整配置参数以优化性能。 **安全与维护** 在实际部署中,还需要考虑安全性问题,如限制对worker.properties的访问权限,防止恶意修改...

    apache-tomcat-9.0.26-windows-x86.zip

    1. **Tomcat的结构与组件** Tomcat由几个关键组件构成,包括Catalina(核心Servlet容器)、 Coyote(HTTP/1.1协议处理器)、 Jasper(JSP引擎)和Commons Daemon(用于启动和停止Tomcat的服务)。在"apache-tomcat-...

    Tomcat源码apache-tomcat-8.5.47-src.zip

    1. **Catalina**:这是Tomcat的核心组件,负责管理Web应用程序,包括加载、部署、启动和停止应用。`org.apache.catalina`包下包含了大部分核心类,如`Engine`(顶层容器)、`Host`(虚拟主机)、`Context`(Web应用...

    apache-tomcat-7.0.26-src

    5. **启动与测试**:通过运行`bin/startup.sh`或`bin/startup.bat`启动Tomcat,然后在浏览器中访问`http://localhost:8080`检查是否正常运行。 6. **自定义与扩展**:开发者可以根据源代码进行自定义,例如编写新的...

    apache-tomcat-8.5.35-Linux.zip

    3. **启动Tomcat**:在设置好环境变量后,你可以通过运行`$CATALINA_HOME/bin/startup.sh`来启动Tomcat服务器。 4. **配置端口**:默认情况下,Tomcat监听8080端口。如果需要更改,可以编辑`$CATALINA_HOME/conf/...

    apache-tomcat-8.0.18-src

    6. **部署与运行**:从源码构建Tomcat涉及编译源码、生成可执行文件和库,然后配置并启动服务器。这通常需要Java JDK环境,并使用Ant或Maven等构建工具。 7. **性能优化**:通过源码,开发者可以深入研究Tomcat如何...

    apache-tomcat-8.5.9-src

    1. `bin`:包含了启动和停止Tomcat的脚本。 2. `conf`:存放服务器配置文件,如server.xml,定义了服务器的各个组件及其关系。 3. `webapps`:默认的Web应用程序部署目录。 4. `work`:存放编译后的JSP文件和Servlet...

    apache-tomcat-6.0.10-src

    1. **架构**:Tomcat采用了模块化的结构,主要包括Catalina(核心Servlet容器)、 Coyote(HTTP连接器)、Jasper(JSP引擎)等组件。每个组件都有明确的职责,使得系统可扩展且易于维护。 2. **配置**:Tomcat的...

    apache-tomcat-6.0.37-windows-i64.zip tomcart下载

    在本文中,我们将深入探讨Apache Tomcat 6.0.37版本在Windows 64位系统上的安装和使用过程,以及如何处理与下载相关的事项。 首先,标题中的"apache-tomcat-6.0.37-windows-i64.zip"是Apache Tomcat 6.0.37的...

Global site tag (gtag.js) - Google Analytics