Tomcat两大组件:Connector 和 Container
一个Container 可以对应多个 Connector ,然后他们一起组成一个service,service只是在他们外面包了一层,把他们组装到一起,对外提供服务
Server:一个Server管理多个Service,Server可以管理Service的生命周期,控制Server的是Tomcat的startup,Server会继续调用Service的start
Service:标准实现类是StandService,它不仅实现了Service,还实现了Lifecycle接口,这样就可以控制下面组件的生命周期
Connector:负责接收浏览器过来的TCP连接请求,创建一个request和response,用于和请求端交换数据
Connector一次处理时序图:
Container :容器的父接口,Container容器的设计用的是责任链模式,
4个子容器分别是:Engine、Host、Context、Wrapper,他们是从上往下包含的关系
一个Wrapper通常对应一个Servlet类
一个Engine代表一个完整的Servlet引擎
Host不是必须的,但是如果是war程序,就必须要有Host容器,因为war包下的web.xml文件,需要Host容器解析
Engine:标准实现类是StandardEngine,engine没有父容器,添加的子容器也只能是Host类型的
Host:标准实现类是StandardHost,Engine的子容器,一个host代表一个虚拟主机,虚拟主机的作用就是运行多个应用,StandardHost实现了Deployer,可以通过里面的方法完成应用的部署
Context:Context代表servlet的Context,它具备了Servlet运行的基本环境,理论上只要有context就可以运行servlet了,
主要作用:设置各种资源的属性和管理组件,启动子容器和Pipeline
Context配置文件中有个reloadable属性,为true时,war包被修改会自动加载这个应用
条件是reloadable为true,并且应用被修改,调用reload方法,reload会先stop再start,reload方法是在backgroundProcess中调用,这个方法是在ContainerBase周期性调用的,因为所以的容器都继承了ContainerBase,所以所有容器都能在backgroundProcess周期执行
<Context path="/" docBase="/usr/local/tomcat/apache-tomcat-8.5.55/webapps/ruoyi" reloadable="false"></Context>
Wrapper:代表一个Servlet,负责管理一个Servlet,包含Servlet整个生命周期
实现类是StandardWrapper,StandardWrapper还实现了一个拥有Servlet初始化信息的ServletConfig
当Servlet装载完成,开始初始化时,需要传入一个对象,StandardWrapperFacade对象,这个对象实现了ServletConfig接口,Servlet可以获取的信息都在这个对象里面,所以Servet可以通过ServletConfig获取有限的容器信息,Servlet初始化完成以后,由StandardWrapperValve去调用他的Service方法,调用Service方法之前要先调用Servlet的所有filter
Tomcat中的设计模式:
1.门面设计模式
假设多个子系统要相互通信,但是系统之间不能过多暴露数据,通过增加一个门面,将其他系统感兴趣的内容封装在里面
StandardWrapperFacade 就是 ServletConfig的门面
HttpRequestFacade 就是 HttpRequest的门面
2.观察者模式
通常也可以说是发布订阅模式,也就是事件监听机制
几个角色:
Subject 抽象主题,负责管理所有观察者的引用,同时定义事件操作
ConcreteSubject 具体主题,实现了抽象主题的所有接口,当自己发生变化通知观察者
Observer 观察者 监听主题发生变化的操作接口
Tomcat中的例子: lifecycle , session管理, servlet的创建
3.命令模式 Connector就是通过命令模式调用的Container的
命令模式通常包含以下几个角色:
Client:创建一个命令
Command:命令接口
ConcreteCommand:具体命令
Invoker:请求者
Receiver:接收者
Connector作为抽象请求者,HttpConnector作为具体请求者,HttpProcessor作为命令,Container作为命令的抽象接收者,ContainerBase作为具体的接受者,客户端就是应用服务器Server组件。Server首先创建命令请求者HttpConnector,创建命令HttpProcessor对象,最后交给ContainerBase容器处理
4.责任链模式
就是很多对象由每个对象对下家的引用而连接形成一条链,请求在链上传递,直到链上某个对象处理该请求,或者每个对象都处理,并传给下家,
责任链的角色:
Handle:抽象处理者
ConcreteHandle:具体处理者
Container是抽象处理者,具体处理者从Engine到Host到Context到Wrapper形成一个链
这里又引入了Pipeline 和 Valve扩展了链的功能,链在传递的过程中Pipeline就是连接每个子容器的管子,里面传递的Request和Response相当于管子里的水,,而valve就是在管子上开个小口子,让你有机会接触到里面的水,做一些额外的事,为了防止水不流入下个容器,最后总有一个节点保证,所以每个容器都有一个StandardXXXValve