[Java] Tomcat

架构

  • Server
    • 服务器,只有一个
    • 对应一个Tomcat实例
    • 可通过8005监听并关闭
  • Service
    • 服务,把连接器和容器组装在一起,可有多个
    • 实现通过不同端口号访问同一台机器上部署的不同应用
  • Connector(Coyote)
    • 连接器,负责对外交流,可有多个
    • 将客户端请求连接到Tomcat
    • 与Container之间通过标准的ServletRequest和ServletResponse通信
    • 功能
      • EndPoint:网络I/O通信,实现TCP/IP协议,提供字节流给Processor
      • Processor:应用层协议解析,实现HTTP,提供Tomcat Request对象给Adapter
      • Adapter:Request/Response与ServletRequest/ServletResponse转化,提供ServletRequest 对象给容器
  • Container(Catalina)
    • Tomcat核心,Servlet容器,负责内部处理
    • Engine:引擎(默认为Catalina),只有一个
    • Host:虚拟机,基于域名分发请求,可有多个
    • Context:服务器,隔离各个WEB应用,可有多个,每个Context的ClassLoader都是独立的(jar包独立)
    • Wrapper:包装组件,一个Wrapper封装一个Servlet
  • Component
    • 组件
    • Manager(管理器)
    • logger(日志管理)
    • loader(载入器)
    • pipeline(管道)
    • valve(管道中的阀)

[Java] Tomcat_第1张图片

[Java] Tomcat_第2张图片

 [Java] Tomcat_第3张图片

套娃式架构优点

  • 组件关系清晰,便于后期组件生命周期的管理
  • 和配置文件server.xml中标签的包含方式对应,后续解读及封装对象过程中容易对应
  • 便于子容器继承父容器配置

支持

  • I/O模型
    • NIO:非阻塞I/O
    • NIO2:异步I/O
    • APR:Apache可移植运行库,用于并发调优
  • 应用层协议
    • HTTP/1.1
    • AJP:用于和Web服务器(Apache)集成,Apache处理动态资源,Tomcat处理静态资源

启动

  • 复制war包至webapp目录
  • 执行startup.bat脚本启动
  • 启动过程中war包会被自动解压装载

启动参数

  • 组件实例化
  • 统一对象声明周期,抽象出了LifeCycle生命周期接口
  • 入口
    • startup.sh --> catalina.sh start --> java xxxx.jar org.apache.catalina.startup.Bootstrap(main) start
  • 启动流程分析
    • catalinaDaemon = catalina 对象

工作原理

  • 多个Connector和一个Engine组成一个服务
  • 一个Container可对应多个Connector
  • Servlet=server+applet
  • applet:客户端应用程序,用鼠标就可操作
  • Servlet:服务端应用程序,通过网络请求操作
  • Servlet接口(规范)
    • service()

[Java] Tomcat_第4张图片

目录结构

  • /bin:存放 Windows 或 Linux 平台上启动和关闭 Tomcat 的脚本文件
  • /conf:存放 Tomcat 的各种全局配置文件,其中最重要的是 server.xml
  • /lib:存放 Tomcat 以及所有 Web 应用都可以访问的 JAR 文件
  • /logs:存放 Tomcat 执行时产生的日志文件
  • /work:存放 JSP 编译后产生的 Class 文件
  • /webapps:Tomcat 的 Web 应用目录,默认情况下把 Web 应用放在这个目录下

 [Java] Tomcat_第5张图片

源码剖析

  • 原则
    • 定焦原则:抓主线(抓一个核心流程去分析,不要漫无目的的去看源码)
    • 宏观原则:站在上帝视角,先脉络后枝叶(切忌视图搞清楚看到的每一行代码,源码考虑因素多,不看辅助功能不影响主线)
  • 方法技巧
    • 断点(观察调用栈)
    • 反调(右键,Find Usages)
    • 经验(如doXX(),service()实现业务逻辑)
    • 见名思意(通过方法名称联想到方法作用)
    • 多动手

参考

四张图带你了解Tomcat系统架构

https://blog.csdn.net/qq_38245537/article/details/79009448

web容器,servlet容器,spring容器,springmvc容器的联系

https://blog.csdn.net/qq_31772441/article/details/104163457

Tomcat系列(4)——Tomcat 组件及架构详细部分

https://www.cnblogs.com/haimishasha/p/10740606.html

tomcat7完整的源码及依赖包下载(即编即用)

http://www.xwood.net/_site_domain_/_root/5870/5930/5932/t_c258846.html

IDEA搭建Tomcat源码环境

https://blog.csdn.net/qq_45859054/article/details/104726732

tomcat -ROOT 与webapps 的关系

https://www.cnblogs.com/wei-lai/p/6249595.html

你可能感兴趣的:([Java] Tomcat)