Tomcat结构
Tomcat最顶层的容器叫做server。代表整个服务器,Server中至少包含一个Service用于提供服务。而Service主要包含以下2个。Connector:用于处理连接相关的事情,且提供Socket和request,response的装换。
Container则是用于封装和管理Servlet以及具体处理request请求。一个Tomcat只能有一个Server,一个Server可以包含多个Service,一个Service中只有一个Container,但是可以有多个Connectors(因为一个服务可以有多个连接)。
Tomcat中的管理类是Catalina,它用来管理Server。其有3个方法来管理Server的整个生命周期。
load方法用于根据conf/server.xml文件创建Server并调用Server的init方法来进行初始化。
start方法用于启动服务器。stop方法用于停止服务器。这些方法会逐层调用其下级的方法来启动整个服务器。比如,Server的stat方法调用所有的Service的stat方法,Service的stat方法调用Connectors和Container的stat方法。
Tomcat的入口main不在CatAlina类里。在BootStrap里。
tomcat启动过程
BootStrap
启动Tomcat就是调用BootStrap的main方法。在这个main方法里面主要做了这么几个事情。新建BootStrap实例,然后赋值给catalinaDaemon变量。然后根据不同命令不同操作。
start:调用了3个方法setAwaut(true),load(args),start().这3个方法内部都会调用相应的Catalina进行具体处理执行。
Stop:调用StopServer方法。
Catalina
可以看到Catalina是上面BootStrap的3个方法来启动的,setAwait设置Server启动后是否进入等待状态(true是,false不是)。load方法用来加载配置文件。创建并且初始化Server,Start方法用来启动服务器。在这个方法里面主要是调用了server的start方法来启动服务器。
Server
Server接口包含了一个个的serveice,因此在server中,提供了addService(Service service),removeService(Service service)来添加和删除service。server的init,start方法则是循环调用了每个Service的init,start方法。来启动所有的service。
Server默认实现是StandardServer,StandardServer的上级父类有LifeCycleBase的类,init,start方法就定义在这个类里面,这个类的init和start方法调用的是initInternal方法和startinternal方法,而这2个方法是模板方法,由子类具体实现,因此调用StandardServer的init,stat方法就是执行StandardServer的initInternal方法和startinternal方法,而在
StandardServer的initInternal方法和startinternal方法中分别循环调用了每一个Service的start和init方法。在StandardServer实现了await方法,让服务器进入等待状态。
service
Service的默认实现是StandardService。而这个类也继承了LifeCycleBase这个类,因此其init和stat方法最终也会调用其自身的initInternal方法和startinternal方法。在initInternal方法和startinternal方法的实现中,其主要是调用了其containner(容器),executors(线程池),mapperListener是Mapper的监听器,可以监听container的变化。connectors(连接器)的init和start方法。
tomcat生命周期
tomcat通过Lifecycle接口统一管理生命周期,所有生命周期组件都要实现这个接口。
做了4件事。
1.定义了13个String类型的常量,用于LifecycleEvent事件的type属性中,作用是区分组件发出的lifecycleEvent事件的状态。
2.定义了3个管理监听器方法:addLifecycleListener,findLifecycleListener,removeLifecycleListener,用来添加,查找,删除LifecycleListener类型的监听器。
3.定义了4个生命周期的方法init,start,stop,destroy,用于执行生命周期的各个阶段的操作。
4.定义了getState,getStateName,用来获取当前状态,getState的返回值是LifecycleState的枚举类型。里面列举了生命周期的各个节点。而getStateName则是返回String类型的状态的名字。
lifecycle的默认实现是LifecycleBase,所有实现了生命周期的组件基本都是直接或者间接继承这个类,其为接口Lifecycle的接口方法都给了实现。
监听器的管理是LifecycleSupport类完成的,其定义了一个LifecycleListenner数组属性来保存所有的监听器。然后定义了添加,删除,查找,执行监听器的方法;
Container简述
容器:存放编写的代码。分为四层容器。
1.Wrapper:对应一个Servlet。
2.Context:对应一个应用。
3.Host:对应一个站点。
4.Engine对应引擎。每个service只有一个Engine。
Connector简述
负责处理网络连接相关的事情,比如,Socket连接,将其根据HTTP协议,TCP/IP协议封装为Request,Response来具体处理,将其交给Container进行处理,Container就是Servlet的容器。Container处理完就返回给Connector,而Connector使用Socket将处理结果返回给客户端。