Tomcat源码分析二:先看看Tomcat的整体架构
tomcat源码分析二:先看看tomcat的整体架构
tomcat架构图
我们先来看一张比较经典的tomcat架构图:
从这张图中,我们可以看出tomcat中含有server、service、connector、container等组件,接下来我们一起去大致的看看这些组件的作用和他们之间的相互联系。在这之前,我们先补充一个知识点,也就是tomcat它实现的功能点是什么呢?通过查找一些资料,这里参考下极客时间《深入拆解tomcat_jetty》中的总结,即tomcat 要实现 2 个核心功能:
- 处理 socket 连接,负责网络字节流与 request 和 response 对象的转化;
- 加载和管理 servlet,以及具体处理 request 请求。
对应到架构图中,tomcat 设计了两个核心组件:连接器(connector)和容器(container)来分别做这两件事情。连接器负责对外交流,也就是处理socket连接,容器负责内部处理。
各组件介绍
在介绍各组件之前,我们先关注一下下面这张关系图:
从图中可以看出,最顶层为server(图中未标明),也就是一个tomcat实例。在一个server下面可以有很多个service服务,而每个service服务又分为连接器和容器,也就是上面架构图中connector和container,其中连接器可以有多个,而容器只有一个,连接器connector和容器container之间的交互是通过servletrequest和servletresponse通信的。
tomcat 内可能有多个 service,这种设计是出于灵活性的考虑。通过在 tomcat 中配置多个 service,可以实现通过不同的端口号来访问同一台机器上部署的不同应用。
其实,我们可以关注以下tomcat中conf/web.xml的配置:
下面,我们来着重看一下连接器connector和容器container的内容
连接器connector
connector对 servlet 容器屏蔽了协议类型及 i/o 模型等的区别,无论是 http 还是 ajp,在容器中获取到的都是一个标准的 servletrequest 对象。先来看一下connector的设计结构图:
引用《深入拆解tomcat_jetty》中关于connector的功能总结,主要有如下功能:
- 监听网络端口。
- 接受网络连接请求。
- 读取请求网络字节流。
- 根据具体应用层协议(http/ajp)解析字节流,生成统一的 tomcat request 对象。
- 将 tomcat request 对象转成标准的 servletrequest。
- 调用 servlet 容器,得到 servletresponse。
- 将 servletresponse 转成 tomcat response 对象。
- 将 tomcat response 转成网络字节流。
- 将响应字节流写回给浏览器。
从上面的结构图中可以看出,在connector中使用protocolhandler来处理请求,其主要包含3个组件,分别为endpoint、processor、adapter等。我们来看下protocolhandler的接口及其子类的类图:
关于连接器connector的具体内容将在后期单独做详细介绍。
容器container
tomcat 设计了 4 种容器,分别是 engine、host、context 和 wrapper,其属于父子关系。具体可以参考上文提及的tomcat中conf/web.xml。其具体的关系可以参考下图(来源:百度):
这四种容器的应用范围为:
- engine:整个catalina servlet引擎;
- host:包含一个或多个context容器的虚拟主机;
- context:表示一个web应用程序,可以包含多个wrapper;
- wrapper:表示一个独立的servlet;
关于容器container的具体内容将在后期单独做详细介绍。
本文主要介绍了tomcat 的大体架构,也大致介绍了connector和container的结构,后面将以源码为基础,详细的介绍其中的组件内容及相关的技术实现。
参考资料
- 《深入拆解tomcat_jetty》 极客时间
微信公众号: 源码湾
欢迎关注本人微信公众号: 源码湾。 本公众号将不定期进行相关源码及相关开发技术的分享,共同成长,共同进步~
blog:
- 简书:
- csdn: https://blog.csdn.net/zhiyouwu
- 开源中国:
- 掘金:
- 博客园:
- 微信公众号: 源码湾
- 微信: wzy1782357529 (欢迎沟通交流)