Tomcat 源代码学习(一)

学习建议:一下子就直接看源码显然是不理智的,因为就算跟着debug一次也是毫无头绪的。建议先看一遍 tomcat 的基本原理和架构。

框架背景

      Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet, 这样Tomcat就诞生了。Tomcat服务器是一个免费的开放源代码的Web应用服务器。Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,是目前比较流行的Web应用服务器。

      Tomcat是应用(Java)服务器,它只是一个Servlet容器,可以认为是Apache的扩展,但是可以独立于Apache运行。与Apache相比,Tomcat能够动态的生成资源并返回到客户端,Apache和Nginx都能够将某一个文本文件的内容通过HTTP协议返回到客户端,但是这个文本文件的内容是固定的,也就是静态资源。当然Tomcat也能像Apache和nginx一样处理静态资源,但显然,它既要处理动态请求,又要处理静态请求,压力会很大。因此Tomcat前一般使用Apache或nginx专门处理静态请求,而动态请求则通过反向代理的方式代理至Tomcat。Tomcat运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能。

      Tomcat是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。同时,Tomcat比较容易扩展。由于是通过在这台功能强大的服务器上运行的单个servlet容器,实际上也就不需要考虑session状态在分布式环境下的维护这类复杂的问题。

Tomcat的顶层结构

      Tomcat具有高度模块化,通过各个组件实现各功能。下图为Tomcat的顶层结构图:
在这里插入图片描述

图1 Tomcat的顶层结构

1)Sever.xml的分析

大体节点框架为:

<Listener />

<GlobaNamingResources>

</GlobaNamingResources>

<Service>

    <Connector />

    <Engine>

        <Logger />

        <Realm />

           <host>

               <Logger />

               <Context />

           </host>

    </Engine>

</Service>

      Tomcat9中没有直接在sever.xml中实现,(官方不推荐),当我们也可以自行添加。

      Server代表整个容器,是tomcat实例的顶层元素,其中可以包含多个service。Service中包含一个Engine和一个或多个Connector。Engine表示整个Servlet引擎,一个Engine下包含一个或者多个Host,即一个tomcat实例可以设置多个虚拟主机。Context元素代表了运行在虚拟主机上的单个Web应用。一个可以包含多个元素。每个web应用有唯一的一个相对应的Context代表web应用自身。Connector代表与客户程序实际交互的主键,它负责接收客户请求,以及向客户返回响应结果。

2)Tomcat响应客户请求大体流程:

在这里插入图片描述

图2 Tomcat响应流程

3)server初始化:
在这里插入图片描述

图3 Server的初始化

      Bootstrap的load是通过反射交给catalina的load处理的。简单描述一下catalina中load实现初始化组件的过程。首先,catalina中的load方法初始化目录和命名服务,然后通过c-reateStartDigester来初始化Digester。(Digester的作用是对server.xml进行解析,完成tomcat的配置和构建响应的容器)创建出了StandardServer对象,接着便调用getServer().init(),在StandardServer的initInternal方法中会调用子组件Services的init方法,并依次传递下去,完成所有组件的init()。

      综上,catalina的load方法主要是根据conf/server.xml配置文件利用Digester创建服务器组件,然后调用Server的init方法,逐层次的实现所有组件的初始化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值