vlambda博客
学习文章列表

tomcat流程简要分析

首先祝大家春节快乐,要放假了,不出意外的话应该是春节后更新了。

介于一些不可逆因素,需要对web服务器的流程做一个整体的简要分析,这里以tomcat为例。(涉及的代码层次不是特别多,主要是了解一下运行的过程)

Servlet容器

Tomcat首先是一个Servlet容器,而Servlet,其实就是Sun为了让Java能实现

动态可交互的网页,从而进入Web编程领域而制定的一套标准。

serlvet功能
(1)创建并填充一个request对象
(2)创建resposed对象
(3)执行服务端逻辑后,将responed发送到客户端
而tomcat扮演的作用就是作为serlvet的容器(serlvet没有main方法)

整体架构

分析内存马提过tomcat的架构,而tomcat中,有两个核心的组件

连接器(Connector):Connector用于处理连接相关的事情,并提供Socket

与Request和Response相关的转化

容器(Container):Container用于封装和管理Servlet,以及具体处Reque

st请求;

来具体理解一下

一个tomcat-->1个server-->多个service-->每一个含有一个container,含有

多个connectors这么来理解 一个tomcat是一个服务器,这个服务器可以有多

个服务,而每个服务只包含了一个容器,但是可以有多个连接。

server.xml

先来看下载的默认配置,能看到一个server包含了Service,Service里面有

连接器和容器。

tomcat流程简要分析

tomcat流程简要分析

组件

接下来我们从上到下看看各个组件的功能
server:tomcat服务器,控制整个系统
service:服务,一个服务器可以有多个服务,下面会有多个组件
connector:连接器,一个服务可能支持多个协议,比如配置文件中的ajp,http.https
container:容器,放置了我们一开始提到的serlvet(网页相关)

serlvet:里面又细分了一些组件
Engine:引擎Host:主机Context:上下文Wrapper:包装器
其他部分组件
Manager -- 管理器,用于管理会话SessionLogger -- 日志器,用于管理日志Loader -- 加载器,和类加载有关,只会开放给Context所使用Pipeline -- 管道组件,配合Valve实现过滤器功能Valve -- 阀门组件,配合Pipeline实现过滤器功能Realm -- 认证授权组件

那么我们就可以来从宏观上来一个请求的生存周期了

  • (1)客户端发送请求,由tomcat的service负责接收

  • (2)service交给connector,由connector进行对http请求和回复进行

封装填充

  • (3)connector将填充好的请求发送给container,然后container负责

对请求进行逻辑处理

  • (4)container将处理好的结果发送给connector,然后返回给客户端

connetcot

connetcot通过调用不同的ProtocolHandler来处理不同协议的请求,ProtocolHandler是一个接口,我这里由AbstractProtocol实现,然后由AbstractAjpProtocol,AbstractHttp11Protocol实现,也就是有两种处理协议请求方式。

tomcat流程简要分析

tomcat流程简要分析

endpoint,能看出来主要是处理socket的相关信息

tomcat流程简要分析

AbstractHttp11Processor,也就是Processor这里出现了request,responsed,猜测这里是封装http请求的,回显那里说过了。通过下面的图能看到,通过AbstractHttp11Processor的构造方法,调用super(endpoint)父类的构造方法,生成了new Request()。

tomcat流程简要分析

tomcat流程简要分析

tomcat流程简要分析

tomcat流程简要分析

最后利用Adapter将Request交给Container进行具体的处理。

tomcat流程简要分析

那么也就是说,在连接器阶段,通过endpoint处理socket的相关信息,然后利用process生成responsed,request,最后交给Adapter,让他继续交给容器进行处理。


Container


Container处理请求是使用Pipeline-Valve管道来处理的。什么意思,就是说在处理的过程中,按照顺序挨个挨个处理,只做自己分内的事情,然后处理完毕,直接向下转交即可。而一个Container包含了四个子容器。其对应的BaseValue分别为StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。那么处理的顺序是怎么样呢,上面我们说了一个容器serlvet有四个组件,则一次按照组件进行处理。对应调用栈的地方。

看前几个管道,都是调用getPipeline().getFirst().invoke(request, response)交给下一个管道处理,而StandardWrapperValve中,却调用了filterChain.doFilter(request.getRequest(), response.getResponse());进行过滤链处理,当然这也次本次调用的最后一个基础管道了。

后续就是对request放入server的一些零碎步骤了,比较繁多,暂不跟了。
那么最后总结一下tomcat的启动流程

(1)连接器阶段通过endpoint处理socket的相关信息,然后利用process生

成responsed,request,最后交给Adapter,让他继续交给容器进行处理。

(2)容器阶段调用不同的Pipeline-Valve管道对请求进行处理,最后放入fi

lter链中处理。

(3)处理完成后交给servlet对信息进行处理。

以上分析略显粗糙,详细的细节比如组件的生命周期一类以及管道的详细知识

没有说。有兴趣就多跟多了解一下。