【Tomcat源码学习】-2.容器管理
Tomcat作为应用服务器,我们可以理解Tomcat本身就是一个容器,用于装载应用,而作为容器本身是由若干组件以及事件构成,容器管理即为管理容器的有机组成部分。
一、Tomcat整体结构:
- Server:即一个Tomcat服务器
- Service:即一个Server对外提供的服务单元,一个Server下面可以有多个Service组件,一般只有一个
- Connector:连接器,用于服务组件对外的访问器,一个服务组件可以有多个Connector子组件,不同Connector对应不同协议访问
- Engine:引擎,是服务组件提供服务的核心组件,一个Service下有且仅有一个Engiine
- Host:虚拟主机,用于定位服务访问的范围域,一个引擎下可以有多个虚拟主机,即除localhost外还可以是其他,另外虚拟主机还可以存在别名
- Context:上下文,一个Host下可有存在多个独立的上下文,而一个上下文对应着我们发布的一个完整的应用
- Realm:用于定义容器内应用程序访问认证,位于Engine下,可以有多种实现,一般我们选择UserDatabaseRealm,该Realm读取conf/tomcat-users.xml中数据进行认证
- Value:扩展组件,用于表明上级组件具有的扩展属性,一个组件可以有多个Value组件,比如org.apache.catalina.valves.AccessLogValve访问日志组件
- GlobalNamingResource:全局命名资源,也是全局配置问题,供所有组件按需读取与使用
tomcat容器核心类图如下:
容器组件主要实现了容器接口(Container),继承抽象类ContainerBase。
容器采用组合模式,容器可以有若干子容器组成,
另外所有容器都存在管道,权限,负载等其他组件部分构成。
二、Tomcat启动过程详解:
1)守护进程加载与执行
- *.sh : Shell脚本进行Tomcat启动的一系列环境初始化操作以及参数初始化
- 启动:tomcat启动程序Bootstrap,在启动时会带上*.sh执行后的参数,如下:
/usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat-bs-xfb-wx-8081/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms512m -Xmx1024m -Djava.endorsed.dirs=/usr/local/tomcat-bs-xfb-wx-8081/endorsed -classpath /usr/local/tomcat-bs-xfb-wx-8081/bin/bootstrap.jar:/usr/local/tomcat-bs-xfb-wx-8081/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat-bs-xfb-wx-8081 -Dcatalina.home=/usr/local/tomcat-bs-xfb-wx-8081 -Djava.io.tmpdir=/usr/local/tomcat-bs-xfb-wx-8081/temp -Dcom.sun.management.jmxremote= -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=127.0.0.1 org.apache.catalina.startup.Bootstrap start
- 类加载:然后Bootstrap进行通过配置的类加载器进行lib包下jar的类加载
- 创建守护进程:创建Catalina守护进程,同时初始化类加载器,以及digester对象
- 容器组件装载:通过Digester读取conf/server.xml配置文件,加载各容器组件从配置文件至java对象堆中
- 容器组件初始化:调用Server组件init方法进行初始化,Server在初始化时通过责任链模式依次调用子组件进行init方法初始化
- 容器组件启动:调用Server组件start方法进行启动,Server在启动时通过责任链模式依次调用子组件进行start方法启动
- 容器组件停止:调用Server组件stop方法进行停止,Server在停止时通过责任链模式依次调用子组件进行stop方法停止
2)容器组件装载
容器在装载过程中,主要为对应的容器组件生成,以及通用处理监听器
- 整体是通过Digester读取conf/server.xml配置文件,加载各容器组件从配置文件至java对象堆中
- Service在装载过程默认新建一个MapperListener监听对象
- Host在装载过程默认新建一个HostConfig监听对象
- Context在装载过程新建一个ContextConfig监听对象
- 由于容器基本上都继承与抽象类LifecycleMBeanBase,因此在装载过程中都需要将这些对象视为Mbean注入JVM中
- Service初始化时,调用MapperListener的初始化方法
- Engine容器初始化时,会初始化startStopExecutor线程池,用户进程的监控的处理
4)容器组件启动
- Service启动时,调用MapperListener的启动方法
- MapperListener启动时,将Engine及所有子容器注册该监听,同时将所有的host,context注入到该监听内容中,另外看Context下是否配置有Wapper描述信息,如果有构建WrapperMappingInfo,供后续生成Wrapper时使用
- Engine启动时,启动Cluster,Realm,通过startStopExecutor线程池启动Host子组件,执行监听
- Host启动时,启动Cluster,Realm,通过startStopExecutor线程池启动Context子组件,执行监听,其中会调用HostConfig进行应用程序读取,具体加载会在下一章节进行讲解。
- 在通过HostConfig进行应用程序加载后,调用Context子容器进行应用加载,具体加载会在下一章节进行讲解。