前面的http及socket两部分内容,主要是为了后面看Tomcat源代码而学习的一些网络基础。从这章開始。就開始实际深入到Tomcat的‘内在’去看一看。

在分析Tomcat的源代码之前,准备先看一下Tomcat的架构与一些核心类的简单分析,并简介一下Tomcat是怎样处理一次Http请求的。

这部分内容有相当一部分来源于网络。在此,感谢原作者的贡献。

  1. Tomcat的整体架构

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpemlhaXNodWlqaWFv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

Tomcat的架构关系能够从Tomcat的配置文件server.xml中看到端倪。

从上图中能够看出Tomcat 的心脏是两个组件:Connector 和 Container,关于这两个组件将在后面具体介绍。

Connector 组件是能够被替换,这样能够提供给server设计者很多其它的选择,由于这个组件是如此重要,不仅跟server的设计的本身,并且和不同的应用场景也十分相关。所以一个 Container 能够选择相应多个 Connector。多个 Connector 和一个 Container 就形成了一个 Service,Service 的概念大家都非常熟悉了,有了 Service 就能够对外提供服务了。可是
Service 还要一个生存的环境。必需要有人可以给她生命、掌握其生死大权,那就非 Server 莫属了。所以整个 Tomcat 的生命周期由 Server 控制。

Connector又叫连接器。它的主要任务是接收浏览器发过来的Tcp连接请求(说白了就是上一章讲的Socket请求),依据请求行,请求头,请求正文信息创建一个Request和Response(这个Request和Response我想大家都再熟悉只是了,尽管他还不是真正的HttpServletRequest与HttpServletResponse,但确实是有关的。姑且如今就当它是。这部分内容在后面的章节后讲到)。

然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理这个请求的线程。处理这个请求的线程就是
Container 组件要做的事了。

在一个Service中,Connector能够有多个,每个Connector相应了一种不同的处理协议。在Tomcat中默认支持的是Http与AJP协议,所以Tomcat中实现了HttpConnector与AjpConnector。可是Container仅仅有一个。Connector与Container是多对一的关系。例如以下:

说白了,Service 仅仅是在 Connector 和 Container 外面多包一层,把它们组装在一起。向外面提供服务,一个 Service 能够设置多个 Connector,可是仅仅能有一个 Container 容器。

2.  Tomcat处理一次请求的过程

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpemlhaXNodWlqaWFv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" width="593" height="237">

上面的图形简单描绘了Tomcat解析一次请求的大致过程。

图中仅仅简单描绘了Tomcat处理的几个重要节点。里面包含对的非常多其它组件,比方:processor,Engine,Host。Context等都没有描绘出来,这些细节在后面的章节一边学习一面总结。

在Container接收到Request后,依据Request中请求的URL,解析出要请求的Servlet,依据配置文件(一般为应用中web.xml中的Servlet或其它可訪问资源)获得起路径后,使用对应的类载入器载入Servlet,然后调用其Service方法。

余下的就是客户自己编写的Servlet进行工作了。

3、Tomcat核心类



Tomcat代码看似非常庞大,但从结构上看却非常清晰和简单。它主要由一堆组件组成。如Server、Service、Connector等。并基于JMX管理这些组件,另外实现以上接口的组件也实现了代表生存期的接口Lifecycle,使其组件履行固定的生存期,在其整个生存期的过程中通过事件侦听LifecycleEvent实现扩展。

Catalina:与開始/关闭shell脚本交互的主类,因此假设要研究启动和关闭的过程,就从这个类開始看起。

Server:是整个Tomcat组件的容器,包括一个或多个Service。

Service:Service是包括Connector和Container的集合。Service用适当的Connector接收用户的请求,再发给对应的Container来处理。

Connector:实现某一协议的连接器,如默认的有实现HTTP、HTTPS、AJP协议的。

Container:能够理解为处理某类型请求的容器。处理的方式一般为把处理请求的处理器包装为Valve对象,并按一定顺序放入类型为Pipeline的管道里。

Container有多种子类型:Engine、Host、Context和Wrapper。这几种子类型Container依次包括,处理不同粒度的请求。

另外Container里包括一些基础服务。如Loader、Manager和Realm。

Engine:Engine包括Host和Context。接到请求后仍给对应的Host在对应的Context里处理。

Host:就是我们所理解的虚拟主机。

Context:就是我们所部属的详细Web应用的上下文,每一个请求都在是对应的上下文里处理的。

Wrapper:Wrapper是针对每一个Servlet的Container。每一个Servlet都有对应的Wrapper来管理。

能够看出Server、Service、Connector、Container、Engine、Host、Context和Wrapper这些核心组件的作用范围是逐层递减,并逐层包括。

參考:

Tomcat 系统架构与设计模式。第 1 部分: 工作原理

CSDN cutesource博客 Tomcat源代码分析

上一篇:Tomcat 学习进阶历程之Socket

下一篇:Tomcat 学习进阶历程之Tomcat启动过程分析

