Tomcat 架构剖析

HTTP -> Servlet 工作流程

在这里插入图片描述
HTTP服务器不直接调用业务类,而是把请求交给容器来处理,容器通过Servlet接口调用业务类。因此Servlet接口和Servlet容器的出现,达到了HTTP服务器与业务类解耦的目的。而servlet接口和servlet容器这一整套规范叫作servlet规范。Tomcat按照servlet规范的要求实现了Servlet容器,同时它们也具有HTTP服务器的功能。作为Java程序员,如果我们要实现新的业务功能,只需要实现一个servlet,并把它注册到Tomcat(Servlet容器)中,剩下的事情就由Tomcat帮我们处理了。

Servlet 容器工作流程

​ 为了解耦,HTTP服务器不直接调用servlet,而是把请求交给servlet容器来处理,那servlet容器又是怎么工作的呢?当客户请求某个资源时,HTTP服务器会用一个servletRequest对象把客户的请求信息封装起来,然后调用servlet容器的service方法,Servlet容器拿到请求后,根据请求的uRL和servlet的映射关系,找到相应的servlet,如果servlet还没有被加载,就用反射机制创建这个servlet,并调用servlet的init方法来完成初始化,接着调用servlet的service方法来处理请求,把servletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端。
在这里插入图片描述

Tomcat 整体架构

Tomcat要实现两个核心功能: 向外连接(Connector 连接器),向内处理(Container 容器)

1)处理socket连接,负责网络字节流与Request和Response对象的转化。
2)加载和管理servlet,以及具体处理Request请求。
因此Tomcat设计了两个核心组件连接器(Connector)和容器(container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理。

在这里插入图片描述

连接器 Coyote

Coyote是Tomcat的连接器框架的名称,是Tomcat服务器提供的供客户端访问的外部接口。客户端通过coyote与服务器建立连接、发送请求并接受响应。
Coyote封装了底层的网络通信(Socket请求及响应处理),为catalina容器提供了统一的接口,使catalina容器与具体的请求协议及ro操作方式完全解耦。Coyote将socket输入转换封装为Request对象,交由catalina容器进行处理,处理请求完成后,Catalina通过coyote提供的Response对象将结果写入输出流。
Coyote作为独立的模块,只负责具体协议和IO的相关操作,与servlet规范实现没有直接关系,因此即便是Request和Response对象也并未实现servlet规范对应的接口,而是在catalina中将他们进一步封装为ServletRequest和ServletResponse。
在这里插入图片描述

各个组件

1)EndPoint:Coyote通信端点,即通信监听的接口,是具体socket接收和发送处理器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议的。
2)Tomcat并没有EndPoint接口,而是提供了一个抽象类AbstractEndpoint,里面定义了两个内部类:Acceptor和SocketProcessor。Acceptor用于监听socket连接请求。SocketProcessor用于处理接收到的socket请求,它实现Runnable接口,在Run方法里调用协议处理组件Processor进行处理。为了提高处理能力,SocketProcessor被提交到线程池来执行。而这个线程池叫作执行器(Executor)

Processor:Coyote协议处理接口,如果说EndPoint是用来实现TCP/IP协议的,那么Processor用来实现HTTP协议,Processor接收来自EndPoint的socket,读取字节流解析成TomcatRequest和Response对象,并通过Adapter将其提交到容器处理,Processor是对应用层协议的抽象。

ProtocolHandler:Coyote协议接口,通过Endpoint和Processor,实现针对具体协议的处理能力。Tomcat按照协议和I/O提供了6个实现类:AjpNioProtocol,AjpAprProtocol,AjpNio2Protocol,Http11NioProtocol, Http11Nio2Protocol,Http11AprProtocol。我们在配置tomcat/conf/server.xml时,至少要指定具体的ProtocolHandler,当然也可以指定协议名称,如:HTTP/1.1,如果安装了APR,那么将使用Http11AprProtocol,否则使用Http11NioProtocol。

