介绍
Tomcat是全世界最著名的基于Java语言的轻量级应用服务器,是一款完全开源免费的Servlet容器实现。同时,它支持HTML、JS等静态资源的处理,因此又可以作为轻量级Web服务器使用。
图说架构设计
1. Server
通过start()
方法启动服务器,打开Socket链接,监听服务器端口,并负责在接收到客户端请求时进行处理并返回。同时提供一个stop()
方法来停止服务器并释放网络资源。
2. Connector和Container
隔离网络协议和请求处理。
1
一个Server可以包含多个Connector和Container。其中Connector负责开启Socket并监听请求、返回响应数据。Container负责具体的请求处理,
优化
1
一个Server包含多个Service,共享一个JVM以及系统类库
优化
为了和Tomcat保持一致,将Container重命名为Engine,用以表示Servlet引擎。
3. Container设计
3.1 Context
Context
Context表示一个Web应用,一个Engine可以包含多个Context
- Host
Host表示虚拟主机,一个Context可以包含多个Host
Servlet
一个Web应用中可以包含多个Servlet实例以处理来自不同链接的请求
Container
使用Container表示容器,因此Engine、Host、Context、Wrapper均继承自Container;Tomcat的Container可以表示不同的概念级别:Servlet引擎、虚拟主机、web应用、Servlet。
3.2 Lifecycle
生命周期管理接口,支持组件状态以及状态之间的转换,支持添加事件监听器用于监听组件的状态变化
1 | init():初始化组件 |
3.3 Pipeline和Value
提升每个组件的灵活性,使其方便扩展;Tomcat使用了责任链模式来处理客户端请求。定义Pipeline和Value两个接口,前者用于构造责任链,后者表示责任链上的处理器;来自客户端的请求像是流经管道的水一样,经过每一个阀进行处理。
Pipeline中维护了一个基础的Value,它始终位于Pipeline的尾端最后执行,封装了具体的请求和输出响应的过程。然后,通过addValue()方法,我们可以为Pipeline添加其他的Value,后面添加的Value位于基础的Value之前,并按照添加顺序执行。Pipeline通过获得首个Value来启动整个链条的执行。
Tomcat容器组件的灵活之处在于,每一个层级的容器都有对应的Value实现,同时维护了一个Pipeline实例,也就是说,我们可以在任何层级的容器上对请求进行处理。
4. Connectar设计
1 | 功能: |
ProtocolHandler表示协议处理器,针对不同的协议和IO方式,提供了不同的实现;比如:Http11NioProtocol
包含一个Endpoint用于启动Socket监听,该接口按照IO方式进行分类实现;比如:Nio2Endpoint
还包含了一个Processor用于按照指定的协议读取数据,并将请求交由容器处理。比如:Http11NioProcessor
Mapper:维护容器映射信息,按照映射规则查找容器
MapperListener:实现了ContainerListener和LifecycleListener,用于在容器组件状态发生变化时,注册或者取消对应的容器映射信息。
总的来说,Connector启动时候,Endpoint会启动线程来监听服务端口,并在接收到请求后调用Processor进行数据读取。
4.1 Executor
4.2 Bootstrap和Catalina
Tomcat通过类Catalina提供了一个shell程序,用于解析server.xml创建各个组件,同时负责启动、停止应用服务器。
Tomcat使用Digester解析XML文件,包括server.xml以及web.xml等
最后,Tomcat提供了Bootstrap作为应用服务器启动入口,Bootstrap负责创建Catalina实例,根据参数调用Catalina相关方法完成针对应用服务器的操作。
Ps:Tomcat提供了一个同名类org.apache.catalina.startup.Tomcat
,使用它我们可以将Tomcat服务器嵌入到我们的应用服务并进行使用。