Tomcat是用java语言开发的一个Web服务器,最近花了差不多两周时间对Tomcat 9.0源码进行了一遍学习,由于知识储备有限,也只是理解了一个大概,下面就由我来给大家分享一下我对Tomcat的构成与实现原理的理解,存在不对的地方希望大家指出。

 
Tomcat源码阅读存在如下知识点依赖:
  • JMX:Java管理扩展
  • NIO:Non-Blocking IO 非阻塞IO
  • HTTP:网络协议
  • 多线程及线程池
  • 设计模式
  • Degister:模板解析
 
Tomcat整体功能架构:
        在阅读源码时,我们无妨就认为它就是我们自己公司最近在研发的一个项目,让自己完全融入到这个项目中,去理解它的意义,它的设计思路,以及它优秀的设计地方,从而使用到自己真正的融入到项目中去。
 
 根据个人的理解Tomcat的设计存在如下重要几大块:
  1. 容器管理
    • 该部分内部主要对Tomcat容器的管理,其中包括容器的生命周期管理,容器的组成
    • 容器的生命周期管理分为:容器的创建、容器的初始化、容器的启动、容器的暂停、容器的停止等..
    • 容器的组成分为:Server、Service、Engine、Wapper、PipeLine
  2. 应用管理
    • 该部分主要描述应用程序如何被Tomcat识别、加载以及请求调用
  3. 连接管理
    • 针对于并发环境下的网络请求、NIO多组线程协同工作,消息的请求管理
  4. 请求管理
    • 针对于网络请求如何寻址对应Web应用并进行业务处理
  5. 事件管理
    • Tomcat的扩展机制,针对于容器与业务请求在各种场景下都通过对应的监听器来扩展
 
Tomcat核心业务流程:
        Tomcat在整个生命周期中,下面选择比较具有代表性的流程:Tomcat的启动与Tomcat网络请求响应进行讲解。
  1. 启动流程
    • 执行Java Main方法
    • 执行Tomcat的用户级自定义ClassLoader进行Tomcat用到的类加载
    • 对Tomcat容器及相关组件进行初始化
    • 对容器下关联的Web应用进行ServletContext上下文创建以及在容器中注册
    • 对Web应用的下的类文件、jar文件进行加载
    • 加载完成后执行ServletContextListener
    • 容器与应用加载完毕后,初始化连接器下对应若干处理进程以及ServerSocketChannel监听进程
    • 启动完成
  2. 网络请求处理流程
    • Http网络请求发起
    • NIO ServerSocketChannel监听获取SocketChannel
    • 针对于Http请求行、报文头进行预处理
    • 将Http请求封装为Request、Response对象
    • 将Request、Response请求对象通过容器的管道(PipeLine)提交至容器下的对应应用的Wapper下
    • 将Request、Response请求对象通过ApplicationFilterChain执行拦截器处理
    • 将Request、Response请求对象执行业务Socket service调用
 
     上面为Tomcat的整体功能构成以及简易的处理流程,在接下来的章节会对Tomcat的构成与处理流程进行细化。
 

