Tomcat源码架构笔记(架构篇)
本片主要简单的介绍记录下Tomcat的设计架构,及其好处。
同时搭建一个Tomcat源码的阅读架构。
Tomcat功能(需求)
Tomcat作为开发和调试Servlet、JSP 程序的首选JavaWeb服务器(免费、开源)。
其核心的功能是什么?
或者可是说是他需要完成些什么动作(需求)?
Tomcat主要功能可以分成以下两部分:
http服务器
- 接受解析http报文
- socket通信(tcp/ip)
Servlet容器
- 处理具体业务逻辑
- 多个Servlet(自带+自定义)
Tomcat架构(设计)
为了实现上述的功能,Tomcat进行了很多的封装设计,封装了很多组件(组件的体现在源代码中就是java类),组件与组件之间的关系就构成了Tomcat架构。
Server
一个Server容器就代表一个Tomcat实例(Catalina实例),其包含一个或多个Service容器。
Service
Service是具体提供对外服务的,一个Service可以拥有多个Connector组件(监听不同端口,解析处理请求),和对应的一个Contaniner组件(Servlet容器),来处理对应的逻辑。
Connector
Connector组件是用来完成Http服务器功能的,名称:Coyote(连接器组件)
PortocolHandler
EndPoint/Processor合称为PortocolHandler
EndPoint
通信端点,Socket监听通信组件(TCP/IP)
- 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(包装组件)所包含(一对一的关系)。
- 清晰的组件关系,易于后期组件生命周期管理
- 架构和配置文件的标签包含方式一一对应,方便后期解析xml文件和封装对象过成对应
- 便于子容器继承父容器配置
Tomcat源码阅读环境搭建
阅读源码的一些小技巧
剖析源代码需要讲究一些技巧与方法,否则会在源代码海洋中迷失。
好处
- 提高架构思维能力
- 深入认识代码
- 深入理解项目/框架
原则
- 定焦原则:抓主线(抓住一个核心流程进行分析,不要无目的看源码)
- 宏观原则:站在上帝视角,先脉络后枝叶(不要去搞清楚你看到的每一行代码,没意义)
方法/技巧
- 善用断点:观察调用栈
- 反调:右键(find usages)
- 经验之谈:doXXX、XXXservice()往往是执行具体逻辑的
- 见名知意:通过方法名知道方法作用
- 亲自试试:多动手试试,灵活运用多种方法技巧
未来需要学习/掌握的技能
- 扎实的技术基础
- 开阔的技术视野
- 业务驱动的思维
- 数据驱动的思维
- 定位问题与处理的能力