跳到主要内容

08、Tomcat8 源码解析 - 服务器和服务

Tomcat源码版本:apache-tomcat-8.5.54-src
JDK源码版本:jdk1.8.0_171

一、服务器

1、 org.apache.catalina.Server接口;

一个服务器提供了一种优雅的机制来启动和停止整个系统,不必再单独的启动连接器和容器了。当服务器启动的时候,它启动内部的所有组件。然后无限期的等待关闭命令,如果你想要关闭系统,发送一个关闭命令道指定端口即可。当服务器收到正确的关闭指令后,它停止所有组件的服务。

package org.apache.catalina;
import java.io.File;
import org.apache.catalina.deploy.NamingResourcesImpl;
import org.apache.catalina.startup.Catalina;

public interface Server extends Lifecycle {
    //JNDI服务上下文
    public NamingResourcesImpl getGlobalNamingResources();
    public void setGlobalNamingResources(NamingResourcesImpl globalNamingResources);
    public javax.naming.Context getGlobalNamingContext();
    //等待关闭命令的端口
    public int getPort();
    public void setPort(int port);
    //等待关闭命令的地址
    public String getAddress();
    public void setAddress(String address);
    //获取关闭指令字符串
    public String getShutdown();
    public void setShutdown(String shutdown);
    //父类加载器
    public ClassLoader getParentClassLoader();
    public void setParentClassLoader(ClassLoader parent);
    //持有的Catalina
    public Catalina getCatalina();
    public void setCatalina(Catalina catalina);
    //持有的容器base
    public File getCatalinaBase();
    public void setCatalinaBase(File catalinaBase);
    //Catalina目录
    public File getCatalinaHome();
    public void setCatalinaHome(File catalinaHome);
    //一个服务器可以有零个或多个服务 下面是管理org.apache.catalina.Service服务组件的方法
    public void addService(Service service);
    public Service findService(String name);
    public Service[] findServices();
    public void removeService(Service service);
    
    public Object getNamingToken();
    public void await();
}

2、 org.apache.catalina.core.StandardServer标准实现;

有四个跟生命周期相关的方法:

1、initInternal:初始化Server组件及其Service子组件:初始化要添加到服务器实例上的服务;
2、startInternal:启动Server组件及其Service子组件;
3、stopInternal:停止Server组件及其Service子组件;
4、destroyInternal:销毁Server组件及其Service子组件;
5、await:在8085端口创建一个ServerSocket对象,在 while 循环调用它的accept 方法。Accept 方法仅仅接受 8085 端口的信息。它将接受到的信息跟shutdown 命令进行匹配,如果匹配的话跳出循环关闭 SocketServer,如果不匹配继续 while 循环等待另一个命令。

二、服务

服务器还使用了另外一个组件,服务,它用来持有组件,例如容器或者一个多个的连接器。

1、 org.apache.catalina.Service接口;

一个服务可以可以有一个容器和多个连接器。你可以添加多个连接器 ,并将它们跟容器相关联

package org.apache.catalina;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.mapper.Mapper;
public interface Service extends Lifecycle {
    //设置唯一的一个Engine容器
    public Engine getContainer();
    public void setContainer(Engine engine);

    //Service名称
    public String getName();
    public void setName(String name);

    //操作关联的Server
    public Server getServer();
    public void setServer(Server server);

    public ClassLoader getParentClassLoader();
    public void setParentClassLoader(ClassLoader parent);

    //容器注册的域
    public String getDomain();

    //操作多个连接器
    public void addConnector(Connector connector);
    public Connector[] findConnectors();
    public void removeConnector(Connector connector);

    //服务关联的线程池
    public void addExecutor(Executor ex);
    public Executor[] findExecutors();
    public Executor getExecutor(String name);
    public void removeExecutor(Executor ex);

    //服务关联的映射器
    Mapper getMapper();
}

2、 org.apache.catalina.core.StandardService标准实现;
一个StandardService 实例包括两种组件:一个容器和多个连接器。
多个连接器可以使得 Tomcat 能服务于多个协议。包括HTTP协议请求、HTTPS协议请求、AJP协议请求。
有四个跟生命周期相关的方法:
1、initInternal:初始化Service组件及其子组件:初始化要添加到服务实例上的容器和连接器;
2、startInternal:启动Service组件及其子组件;
3、stopInternal:停止Service组件及其子组件;
4、destroyInternal:销毁Server组件及其Service子组件;

总结:

1个Catalina包含1个Server;
1个Server包含多个Service;
每个Service对应有下面的组件:
    1个Engine;
    多个Connector;
    一个MapperListene;