Adapter: 由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的Request类来"存放"这些请求信息。ProtocolHandler接口负责解析请求并生成TomcatRequest类。但是这个Request对象不是标准的servletRequest,也就意味着,不能用TomcatRequest作为参数来调用容器。Tomcat设计者的解决方案是引入coyoteAdapter,这是适配器模式的经典运用,连接器调用coyoteAdapter的Sevice方法,传入的是TomcatRequest对象,CoyoteAdapter负责TomcatRequest转成servletRequest,再调用容器的Service方法。

在coyote中,Tomcat支持的多种I/O模型和应用层协议,具体包含哪些IO模型和应用层协议,请看下表:
Tomcat支持的IO模型(自8.5/9.0版本起,Tomcat移除了对BIO的支持):
在这里插入图片描述
Tomcat 支持的应用层协议:
在这里插入图片描述
在8.0之前,Tomcat默认采用的I/O方式为BIO,之后改为NIO。无论NIO、NIO2还是APR,在性能方面均优于以往的BIO。如果采用APR,甚至可以达到Apache HTTP Server的影响性能。

Tomcat为了实现支持多种I/O模型和应用层协议,一个容器可能对接多个连接器,就好比一个房间有多个门。但是单独的连接器或者容器都不能对外提供服务,需要把它们组装起来才能工作,组装后这个整体叫作service组件。这里请你注意,Service本身没有做什么重要的事情,只是在连接器和容器外面多包了一层,把它们组装在一起。Tomcat内可能有多个service,这样的设计也是出于灵活性的考虑。通过在Tomcat中配置多个service,可以实现通过不同的端口号来访问同一台机器上部署的不同应用。

容器 Catalina

Tomcat是一个由一系列可配置的组件构成的web容器,而catalina是Tomcat的servlet容器。Catalina是servlet容器实现,还涉及到安全、会话、集群、管理等Servlet容器架构的各个方面。它通过松耦合的方式集成Coyote,以完成按照请求协议进行数据读写。同时,它还包括我们的启动入口、Shell程序等。

Tomcat 模块分层示意图:
在这里插入图片描述
Tomcat本质上就是一款Servlet容器,因此Catalina才是Tomcat的核心,其他模块都是为Catalina提供支撑的。比如:通过Coyote模块提供链接通信,Jasper模块提供JSP引l擎,Naming提供JNDI服务,Juli提供日志服务。

结构:

如下图所示,Catalina负责管理Server,而Server表示着整个服务器。Server下面有多个服务Service,每个服务都包含着多个连接器组件Connector(Coyote实现)和一个容器组件Container。在Tomcat启动的时候,会初始化一个Catalina的实例。
在这里插入图片描述
各个组件的职责:
在这里插入图片描述

细看 Container 结构:

Tomcat设计了4种容器,分别是Engine、Host、Context和wrapper。这4种容器不是平行关系,而是父子关系。,Tomcat通过一种分层的架构,使得servlet容器具有很好的灵活性。
在这里插入图片描述
各个组件的含义:
在这里插入图片描述我们也可以再通过Tomcat的server.xml配置文件来加深对Tomcat容器的理解。Tomcat采用了组件化的设计,它的构成组件都是可配置的,其中最外层的是server,其他组件按照一定的格式要求配置在这个顶层容器中。
在这里插入图片描述
那么,Tomcat是怎么管理这些容器的呢?你会发现这些容器具有父子关系,形成一个树形结构,你可能马上就想到了设计模式中的组合模式。没错,Tomcat就是用组合模式来管理这些容器的。具体实现方法是,所有容器组件都实现了container接口,因此组合模式可以使得用户对单容器对象和组合容器对象的使用具有一致性。这里单容器对象指的是最底层的wrapper,组合容器对象指的是上面的context、Host或者Engine。

在这里插入图片描述
Container 接口提供的方法如下:
在这里插入图片描述
在上面的接口看到了getParent、SetParent、addchild和removeChild等方法。
Container接口扩展了LifeCycle接口,LifeCycle接口用来统一管理各组件的生命周期。

  • 36
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值