Tomcat源码分析二:先看看Tomcat的总体架构
Tomcat架构图
咱们先来看一张比较经典的Tomcat架构图:web
从这张图中,咱们能够看出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,能够实现经过不一样的端口号来访问同一台机器上部署的不一样应用。app
其实,咱们能够关注如下Tomcat中conf/web.xml的配置:源码分析
下面,咱们来着重看一下链接器connector和容器container的内容设计
链接器Connector
Connector对 Servlet 容器屏蔽了协议类型及 I/O 模型等的区别,不管是 HTTP 仍是 AJP,在容器中获取到的都是一个标准的 ServletRequest 对象。先来看一下Connector的设计结构图:3d
引用《深刻拆解Tomcat_Jetty》中关于Connector的功能总结,主要有以下功能:xml
- 监听网络端口。
- 接受网络链接请求。
- 读取请求网络字节流。
- 根据具体应用层协议(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》 极客时间
微信公众号: 源码湾
欢迎关注本人微信公众号: 源码湾。 本公众号将不按期进行相关源码及相关开发技术的分享,共同成长,共同进步~