Tomcat 学习进阶历程之Tomcat架构与核心类分析的更多相关文章

  1. Tomcat学习之二:tomcat安装、配置及目录文件说明

    我们看到tomcat目录/bin文件夹里有个tomcat6w.exe,顾名思义就是tomcat以window方式显示控制台.第1次点击打开它时候,可能会提示:tomcat指定的服务未安装,此时我们可以 ...

  2. Tomcat学习笔记 - 错误日志 - Tomcat部署项目或修改xml配置出现无法保存的情况(拒绝访问)

    原因分析:(windows下) 可能有人会发现在编辑好 tomcat-users.xml 文件后无法保存,原因是使用的用户没有权限修改文件,可能是把 Tomcat 发行包放到了一个需要管理员权限才能修 ...

  3. Tomcat学习笔记 - 错误日志 - Tomcat访问Manager apps出现401 Unauthorized错误

    原因是配置文件中未指定管理员身份. 打开tomcat>conf>tomcat-user.xml文件,添加如下代码: <role rolename="admin-gui&qu ...

  4. Tomcat学习笔记 - 错误日志 - Tomcat安装版安装后第二次启动后闪退(转)-- javac不是内部或外部命令 -- 配置java环境教程

    如果安装成功并且安装完成第一次启动是成功的,第二次就闪退的话,原因之一是没有配置java的环境.在网上找的配制方法有很多错误,测试javac命令时候会提示不是内部或外部命令,找到一个正确的教程.如下, ...

  5. Tomcat学习总结(7)——Tomcat与Jetty比较

    Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器. 它有一个基本数据模型,这个数据模型就是 Handler(处理 ...

  6. 【tomcat系列】详解tomcat架构(上篇)

    java中,常用的web服务器一般由tomcat,weblogic,jetty,undertwo等,但从用户使用广泛度来说,tomcat用户量相对比较大一些,当然这也基于它开源和免费的特点. 从软件架 ...

  7. Tomcat学习记录

    阅读摘录如下: 本质 Tomcat最本质就是个能运行JSP/Servlet的Web服务器 , 因此最典型的应用就是用户通过浏览器访问服务器,Tomcat接收到请求后转发给Servlet,由Servle ...

  8. Tomcat学习—Tomcat的简介和目录以及配置文件介绍(Windows环境)

    tomcat学习(8) 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天学习TOMCAT,主要学习的是Tomcat的目录结构,配置文件! 1:Tomcat简介 Tomcat 服务器是一个免费 ...

  9. 搭建 Keepalived + Nginx + Tomcat 的高可用负载均衡架构

    1 概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已无法承载现有的业务量 ...

随机推荐

  1. String.format("%0"+length+"d", arr)中的%0和"d"分别代表什么

    public static void main(String[] args) { int a = 8; String s = String.format("%04d", a); S ...

  2. mac 安装 composer

    使用 curl 指令下载: curl -sS https://getcomposer.org/installer | php 或是沒有安裝 curl ,也可以用 php 指令下载: php -r &q ...

  3. IntelliJ IDEA的几种常见的快捷键

    在编写代码的时候直接输入psv就会看到一个psvm的提示,此时点击tab键一个main方法就写好了. psvm 也就是public static void main的首字母. 依次还有在方法体内键入f ...

  4. delphi 自定义内存管理

    1.主要通过GetMemoryManager来hook原来的内存管理. 2.通过SetMemoryManager来设置你自己的新的内存管理,可以用一个内存池来优化和管理程序的内存调用情况. proce ...

  5. (转)Android项目重构之路:实现篇

    前两篇文章Android项目重构之路:架构篇和Android项目重构之路:界面篇已经讲了我的项目开始搭建时的架构设计和界面设计,这篇就讲讲具体怎么实现的,以实现最小化可用产品(MVP)的目标,用最简单 ...

  6. HDU 4372 - Count the Buildings(组合计数)

    首先想过n^3的组合方法,即f(i,j,k)=f(i-1,j,k)*(i-2)+f(i-1,j-1,k)+f(i-1,j,k-1),肯定搞不定 然后想了好久没有效果,就去逛大神博客了,结果发现需要用到 ...

  7. string和char*的区别以及const_cast<>()

    首先,string是类,char*属于基本数据类型 其次,const_cast只能改变指针的const属性,而不能改变或者去掉本身的const属性 测试代码: // memcpyTest.cpp : ...

  8. [Algorithm] Find Nth smallest value from Array

    Q1: Find the smallest value from array: function findMin(arr) { let min = arr[0]; for (let i = 1; i ...

  9. 云计算之路-阿里云上:SLB故障引发的网站不能正常访问

    2013年8月22日23:50~23:58左右,由于阿里云SLB(负载均衡)故障造成网站不能正常访问,给大家带来了麻烦,望大家谅解! 8月19日我们收到阿里云的短信通知: 尊敬的阿里云用户:      ...

  10. 算法笔记_049:奇偶数排序(Java)

    目录 1 问题描述 2 解决方案 2.1 一头一尾指针往中间扫描法 2.2 一前一后两个指针同时往后扫描法   1 问题描述 给定一个整数数组,请调整 数组中数的顺序,使得所有奇数位于数组的前半部分, ...