Tomcat 学习笔记

85

Tomcat

总体架构

Coyote 连接器组件

  • 对外交流

  • 支持的协议

    • 应用层

      • HTTP/1.1
      • HTTP/2
      • AJP
    • 传输层

      • NIO

        • 非阻塞 I/O
      • NIO2

        • 异步 I/O
      • APR

        • Apache 可移植运行库
  • 组件

    • Endpoint

      • 接收和发送 Socket
    • Processor

      • 生成 Tomcat 原生 Request
    • ProtocolHandler

      • EndPoint + Processor
    • Adapter

      • 生成 ServletRequest

Catalina 容器组件

  • 内部处理具体业务

  • Tomcat 的核心

  • 一个 Server 实例

    • 多个 Service 实例

      • 多个 Connector 实例

      • 一个 Container 实例

        • Engine

          • 整个 Catalina 的 Servlet 引擎
        • Host

          • 一个虚拟主机/站点
        • Context

          • 一个 Web 应用程序
        • Wrapper

          • 一个 Servlet

核心配置

配置文件

  • conf/server.xml

主要标签结构

  • Server 根标签

    • Listener

    • GlobalNamingResources

    • Service 标签

      • Listener

        • 为 Service 添加生命周期监听器
      • Executor

        • 配置 Service 共享线程池
      • Connector 标签

        • port
        • protocal
        • executor
      • Engine 标签

        • Host 标签

          • Context 标签

            • docBase
            • path

简单实现

原理

  • 提供服务,接收请求(Socket 通信)

  • 将请求信息封装成 Request/Response 对象

  • 处理客户端请求的资源

    • 静态资源(Html)
    • 动态资源(Servlet)
  • 将资源返回给客户端

需求

  • 1.0

    • 浏览器请求 localhost:8080 页面,返回字符串 Hello Minicat
  • 2.0

    • 封装 Request 和 Response 对象,返回 HTML 静态资源文件
  • 3.0

    • 可以请求动态资源(Servlet)

      • 多线程实现

        • 线程池

性能优化

Https 支持

类加载机制

JVM 的类加载机制

  • 类加载器体系

    • 引导类加载器

      • c++ 编写,加载 java 核心库 java.*
    • 扩展类加载器

      • java 编写,加载扩展库 JAVA_HOME/lib/ext目录下的 jar 文件,如 classpath 中的 jre
    • 系统类加载器

      • 默认的类加载器,搜索环境变量 classpath 中指明的路径

双亲委派机制

Tomcat 的类加载机制

源码剖析

启动流程

  • 从启动脚本出发
  • 逐级初始化
  • 逐级启动

请求处理流程

  • Mapper 组件完成 url 和 Host、Context 和Wrapper 等容器的映射
  • Endpoint 处理 socket 请求,调用 Processor 处理
  • Processor 解析处理 socket 请求,封装成 request
  • Processor 调用 CoyoteAdapter 进行路径映射,并将 Request 对象转换成 ServletRequest
  • CoyoteAdapter 调用 Engine 并匹配到 Host
  • Engine 调用 Host 并匹配到 Context
  • Host 调用 Context 并匹配到 Wrapper
  • Context 调用 Wrapper 得到 Servlet 并构造 FilterChain
  • FilterChain 执行各个 Filter 并执行 Servlet

Mapper 组件体系结构

  • MapElement 基类

    • 一个 MappedHost
    • 多个 MappedContext
    • 多个 MappedWrapper