Tomcat源码架构笔记(架构篇)

warning: 这篇文章距离上次修改已过1407天,其中的内容可能已经有所变动。

本片主要简单的介绍记录下Tomcat的设计架构,及其好处。

同时搭建一个Tomcat源码的阅读架构。

Tomcat是Apache基金会旗下的项目Tomcat是Apache基金会旗下的项目


Tomcat功能(需求)

Tomcat作为开发和调试Servlet、JSP 程序的首选JavaWeb服务器(免费、开源)。

其核心的功能是什么?

或者可是说是他需要完成些什么动作(需求)?

Tomcat工作流程(简单)Tomcat工作流程(简单)

Tomcat主要功能可以分成以下两部分:

  • http服务器

    • 接受解析http报文
    • socket通信(tcp/ip)
  • Servlet容器

    • 处理具体业务逻辑
    • 多个Servlet(自带+自定义)

Tomcat架构(设计)

为了实现上述的功能,Tomcat进行了很多的封装设计,封装了很多组件(组件的体现在源代码中就是java类),组件与组件之间的关系就构成了Tomcat架构。

Tomcat架构Tomcat架构

Server

一个Server容器就代表一个Tomcat实例(Catalina实例),其包含一个或多个Service容器。

info:因为Catalina(Servlet容器)是Tomcat的核心,所以我们一般也说Tomcat实例是一个Catalina实例

Service

Service是具体提供对外服务的,一个Service可以拥有多个Connector组件(监听不同端口,解析处理请求),和对应的一个Contaniner组件(Servlet容器),来处理对应的逻辑。

info:Tomcat组件采用一层套一层的设计方式,若一个组件包含其他组件,那么他也被称为容器。

Connector

Connector组件是用来完成Http服务器功能的,名称:Coyote(连接器组件)

PortocolHandler

EndPoint/Processor合称为PortocolHandler

EndPoint

通信端点,Socket监听通信组件(TCP/IP)

info:EndPoint可以使用的网络I/O:

  • BIO(同步阻塞式IO)
  • NIO、NIO2(异步非阻塞式IO)
  • APR(Apache可移植扩展包,性能调优)

Processor

处理器组件,解析处理HTTP报文(HTTP/AJP)

Adapter

Adapter(适配器),将Request/Response转换为ServletRequest/ServletResponse

Contaniner

Contaniner组件用来完成Servlet容器,名称:Catalina

Engine/Host

Engine(引擎)组件是Servlet容器的Catalina的核心。

他支持定义多个Host(虚拟主机),来允许Tomcat服务器在单台机器上配置多个域名。

Context

每个虚拟主机可以支持部署多个web应用在其下,这就是我们熟知的Context(上下文对象)。

Context是由Servlet规范中指定的Web应用程序格式表示。无论是压缩过的war包还是未压缩的目录形式。

Wrapper

在上下文中可以部署多个Servlet,并且每个Servlet都会被一个Wrapper(包装组件)所包含(一对一的关系)。

info:嵌套设计的好处

  • 清晰的组件关系,易于后期组件生命周期管理
  • 架构和配置文件的标签包含方式一一对应,方便后期解析xml文件和封装对象过成对应
  • 便于子容器继承父容器配置

Tomcat源码阅读环境搭建

传送门


阅读源码的一些小技巧

剖析源代码需要讲究一些技巧与方法,否则会在源代码海洋中迷失。

  • 好处

    • 提高架构思维能力
    • 深入认识代码
    • 深入理解项目/框架
  • 原则

    • 定焦原则:抓主线(抓住一个核心流程进行分析,不要无目的看源码)
    • 宏观原则:站在上帝视角,先脉络后枝叶(不要去搞清楚你看到的每一行代码,没意义)
  • 方法/技巧

    • 善用断点:观察调用栈
    • 反调:右键(find usages)
    • 经验之谈:doXXX、XXXservice()往往是执行具体逻辑的
    • 见名知意:通过方法名知道方法作用
    • 亲自试试:多动手试试,灵活运用多种方法技巧

未来需要学习/掌握的技能

  • 扎实的技术基础
  • 开阔的技术视野
  • 业务驱动的思维
  • 数据驱动的思维
  • 定位问题与处理的能力
评论已关闭