整体架构

  我们想要了解一个框架,首先要了解它是干什么的,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. RNN-LSTM讲解-基于tensorflow实现

    cnn卷积神经网络在前面已经有所了解了,目前博主也使用它进行了一个图像分类问题,基于kaggle里面的food-101进行的图像识别,识别率有点感人,基于数据集的关系,大致来说还可行.下面我就继续学习 ...

  2. react 组件间通信,父子间通信

    一.父组件传值给子组件 父组件向下传值是使用了props属性,在父组件定义的子组件上定义传给子组件的名字和值,然后在子组件通过this.props.xxx调用就可以了. 二.子组件传值给父组件 子组件 ...

  3. 2019-10-24:伪静态,VULHUB搭建靶场,宽字节sql注入,笔记

    伪静态1,需要开启站点的重写机制,需要修改配httpd配置文件,将LoadModule rewrite_module modules/mod_rewrite.so注释取消,需要apache支持解析.h ...

  4. mac系统下docker安装配置mysql详细步骤

    上文介绍了MacOS安装Docker傻瓜式教程,安装好后第一件事就决定把本地数据库迁移过来,那么首先就得安装mysql,下面就开始我们的安装之旅吧. 一.docker配置镜像加速器 我们使用docke ...

  5. 04_seaborn基本使用

    1.seaborn设置整体风格 seaborn提供5中主题风格: darkgrid whitegrid dark white ticks 主要通过set()和set_style()两个函数对整体风格进 ...

  6. 小白的springboot之路(二)、集成swagger

    0-前言 现在的项目开发,基本都是前后端分离,后端专注于API接口开发,都需要编写和维护API接口文档.如果你还在用Word来编写接口文档,那你就out了,这个时候,当当当当~神兵利器swagger隆 ...

  7. shell脚本exercise2

    通过文件里面的网址,判断是否访问成功网址 #!/bin/bash check(){ code=`curl -I -m -o /dev/null -s -w %{http_code} http://$u ...

  8. ThinkPHP5入门(基础篇)

    ThinkPHP是一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架,自2006年诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简代码的同时,尤其注重开发体验和易用性,并且拥有众多的 ...

  9. Hadoop 维护总结

    1. 启动 history ./sbin/mrjobhistorydaemon.sh start historyserver ./sbin/yarn-daemon.sh start proxyserv ...

  10. 揭秘 iOS App Extension 开发 —— Today 篇

    转自:http://www.cocoachina.com/ios/20160619/16760.html 本文授权转载,作者:Cyandev(简书) 从 iOS 8 开始,苹果引入了全新的 App E ...