Tomcat

来源:互联网 发布:淘宝店铺分析报告 编辑:程序博客网 时间:2024/05/17 01:30

一、Tomcat的顶层结构

Tomcat中最顶层的容器叫Server,代表整个服务器,Server中至少包含一个Service,用于具体提供服务。Service主要包含两部分:Connector和Container。Connector用于处理连接相关的事情,并提供Socket与request、response的转换。Containner用于封装和管理Servlet,以及具体处理request请求。一个Tomcat只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但可以有多个Connector。

二、Tomcat启动过程

1、Bootstrap的启动过程

Bootstrap是Tomcat的入口,启动Tomcat就是调用Bootstrap的main方法。main方法很简单,首先新建Bootstrap,并执行init方法初始化,然后处理main方法传入的命令,如果args参数为空,默认执行start命令。对start命令的处理调用了三个方法:setAwait(true)、load(args)、start()。这三个方法内部都调用了Catalina的相应方法进行具体执行,只不过是用反射来调用的。

2、Catalina的启动过程

Catalina是整个Tomcat的管理类,它里面的三个方法load、start、stop分别用来管理整个服务器的生命周期。Catalina的启动主要是调用setAwait、load、start方法来完成的。setAwait方法用于设置Server启动完成后是否进入等待状态的标志;load方法用于加载配置文件,创建Server对象,并赋值给server属性,然后调用server的init方法;start方法用于启动服务器,主要调用了server的start方法启动服务器,并根据await属性判断是否让程序进入等待状态,进入等待状态会调用await和stop两个方法。await方法直接调用了Server的await方法,内部会执行一个while循环,当while循环退出时,就会执行stop方法,从而关闭服务器。

3、Server的启动过程

Server接口中提供addService(Service service)、removeService(Service service)来添加和删除Service。Server的默认实现是StandardServer,调用StandardServer的init和start方法会执行StandardServer自己的initInternal和startInternal方法。initInternal和startInternal方法分别循环调用了每个service的start和init方法。StandardServer中还实现了await方法,Catalina调用它来让服务器进入等待状态的。其处理逻辑是首先判断端口号。如果为-2,直接退出,不进入循环;如果为-1,则会进入一个while(!stopAwait)的循环,内部没有break跳出语句,stopAwait标志只有调用stop方法才会设置为true;如果为其它值,则也会进入while(!stopAwait)的循环,不过同时在端口启动一个ServerSocket来监听关闭命令,如果接收到了则会使用break跳出循环。

4、Service的启动过程

Service的默认实现是StandardService,其init和start方法会调用initInternal和startInternal方法,initInternal和startInternal方法主要调用container、executors、mapperListener、connectors的init和start方法。

三、Tomcat的生命周期

Tomcat通过Lifecycle接口统一管理生命周期。Lifecycle接口属性如下:

1、定义了13个String类型常量,用于LifecycleEvent事件的type属性中,作用是区分组件发出的LifecycleEvent事件时的状态。

2、定义了三个管理监听器的方法。

3、定义了4个生命周期的方法:init、start、stop、destory。

4、定义获取当前状态的两个方法:getState和getStateName。

LifecycleBase是Lifecycle的默认实现。监听器管理是专门使用了一个LifecycleSupport类来完成,内部定义了一个LifecycleListener数组类型的属性来保存所有的监听器,然后对数组进行添加、查询、删除操作。四个生命周期方法的实现中首先判断当前状态和要处理的方法是否匹配,如果不匹配就会执行相应的方法使其匹配,如果匹配或者处理后匹配了,则会调用相应的模板方法并设置相应的状态。

四、Container

Container是Tomcat中容器的接口。其子容器Engine、Host、Context、Wrapper是逐层包含的关系,每个service最多只能有一个Engine,Engine里面可以有多个Host,每个Host下可以有多个Context,每个Context下可以有多个Wrapper,通常使用的Servlet就封装在其子接口Wrapper中。

1、四种容器的配置方法

server.xml文件是重要的配置文件

2、Container的启动

Container的4个子容器有一个共同的父类ContainerBase,是Container的基础实现类,其initInternal方法和startInternal方法定义了通用的处理内容,具体的子容器可以添加自己的内容。

ContainerBase的initInternal方法主要初始化ThreadPoolExecutor类型的startStopExecutor属性,用于管理线程。

ContainerBase的startInternal方法主要做5件事:

如果有Cluster(配置集群,同步Session)和Realm(Tomcat的安全域,用来管理资源的访问权限)则调用其start方法

采用多线程机制调用所有子容器的start方法启动子容器

启动管道

启动完成后将生命周期状态设置为LifecycleState.STARTING状态

启动后台线程定期调用backgroundProcess方法完成某些事情

3、Pipeline-Valve管道

Container处理请求是使用Pipeline-Valve管道来处理的

五、Connector

Connector用于接收请求并将请求封装成Request和Response来具体处理。