整体架构

  我们想要了解一个框架,首先要了解它是干什么的,Tomcat我们都知道,是用于处理连接过来的Socket请求的。那么Tomcat就会有两个功能:

    • 对外处理连接,将收到的字节流转化为自己想要的Request和Response对象
    • 对内处理Servlet,将对应的Request请求分发到相应的Servlet中

  那么我们整体的骨架就出来了,Tomcat其实就分为两大部分,一部分是连接器(Connnector)处理对外连接和容器(Container)管理对内的Servelet。

  大体的关系图如下:

  

  

  描述:

    最外层的大框就是代表一个Tomcat服务,一个Tomcat服务可以对应多个Service。每个Service都有连接器和容器。

    这些对应的关系我们也可以打开在Tomcat目录配置文件中 server.xml中看出来。

<Server port="8006" shutdown="SHUTDOWN">
<Service name ="Catalina">
<Connector port ="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443"/>
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"></Host>
</Engine>
</Service>
</Server>

  这里我们可以看到连接器其实就是 Connector,一个Service中可以有多个连接器,容器其实对应的就是 Engine

  Tomcat的整体架构简单来说就是这样的对应关系。接下来我们简单的介绍连接器的整体架构和容器的整体架构。

连接器

  我们可以看到上图中连接器传给容器的是 ServletRequest对象,而容器传给连接器的是 ServletResponse对象,这些在网络传输过程中是肯定不行的,因为网络传输中传送的字节流。

  所以连接器的功能需求我们大概能总结出来以下几点。

    • Socket连接
    • 读取请求网络中的字节流
    • 根据相应的协议(Http/AJP)解析字节流,生成统一的 TomcatRequestt对象
    • 将 TomcatReques传给容器
    • 容器返回 TomcatResponse对象
    • 将 TomcatResponse对象转换为字节流
    • 将字节流返回给客户端

  其实上面的细分都能总结为以下的三点

    • 网络通信
    • 应用层协议的解析
    • Tomcat的 Request/Response与 ServletRequest/ServletResponse对象的转化

  而在Tomcat中它也用了三个类来实现上面的三个功能,分别对应如下

    • EndPoint
    • Processor
    • Adapter

  用图表示他们的关系的话就是这样

   

容器

  容器,顾名思义就是装东西的器具,那么这个Tomcat容器是装什么的呢?其实主要的就是装了Servlet的。

  那么容器是如何设计的呢?Tomcat的容器设计其实是用了组合设计模式(不了解组合设计模式的可以看我之前的文章不学无数——组合模式)。

  其实从 Server.xml中我们也能看到其关系了。

<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host>
</Engine>

  在这里面我们只能看到容器中的两个模块,一个是顶层模块 Engine,另一个是 Host

  其实还有两个模块:

    一个是 Context对应的是我们webapp里面的每个应用文件夹,每个文件夹就是对应一个 Context

    还有一个模块 Wrapper对应的是我们 Context中的所有servlet, Wrapper管理了访问关系与具体的Servlet的对应。图表示就是下面这样。

  

  Tomcat中容器所有模块都实现了 Container接口,而组合模式的意义就是使得用户对于单个对象和组合对象的使用具有一致性,

  即无论添加多少个 Context其使用就是为了找到其下面的Servlet,而无论添加多少个Host也是为了找个下面的Servlet。

  而在容器中设计了这么多的模块,一个请求过来Tomcat如何找到对应的Servlet进行处理呢?

请求如何定位

  我们就举个最简单的例子,我们本机应用上启动了一个Tomcat,webapp下有我们部署的一个应用 buxuewushu

  我们在浏览器上输入 http://localhost:8080/buxuewushu/add.do是如何找到对应Servlet进行处理呢?

  在我们启动Tomcat的时候,连接器就会进行初始化监听所配置的端口号,这里我们配置的是8080端口对应的协议是HTTP。

    • 请求发送到本机的8080端口,被在那里监听的HTTP/1.1的连接器Connector获得
    • 连接器Connector将字节流转换为容器所需要的 ServletRequest对象给同级 Service下的容器模块Engine进行处理
    • Engine获得地址 http://localhost:8080/buxuewushu/add。匹配他下面的Host主机
    • 匹配到名为localhost的Host(就算此时请求为具体的ip,没有配置相应的Host,也会交给名为localhost的Host进行处理,因为他是默认的主机)
    • Host匹配到路径为 /buxuewushu的Context,即在webapp下面找到相应的文件夹
    • Context匹配到URL规则为*.do的servlet,对应为某个Servlet类
    • 调用其 doGet或者 doPost方法
    • Servlet执行完以后将对象返回给Context
    • Context返回给Host
    • Host返回给Engine
    • Engine返回给连接器Connector
    • 连接器Connector将对象解析为字节流发送给客户端

  

