zoukankan      html  css  js  c++  java
  • 【Tomcat 源码系列】Tomcat 整体结构

    一,前言

    在开始看源码细节之前,首先要想好要看的问题。想好问题之后,我们该如何寻找要看的代码呢?

    其实,这就好像去爬山的时候,突然想去上厕所,如果有一副地图,那么我们可以很快就找到厕所的位置。带着问题看源码也是同样的道理,如果我们知道源码每个部分的结构是做什么的,那么我们就可以很快定位代码。

    这篇博客主要介绍 Tomcat 的整体设计、源码结构。

    Tomcat 本质

    Tomcat 本质上是什么呢?我们上 Tomcat 的官网看看。下面这段来自官网,Tomcat 本质上就是实现了部分 Jakarta EE (Java EE 新的名字) 规范。我们日常使用中,一般都会说 Tomcat 是一个 Web 服务器,它可以处理 Http 相关的请求。因此,Tomcat 是一个实现了部分 Jakarta EE 规范的 Web 服务器。它有两个主要的部分组成,一个是 Connector,一个是 Container。Connector 负责接收 Http 请求,并将请求转发给 Container 去处理,Container 负责处理请求的内容,加载对应的 Servlet,将请求的结果返回给 Connector。

    The Apache Tomcat® software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies.

    二,项目源码结构

    我们先从源码结构开始。Tomcat 服务器相关的代码在 java 文件夹下面,后面我们在进入这个文件夹去分析。

    modules 文件夹下面,有四个部分。

    三,Tomcat 源码文件夹

    Tomcat 源码位于 java 文件夹下面。这个 java 文件夹下面的每个东西是干什么事情的呢?下面简要说说。

    1. Jakarta

    位于 java/jakarta,这个文件夹下面保存的是新的 Java EE 规范,现在的 Java EE 也不这么叫了,要改名叫 Jakarta EE。详见这里

    如果去看 tomcat 9,会发现这个文件夹是 javax,不是 jakarta。tomcat 10 的一个重大转变就是从 javax 命名空间转向 jakarta。

    每个规范是做什么的呢?这里参考官网[2]的规范简要说说。

    annotation

    注解https://jakarta.ee/specifications/annotations/2.0/annotations-spec-2.0.html#goals

    下面引用了网页中的说法,annotation 这个模块的作用是定义了一些公用的注解,避免在不同的规范中定义相同的注解。

    It is hoped that this will help to avoid unnecessary redundancy or duplication between annotations defined in different Jakarta EE specifications

    ejb

    Enterprise Beanshttps://jakarta.ee/specifications/enterprise-beans/4.0/jakarta-enterprise-beans-spec-core-4.0.htm

    EJB 是开发和部署基于组件的企业级应用的架构。EJB 是一个架构。我是第一次听说 EJB,所以只能是引用它的说法,看个定义了。

    The Enterprise Beans architecture is an architecture for the development and deployment of component-based business applications.

    el

    Expression Languagehttps://jakarta.ee/specifications/expression-language/4.0/jakarta-expression-language-spec-4.0.html

    这个用在 jsp 中,用于求解表达式的值。

    mail

    无需看规范,知道它是邮件相关的就行。

    persistence

    持久化相关。

    security

    安全相关。

    servlet

    这个是重头戏。从本质上说,tomcat 就是一个实现了 servlet 规范的一个容器。servlet 定义了服务端处理 Http 请求和响应的规范。

    transaction

    事务相关的接口。

    websocket

    定义了使用 websocket 协议的服务端和客户端 API

    xml.ws

    定义了基于 SOAP 协议的 xml 方式的 web 服务。

    2. org.apache

    org/apache 文件夹下面是关于上面规范的部分实现。Tomcat 本质上就是 Jakarta EE 某些规范实现的合集。

    Catalina

    tomcat 的核心代码,可以理解为一个 servlet 容器。

    coyote

    tomcat 的核心代码,负责将网络请求转化后和 Catalina 进行通信。

    el

    上面的 Jakarta EE 中 el 的实现。

    jasper

    负责将 jsp 转为 java 代码。

    juli

    日志相关的工具。

    naming

    命名空间相关。

    tomcat

    各种辅助工具,包括 websocket 的实现。

    四,Tomcat 模块设计

    图片来自于 Medium

    简化

    How Tomcat Works 一书中,把 Tomcat 简化为 Connector 和 Container。

    Connector 负责接收 Http 请求,并将请求转发给 Container 去处理,Container 负责处理请求的内容,加载对应的 Servlet,将请求的结果返回给 Connector。

    五,总结

    这篇文章从源码层面,从设计层面介绍了 Tomcat 的整体结构。后面我们带着问题逐个分析源码,敬请期待。

    有不懂的地方,也欢迎在评论区中交流讨论。如有表述不准确的地方,希望能帮忙指出,谢谢~

    参考链接

    [1] https://blogs.oracle.com/javamagazine/transition-from-java-ee-to-jakarta-ee

    [2] https://jakarta.ee/specifications/

    [3] https://medium.com/@nikhilmanikonda/tomcat-who-i-am-and-what-i-do-e91ff72fb2ea

  • 相关阅读:
    读后感
    mysql分库分表的基本方法
    pdo接口用法
    视频技术基础
    【原创】shell易错语法汇总
    php底层的运行机制
    mysql统计函数
    etc/shadow 登陆口令破解
    JAVA学习(方法重载)
    JAVA学习(方法的定义及调用)
  • 原文地址:https://www.cnblogs.com/zzk0/p/14130575.html
Copyright © 2011-2022 走看看