Tomcat简单的分析-顶层结构和启动过程

先看Tomcat的图示结构


1.Server---------Tomcat的最顶层的容器,Server中至少包含一个Service

2.Service--------Service主要包含Connector(可以多个,如同时提供http和https连接)和Container(一个)

3.Connector----主要用于处理连接相关的事,并提供Socket与Request,Response的转换,

4.Container----主要封装和管理Servlet,以及具体处理request请求


Server和Service的启动

    总的流程图:

            

    1.Tomcat中的Server是由org.apache.catalina.startup.Catalina来管理的,Catania是整个Tomcat的管理类,包含几个方法load、start、stop,await,用来管理整个服务器的生命周期。

        1.1 load方法根据conf/server.xml文件创建Server并调用Server的init方法进行初始化

        1.2 start方法用于启动服务器

        1.3 stop方法用于停止服务器

        1.4 await 方法直接调用Server的await方法,这个方法的作用是进入一个循环,让主线程不会退出

        说明:这几个方法都是逐层调用的,这样整个服务器就启动了,start,init和stop是一样的。例:

             Server 的Start方法会调用Service中的Start方法

            Service中的Start方法又会调用包含Connectors和Container的start方法。

    2.Tomcat的入口main方法

        这个方法定义在org.apache.catalina.startup.Bootstrap中,Bootstrap的作用类似于CatalinaAdaptor,具体处理过程还是使用Catalina来完成。主要调用了三个方法(这三个方法又是调用的Catalina中的方法)

daemon.setAwait(true);       //表示用于设置Server启动完成后是否进入等待的标志
daemon.load(args);         //表示加载配置文件,创建并初始化Server
daemon.start();           //用于启动服务器
public static void main(String[] args) {
        if (daemon == null) {
            Bootstrap bootstrap = new Bootstrap();

            try {
                bootstrap.init();
            } catch (Throwable var3) {
                handleThrowable(var3);
                var3.printStackTrace();
                return;
            }

            daemon = bootstrap;
        } else {
            Thread.currentThread().setContextClassLoader(daemon.catalinaLoader);
        }

        try {
            String command = "start";
            if (args.length > 0) {
                command = args[args.length - 1];
            }

            if (command.equals("startd")) {
                args[args.length - 1] = "start";
                daemon.load(args);
                daemon.start();
            } else if (command.equals("stopd")) {
                args[args.length - 1] = "stop";
                daemon.stop();
            } else if (command.equals("start")) {
                daemon.setAwait(true);
                daemon.load(args);
                daemon.start();
            } else if (command.equals("stop")) {
                daemon.stopServer(args);
            } else if (command.equals("configtest")) {
                daemon.load(args);
                if (null == daemon.getServer()) {
                    System.exit(1);
                }

                System.exit(0);
            } else {
                log.warn("Bootstrap: command \"" + command + "\" does not exist.");
            }
        } catch (Throwable var4) {
            Throwable t = var4;
            if (var4 instanceof InvocationTargetException && var4.getCause() != null) {
                t = var4.getCause();
            }

            handleThrowable(t);
            t.printStackTrace();
            System.exit(1);
        }

    }

    3.Server的启动过程

        Server中的init方法和Start方法分别循环调用了每个Service中的init方法和Start方法,Server的默认实现是org.apache.catalina.core.StandardServer类,它的结构图如下:

        

解析:上面的LifecycleBase中就定义了init和start方法,并且LifecycleBase里面的init方法和Start方法有调用了initInternal和startInternal方法,而StandardServer中的initInternal和startInternal方法有分别循环调用了service中的start和inti方法,并且StandardServer还实现了await方法,Catalina就是调用它让服务器进入等待状态的。

4.Service的启动过程

    Service的默认实现是org.apache.catalina.core.StandardService类,结构图如下:

        

解析:StandardService中的initInternal和startInternal方法主要调用了container,executors,mapperListener,connectors的init和start方法。

    mapperListener这里是Mapper的监听器,可以监听container容器的变化,

    executor是用在connectors中管理线程的线程池,在 server.xml配置文件中有参考用法。

        如部分:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->


    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
    -->
    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />


猜你喜欢

转载自blog.csdn.net/weixin_40792878/article/details/80905801