Tomcat系列(一)- 整体架构的更多相关文章

  1. Bootstrap源码分析系列之整体架构

    作为一名合格的前端工程师,你肯定听说过Bootstarp框架.确实可以说Bootstrap框架是最流行的前端框架之一.可是也有人说Bootstrap是给后端和前端小白用的,我认为只要学习它能给我们前端 ...

  2. LevelDB系列之整体架构

    LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口.为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动态角度.从静态角度,可以假想整个系 ...

  3. Spark系列(四)整体架构分析

    架构流程图 说明  Driver端流程说明(Standalone模式) 使用spark-submit提交Spark应用程序Application. 通过反射的方式创建和构造一个DriverActor进 ...

  4. SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  5. tomcat原理解析(二):整体架构

    一 整体结构 前面tomcat实现原理(一)里面描述了整个tomcat接受一个http请求的简单处理,这里面我们讲下整个tomcat的架构,以便对整体结构有宏观的了解.tomat里面由很多个容器结合在 ...

  6. Tomcat源码(一):整体架构

    由于tomcat的组件较多,处理流程比较复杂 ,这里是 由浅到深来解释tomcat的整体架构 1.首先应该大致了解下tomcat的 /conf/server.xml  配置文件:在tomcat启动的时 ...

  7. Tomcat源码分析二:先看看Tomcat的整体架构

    Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...

  8. Tomcat的整体架构

    Tomcat通过连接器和容器这两个核心组件完成整体工作,连接器负责处理socket连接和网络字节流与Request和Response对象的转化:容器负责加载和管理Servlet,以及具体处理Reque ...

  9. 深入理解Tomcat系列之一:系统架构(转)

    前言 Tomcat是Apache基金组织下的开源项目,性质是一个Web服务器.下面这种情况很普遍:在eclipse床架一个web项目并部署到Tomcat中,启动tomcat,在浏览器中输入一个类似ht ...

随机推荐

  1. 【Linux系列】Centos 7安装 Mysql8.0(五)

    目的 本文主要介绍以下两点: 一. 如何安装Mysql8.0 二. Navicat连接Mysql 一. 如何安装Mysql8.0 安装Mysql有两种方式: 直接下载官方的源(比较慢) https:/ ...

  2. 找到了element, 但是用getText却得到空值,取不到文本的解决办法

    最近代码中发现一些bug, 在Debug过程中发现,页面元素是被定位到了,但是用getText方法取到的却是空值.调查了一下发现,getText是否返回值和isDisplayed是否为true有关.当 ...

  3. python3 之 内置函数enumerate

    python3 内置函数enumerate一.简介: 该函数在字面上是枚举.列举的意思,用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列, 同时列出数据和数据下标,一般用在 for ...

  4. 【NHOI2018】黑格覆盖

    [题目描述] 在一张由 M * N 个小正方形格子组成的矩形纸张上,有 k 个格子被涂成了黑色.给你一张由 m * n 个同样小正方形组成的矩形卡片,请问该卡片最多能一次性覆盖多少个黑格子? [输入数 ...

  5. jQuery学习笔记3

    * 动画效果 * 在一定的时间内, 不断改变元素样式 * slideDown()/slideUp()/slideToggle() * fadeOut()/fadeIn()/fadeToggle() * ...

  6. JavaScript笔记七

    1.函数 - 返回值,就是函数执行的结果. - 使用return 来设置函数的返回值. - 语法:return 值; - 该值就会成为函数的返回值,可以通过一个变量来接收返回值 - return后边的 ...

  7. SpringMVC配置了拦截器(interceptors)却显示不出css、js样式的解决办法

    首先因为在web.xml里面配置了 <filter-mapping> <filter-name>characterEncodingFilter</filter-name& ...

  8. 个人收藏--未整理—C# http/https 上传下载文件

    c# HTTP/HTTPS 文件上传. 分类: .net 2015-02-03 08:36 541人阅读 评论(0) 收藏 举报 方法主体 [csharp] view plaincopy public ...

  9. PowerMock学习(九)之Mock Answer的使用

    关于Mock Answer 上一篇文章,有介绍过关于Arguments Matche的使用,其实 Answer的作用与其比较类似,但是它比 Arguments Matcher 更加强大. Argume ...

  10. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(4)- OTP及其烧写方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的OTP. 在i.MXRTxxx启动系列第二篇文章 Boot配置(ISP Pin, OTP) 里痞子 ...