Tomcat消息处理流程

                                                                                                                                                                图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有何相似和区别?

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值