详细讲解Tomcat系统架构


详细讲解Tomcat系统架构

文章插图
 
Tomcat 或者 Jetty 就是一个“HTTP 服务器 + Servlet 容器”,我们也叫它们 Web 容器 。
详细讲解Tomcat系统架构

文章插图
 
Spring 框架就是对 Servlet 的封装,Spring 应用本身就是一个 Servlet,而 Servlet 容器是管理和运行 Servlet 的 。
详细讲解Tomcat系统架构

文章插图
 
Servlet 接口和 Servlet 容器这一整套规范叫作 Servlet 规范 。Tomcat 和 Jetty 都按照 Servlet 规范的要求实现了 Servlet 容器 。
Servlet 容器工作流程:
当客户请求某个资源时,HTTP 服务器会用一个 ServletRequest 对象把客户的请求信息封装起来,然后调用 Servlet 容器的 service 方法,Servlet 容器拿到请求后,根据请求的 URL 和 Servlet 的映射关系,找到相应的 Servlet,如果 Servlet 还没有被加载,就用反射机制创建这个 Servlet,并调用 Servlet 的 init 方法来完成初始化,接着调用 Servlet 的 service 方法来处理请求,把 ServletResponse 对象返回给 HTTP 服务器,HTTP 服务器会把响应发送给客户端 。
详细讲解Tomcat系统架构

文章插图
 
Servlet 规范提供了两种扩展机制:Filter和Listener 。
  • Filter 是干预过程的,它是过程的一部分,是基于过程行为的 。
  • Listener 是基于状态的,任何行为改变同一个状态,触发的事件是一致 。
一、Tomcat系统架构Tomcat 要实现 2 个核心功能:
  • 处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化 。
  • 加载和管理 Servlet,以及具体处理 Request 请求 。
因此 Tomcat 设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情 。连接器负责对外交流,容器负责内部处理 。
详细讲解Tomcat系统架构

文章插图
 
1,连接器
连接器需要完成 3 个高内聚的功能:
  • 网络通信 。
  • 应用层协议解析 。
  • Tomcat Request/Response 与 ServletRequest/ServletResponse 的转化 。
因此 Tomcat 的设计者设计了 3 个组件来实现这 3 个功能,分别是 EndPoint、Processor 和 Adapter 。
Endpoint 和 Processor 放在一起抽象成了 ProtocolHandler 组件,连接器用 ProtocolHandler 来处理网络连接和应用层协议 。
详细讲解Tomcat系统架构

文章插图
 
EndPoint 是一个接口,它的抽象实现类 AbstractEndpoint 里面定义了两个内部类:Acceptor 和 SocketProcessor 。其中 Acceptor 用于监听 Socket 连接请求 。SocketProcessor 用于处理接收到的 Socket 请求 。
EndPoint 接收到 Socket 连接后,生成一个 SocketProcessor 任务提交到线程池去处理,SocketProcessor 的 Run 方法会调用 Processor 组件去解析应用层协议,Processor 通过解析生成 Request 对象后,会调用 Adapter 的 Service 方法 。
详细讲解Tomcat系统架构

文章插图
 
2,容器
Tomcat 设计了 4 种容器,分别是 Engine、Host、Context 和 WrApper 。这 4 种容器不是平行关系,而是父子关系 。
详细讲解Tomcat系统架构

文章插图
 
【详细讲解Tomcat系统架构】Context 表示一个 Web 应用程序;Wrapper 表示一个 Servlet,一个 Web 应用程序中可能会有多个 Servlet;Host 代表的是一个虚拟主机,或者说一个站点,可以给 Tomcat 配置多个虚拟主机地址,而一个虚拟主机下可以部署多个 Web 应用程序;Engine 表示引擎,用来管理多个虚拟站点,一个 Service 最多只能有一个 Engine 。
请求定位 Servlet 的过程:Tomcat 会创建一个 Service 组件和一个 Engine 容器组件,在 Engine 容器下创建两个 Host 子容器,在每个 Host 容器下创建两个 Context 子容器 。由于一个 Web 应用通常有多个 Servlet,Tomcat 还会在每个 Context 容器里创建多个 Wrapper 子容器 。
详细讲解Tomcat系统架构

文章插图
 
每一个容器都有一个 Pipeline 对象 。
详细讲解Tomcat系统架构

文章插图
 
3,一个请求在 Tomcat 中流转的过程:
详细讲解Tomcat系统架构

文章插图
 
4,startup.sh 启动 tomcat 的过程:


推荐阅读