Tomcat总体架构详解

本文从最基本的功能一层一层的演进tomcat的架构

从最基本的功能来讲,我们可以将服务器描述成这样一个应用:它接受客户端发来的请求数据解析完成相关业务处理后把结果返回给客户端。下图是一个最简单的服务器设计图:我们通过start()方法启动服务器,打开socket链接,stop()方法 停止服务器并释放网络资源。

很快我们就会发现,将请求监听与请求处理放再一起扩展性能很差,比如当我们想适配多种网络协议,但是请求处理相同的时候,于是,我们进行了如下改进。

一个server包含多个connector和container。其中前者负责开启socket并监听客户端请求、返回相应数据;后者负责具体的相应请求。

该设计有一个明显的缺陷。既然server可以包含多个connector和container,那么如何知晓来自某个connector的请求由哪一个container处理。我们可以维护一个复杂的关系表,但我们可以做如下改进:

一个server可以包含多个service,互相独立但共享一个JVM以及系统类库,一个service负责维护多个connector和一个container,这样来自connector的请求只能由其所属的service维护的cantainer处理。container是一个通用概念,所以我们将其命名为engine,用以表示整合servlet引擎,并非servlet容器,只负责处理请求,不需要考虑请求链接、协议的等的处理。server才表示整个servlet容器。

Engine设计

应用服务器是用来部署并运行web应用的,是一个运行环境,因此我们需要再engine容器中支持管理web应用,当接受到connector的处理请求时,engine总能找到一个合适的web应用来处理。我们用context上下文来表示一个web应用,并且一个engine可以包含多个context

再设想我们由一台主机,其承担了多个域名的服务,因此我们要提供多个域名的服务,那么就可以将每个域名视为一个虚拟主机,host,每个虚拟主机下包含多个web应用

再一个web应用中,可以包含多个servlet实例以处理来自不同连接的请求,我们用wrapper的概念来表示这个组件

engine、host、context、wrapper尽管具体操作委派到不同的组件完成,但是行为一直,我们可以抽象一个大的容器来维护这些子组件。

如caontainer,我们可以提供一个通用性定义用于应用服务器的统一管理。

至此的应用服务器设计主要完成了我们对核心概念的分解,确保了整体架构的可伸缩性和可扩展性,可除此之外,我们还要考虑每个组件的灵活性,使其易于扩展。

在增强组件灵活性和可扩展性方面,责任链模式是一种比较好的选择。Tomcat定义了Pipeline(管道)和valve(阀)两个接口。前者用于构造责任链,后者代表责任链上的每个处理器。我们可以这样理解:来自客户端的请求就像流经管道的水一般,经过每个阀进行处理。Tomcat容器组件的灵活之处在于,每个层次的容器(engine、host、context、wrapper)均有对应的基础valve实现,同时维护了一个Pipeline。也就是说我们可以在任何层级的容器上针对请求处理进行扩展。

Connector设计

要想与container配合实现一个完整的服务器功能,connector应包含以下几项功能:

  1. 监听服务器端口,读取来自客户端的请求
  2. 将请求数据按照指定协议进行解析
  3. 根据请求地址匹配正确的容器进行处理
  4. 将结果返回给客户端

  • protocolHandler表示一个协议处理器,针对不同的协议和I/O方式,提供了不同的实现。其中endpoint用于启动socket监听,按照I/O方式进行分类实现。还包含一个processor用于按照指定协议读取数据,并将请求交由容器处理
  • 当processor读取客户端请求后,需要按照地址映射到具体容器进行处理,同时需要考虑容器组件的注册与销毁。
  • Mapper用于维护容器映射信息,同时按照映射规则查找容器。
  • MapperListener 实现了containerListener和 lifecycleListener,用于在容器组件状态变更时,注册获取取消对应的容器映射信息。再service启动时,会自动作为监听器注册到各个容器组件上,同时将已创建的容器注册到Mapper。
  • Tomcat通过适配器模式实现了connector与Mapper、container的解耦。Tomcat默认的connector实现了对应的适配器coyoteAdapter。
     

接下来我们考虑应如何设计应用服务器的并发方案。根据之前的设计方案,我们同样希望线程池作为一个组件进行统一管理。因此,Tomcat提供了Executor来表示一个可以再组件间共享的线程池。Tomcat中的executor由service维护,因此同一个service中的组件可以共享一个线程池。

 

 

Tomcat通过类Catalina提供了一个shell程序,用于解析server.xml创建各个组件,同时启动、停止应用服务器。Tomcat提供了bootstrap作为应用服务器启动的入口,他负责创建Catalina实例,根据参数调用catalina相关方法完成针对应用服务器的操作。bootstrap与Tomcat应用服务器完全松耦合,他可以直接依赖JRE运行并为Tomcat应用服务器穿件共享类加载器,用于构造Catalina实例以及整个Tomcat服务器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值