【Tomcat源码学习】-1.概述的更多相关文章

  1. Tomcat源码学习(1)

    Tomcat源码学习(1) IntelliJ IDEA 17.3.3 导入 Tomcat 9.0.6源码 下载源码 tomcat_9.0.6 启动 IDEA. 点击 Open,选择刚才下载的文件解压后 ...

  2. Tomcat源码学习

    Tomcat源码学习(一) 转自:http://carllgc.blog.ccidnet.com/blog-htm-do-showone-uid-4092-type-blog-itemid-26309 ...

  3. Tomcat源码学习记录--web服务器初步认识

    Tomcat作为开源的轻量级WEB服务器,虽然不是很适合某些大型项目,但是它开源,读其源代码可以很好的提高我们的编程功底和设计思维.Tomcat中用到了很多比较好的设计模式,其中代码风格也很值得我们去 ...

  4. Tomcat源码学习 - 环境搭建

    一. 源码下载 PS: 多图预警 在开始阅读源码之前,我们需要先构建一个环境,这样才能便于我们对源码进行调试,具体源码我们可以到官网进行下载(这里我以8.5.63版本为例). 二. 项目导入 下载并解 ...

  5. Tomcat源码学习一

    这段时间工作不太忙,所以抽时间学习了TOMCAT, TOMCAT实际就是负责保持TCP连接传递到部署的项目中.浏览器实质就是TCP发送器.将用户的请求封装成TCP发送请求.当然格式是双方协定的.使用的 ...

  6. 【Tomcat源码学习】-5.请求处理

    前四章节,主要对Tomcat启动过程中,容器加载.应用加载.连接器初始化进行了相关的原理和代码流程进行了学习.接下来开始进行接受网络请求后的相关处理学习.   一.整体流程      基于上一节图示进 ...

  7. Tomcat源码学习(3)—— Digester介绍

    Digester方法详解: 通读Digester之前先分析下他的结构: 1.1该类继承了方法DefaultHandler2,DefaultHandler2继承了DefaultHandler是和sax解 ...

  8. 【Tomcat源码学习】-4.连接管理

    前面几节主要针对于Tomcat容器以及内容加载进行了讲解,本节主要针对于连接器-Connector进行细化,作为连接器主要的目的是监听外围网络访问请求,而连接器在启动相关监听进程后,是通过NIO方式进 ...

  9. 【Tomcat源码学习】-2.容器管理

    Tomcat作为应用服务器,我们可以理解Tomcat本身就是一个容器,用于装载应用,而作为容器本身是由若干组件以及事件构成,容器管理即为管理容器的有机组成部分.   一.Tomcat整体结构: Ser ...

随机推荐

  1. Java对象序列化的使用和定制

    序列化的概念及使用场合 序列化就是把对象转化为字节序列并持久化保存,可以保存在内存中.磁盘文件系统,甚至通过网络传递,并能够在以后将这个字节序列完全恢复为原来的对象. 对象序列化的概念引入Java是为 ...

  2. 经典网络还是VPC,开发者作何选择?

    近两天,关于公有云经典网络(基础网络)与私有网络(VPC)的讨论引发技术圈极大关注,事件起因于有开发者将数据库限制在内网访问,但由于安全组设置的原因,阿里云邻居用户被黑后,牵连到了自己的业务.为此,开 ...

  3. 南京.NET技术行业落地分享交流会圆满成功

    3月11日,由南京.NET社区发起,纳龙科技赞助,并联合举办的,.NET技术线下交流活动,圆满成功. 这是南京.NET圈子第一次的小型聚会,为了办好此次活动,工作人员不敢怠慢.早早准备好了小奖品与水果 ...

  4. 富文本NSAttributeString

    例子:http://www.jianshu.com/p/9ffcdc0003e0 下面研究下AttributedString究竟可以设置哪些属性,具体来说,有以下21个:   // NSFontAtt ...

  5. elastic search 学习 一

    初步阅读了elastic search 的文档,并使用command实践操作. 大概明白其概念模型.

  6. 基于cxf开发restful风格的Web Service

    一.写在前面 webservice一些简单的其他用法和概念,就不在这里赘述了,相信大家都可以在网上查到,我也是一个新手,写这篇文章的目的一方面是想记录自己成长的历程,另一方面是因为学习这个的时候花了点 ...

  7. 浅析Content Negotation在Nancy的实现和使用

    背景介绍 什么是Content Negotation呢?翻译成中文的话就是"内容协商".当然,如果不清楚HTTP规范(RFC 2616)的话,可以对这个翻译也是一头雾水. 先来看看 ...

  8. 谷歌开源图片压缩算法Guetzli实测体验报告

    谷歌大神又出开源新技术啦,这次是对JPEG格式的图片采用全新算法重新编码,输出的图片还是JPEG但是图片大小明显缩小,而质量不但没有损失,甚至还更加优化,速速来体验一把. 一.环境安装 下载谷歌开源软 ...

  9. 任务调用及远端管理(基于Quartz.net)

    这篇文章我们来了解一些项目中的一个很重要的功能:任务调度 可能有些同学还不了解这个,其实简单点说任务调度与数据库中的Job是很相似的东西 只不过是运行的物理位置与管理方式有点不一样,从功能上来说我觉得 ...

  10. ECMAScript6-let和const命令

    ▓▓▓▓▓▓ 大致介绍 ES6是下一代的JavaScript语言的标准,目标是让JavaScript可以用来编写大型的复杂程序,成为企业级开发语言,要查看浏览器对ES6的支持程度可以用阮一峰大佬写的工 ...