整体架构

      • HTTP工作原理
        • 一个请求流程
      • Tomcat整体架构
        • Http服务器请求处理
        • servlet容器工作过程
        • tomcat两个核心
      • 连接器Connector
        • Coyote
        • Coyote与Catalina容器的交互
        • 支持的IO模型与协议
        • 连接器组件
      • 容器Container
        • Catalina
        • Container

HTTP工作原理

● 规定浏览器和服务器之间的数据传输协议,基于TCP/IP协议传递数据,不涉及数据包的传输,主要规范了客户端与服务器端的通信格式

一个请求流程

其中tomcat主要参与接受连接,解析请求数据,处理请求,发送响应结果

  1. 用户通过浏览器进行操作,点击链接等,浏览器获取到这个事件
  2. 浏览器向服务器发出TCP链接请求
  3. 服务程序接收浏览器的请求,通过TCP三次握手建立连接(linux底层握手)
  4. 连接成功后,浏览器将请求数据打包成一个HTTP协议格式的数据包
  5. 浏览器将该数据包推入网络中,数据包经过网络传输,最终达到服务端程序
  6. 服务端程序拿到这个数据包,同样用HTTP协议格式解析,获取到客户端的操作意图(tomcat连接器,封装Request对象)
  7. 根据客户端的操作意图进行处理,提供数据
  8. 服务器将处理响应结果用HTTP再次打包
  9. 服务器将该数据包推入网络中,数据包经过网络传输,最终达到客户端浏览器
  10. 浏览器拿到数据包后,以http协议的格式解析,比如得到html
  11. 浏览器将html展示给用户

Tomcat整体架构

Http服务器请求处理

● http服务器不直接调用业务类,把请求交给Servlet容器来处理
● 容器通过servlet接口调用业务类,实现http服务器与业务类解耦

servlet容器工作过程

● 客户端请求某个资源的时候,http服务器会用一个ServletRequest对象把客户端的请求信息封装起来,调用Servlet容器的service方法
● Servlet容器拿到请求后,根据请求的URL和Servlet的映射关系,找到相应的处理的Servlet
● 如果此时Serlvet容器还没有被加载就会通过反射机制创建这个Servlet,并调用其init方法完成初始化
● 而后调用Servlet的service方法来处理请求
● service处理的结果会被封装到ServletResponse对象中返回给HTTP服务器
● http服务器将响应结果发送给客户端

tomcat两个核心

● 连接器(Connector):负责对外连接。处理Socket连接,负责网络字节流与Request和Response对象的转化
● 容器(Container):负责内部处理。加载和管理Servlet,处理具体Request请求

连接器Connector

Coyote

● tomcat中连接器框架,是tomcat服务器提供客户端访问的外部接口
● 客户端通过Coyote与服务器实现 建立连接、发送请求、接收响应

Coyote与Catalina容器的交互

● Coyote封装了底层网络通信(Socket),为Catalina容器提供统一的接口,使Catalina容器与具体的请求协议和IO操作完全解耦
● Coyote只负责具体协议和IO相关操作,与Servlet规范没有直接关系,Request和Response对象也是在Catalina中对其进一步封装为ServletRequest和ServletResponse
● Coyote将Socket输入的对象封装为Request对象,Servlet相关都交给Catalina处理,由Catalina容器进行请求处理,实现组件之间解耦
● 请求处理完成,Catalina通过Coyote提供的Response将结果写入输出流

支持的IO模型与协议

IO模型

IO模型描述
BIO阻塞IO,tomcat8.5之后移除了对的该IO模型的支持
NIO非阻塞IO,javaNIO类库实现
NIO2异步IO,NIO2类库实现
APR使用Apache可移植运行库实现,需要单独安装APR库

应用层协议

应用层协议描述
HTTP/1.1大部分web协议采用
HTTP/2.0tomcat8.5之后版本支持,大幅度提醒web性能
AJP用于与web服务器集成,实现对静态资源的优化及集群部署
连接器组件

