图1-1
一、前言
平时我们都将项目扔给Tomcat就行了,做了撒手掌柜,没接触过JavaEE项目,对于请求从服务器接收后的处理流程模棱两可,不利于对Web项目的理解,我们现在把项目和服务再次串起来看,回顾一下web处理的流程,也是web发展的流程:
二、概览:
tomcat整体的流程如上图1-1所示,总的分为数据解析和容器两部分
三、实例
1、如何理解各个组件的层级关系,在我们配置时有什么体现:
上边的图片显示了部分层级关系,上层包含在下层组件中,如果可以包含多个则如图所示有多个,
在Tomcat服务配置时我们可以看到这种体现:
四、详述
我们可以看到一个service中有两个并列的组件,一个是Connector连接器,一个是Engine容器,为什么这么设计那?
Tomcat 设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情:连接器负责对外交流,容器负责内部处理。
上边两个组件用来实现Tomcat的两个主要功能:
2 个核心功能:
1)处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化。
2)加载和管理 Servlet,以及具体处理 Request 请求。
如下图所示,两个组件分别实现两个主要功能,实现了解耦,网络服务器可以专心配置高效的的网络处理,容器则负责容纳不同的服务:
Tomcat 为了实现支持多种 I/O 模型和应用层协议,一个容器可能对接多个连接器,就好比一个房间有多个门。但是单独的连接器或者容器都不能对外提供服务,需要把它们组装起来才能工作,组装后这个整体叫作 Service 组件
1、连接器(数据解析):
连接器对 Servlet 容器屏蔽了协议及 I/O 模型等的区别,无论是 HTTP 还是 AJP,在容器中获取到的都是一个标准的 ServletRequest 对象。
我们可以把连接器的功能需求进一步细化:
监听网络端口。
接受网络连接请求。
读取网络请求字节流。
根据具体应用层协议(HTTP/AJP)解析字节流,生成统一的 Tomcat Request 对象。
将 Tomcat Request 对象转成标准的 ServletRequest。
调用 Servlet 容器,得到 ServletResponse。
将 ServletResponse 转成 Tomcat Response 对象。
将 Tomcat Response 转成网络字节流。将响应字节流写回给浏览器。
总的来说:
连接器需要完成 3 个高内聚的功能:
1)网络通信。
2)应用层协议解析。
3)Tomcat Request/Response 与 ServletRequest/ServletResponse 的转化。
因此连接器有对应的三个组件处理相应功能:
分别是 Endpoint、Processor 和 Adapter。Endpoint 负责提供字节流给 Processor,Processor 负责提供 Tomcat Request 对象给 Adapter,Adapter 负责提供 ServletRequest 对象给容器
这样做还有一个好处是封装变化,例如根据不同的IO模型和应用层协议,可以自由的实现组合如,Tomcat设计了protocolHandler来封装这种组合,如Http11NioProtocol 和 AjpNioProtocol。
总体流程图如下图:
详细流程图如下举例:
2、通过上一步就把Tomcat的request对象转换成servletRequest对象,交给容器处理。
3、容器:
各种容器之间是父子关系的,这种分层架构有很强的灵活性(注意,虽然是父子关系,但是各个组件之间不是通过继承实现的,而是通过组合实现的)
Context 表示一个 Web 应用程序;Wrapper 表示一个 Servlet,一个 Web 应用程序中可能会有多个 Servlet;Host 代表的是一个虚拟主机,或者说一个站点,可以给 Tomcat 配置多个虚拟主机地址,而一个虚拟主机下可以部署多个 Web 应用程序;Engine 表示引擎,用来管理多个虚拟站点,一个 Service 最多只能有一个 Engine。
一层中有多个不同的组件,请求来了yao定位到其中的哪一个那?
Mapper 组件里保存了 Web 应用的配置信息,其实就是容器组件与访问路径的映射关系,比如 Host 容器里配置的域名、Context 容器里的 Web 应用路径,以及 Wrapper 容器里 Servlet 映射的路径,你可以想象这些配置信息就是一个多层次的 Map。这也就是我们的项目访问地址是咋回事了。
容器整体处理流程:
各层的详细作用和处理流程如下图:
四、问答:
1、容器组件如何实现一键启停:
五、思考题
看了上边的组件和处理过程留一个思考题给大家:
Tomcat和Netty有何相似和区别?