组件作用
EndPointEndpoint是Coyote通信端点,即通信监听的接口,是具体socket接收和发送处理器,是对传输层的抽象; Endpoint用来实现TCP/IP协议
ProcessorProcessor是Coyote协议处理接口,用来实现Http协议;Processor接收来自EndPoint的Socket,读取字节流解析成的Tomcat Request和Response对象,并通过Adapter适配交给容器处理;Processor是对应应用层协议的抽象
ProtocolHandler是Coyote协议接口,通过Endpoint和Processor实现针对具体协议的处理能力;Tomcat按照协议和IO提供6个实现类: AjpNioProtocol, AjpAprProtocol, Http11NioProtocol, Http11Nio2Protocol, Http11AprProtocol
Adapter由于协议不同,客户端发过来的请求信息不尽相同;tomcat定义了自己的Request类来封装这些请求信息;ProtocolHandler接口负责解析请求并生成Tomcat Request类,通过CoyoteAdapter适配为selvert容器可以解析的ServletRequest,执行对应的service方法

EndPoint

  • 对传输对象层的抽象,用来实现TCP/IP协议
  • Coyote通信端口,通信监听的接口,具体Socket的接收和发送处理器
  • tomcat提供了抽象类AbstractEndPoint,定义了Acceptor和SocketProcessor
  • Acceptor:用于监听Socket请求
  • SocketProcessor:用于处理接收到的Socket请求,最终实现Runnable,在run/doRun方法里调用协议处理组件Processor进行处理,为提高性能,SocketProcessor被提交给Executor执行器线程池来管理

Processor

  • 对应用层协议的抽象,EndPoint实现了TCP/IP协议,Processor实现了HTTP协议
  • Coyote协议处理接口,接收EndPoint的Socket
  • 读取字节流解析成Tomcat的Request和Response对象,并通过Adapter将其提交给容器处理

ProtocolHandler

  • Coyote协议接口,同EndPoint和Processor实现针对具体协议的处理能力

Adapter

  • 使用CoyoteAdapter类,适配Request/ServletRequest和Response/ServletRespose的适配器
  • 由于协议不同,tomcat为了兼容,定义了Request类来接收请求信息
  • ProtocolHandler负责解析请求生成Tomcat的Request对象
  • CoyoteAdapter负责将tomcat的Request适配成Servlet可以解析的ServletRequest标准对象
  • 从而调用Servlet的service方法,实现请求、响应能力

容器Container

Catalina
  • tomcat本质是一个Servlet容器,容器的实现由Catalina,涉及到安全、会话、集群、管理等Servlet容器各个方面
  • 通过松耦合方式集成Coyote,完成按照请求协议进行数据读写等

Catalina结构

  • Catalina负责管理Server,Server表示整个服务器。
  • Server下面有多个服务Service,每个Service包含多个多个连接器组件Connector(Coyote实现)和一个容器组件Container。
  • tomcat启动的时候初始化一个Catalina实例
组件功能
Catalina负责解析tomcat配置文件,来创建服务器Server组件并对其进行管理
Server表示整个Catalina Servlet容器及组件,负责组装并启动Servlet引擎,tomcat连接器。通过实现Lifecycle接口,提供一种优雅的启动和关闭整个系统的方式
Service一个Server包含多个Service组件,它将多个Connector组件绑定到一个Container(Engine)上
Connector连接器,处理与客户端的通信,负责接收客户端请求,然后转给相关的容器处理,最终向客户端返回响应结果
Container容器,负责处理用户的servlet请求,返回对象给web用户
Container

Container结构

组件功能
Engine表示整个Catalina的Servlet引擎,用来管理多个host虚拟主机,一个Service最多就一个Engine,一个Engine包含多个Host
Host代表一个虚拟主机,可以给tomcat配置多个虚拟主机地址,一个虚拟主机下面可以包含多个Context
Context表示一个web应用程序,可包含多个Wrapper
Wrapper表示一个(一种?)Servlet,容器最底层