让面试官颤抖的Tomcat系统架构系列!

	看懂了是一说法,理解又是一说法,能侃侃而谈又是一说,好长时间不忘又是一说。---今行健,以自强不息

对于web开发的我们来说,与tomcat打交道,是非常的频繁的,tomcat就是一个小型的服务器,我们可以访问。目前同类中有jetty,做的比较好,它是采用nio,性能比较好。但是啊,tomcat已经进入市场好多年了,深入人心,所以仍是主流。
我们都用它用了那么长时间了,但是我们知道它的运行原理吗?

	首先我们思考这么几个问题:1.我们知道我们是通过套接字进行通信的,就是socket,那么你是否会产生疑问?既然我们底层是用socket通信的,那么我们的那些request请求和应答的response和socket什么关系呐,肯定有一定的转化机制啊。到底是什么呐?

我们这里上一张图
在这里插入图片描述
关于这张图的描述:
server:
1.server这个是这里所有元素的父节点,其功能是掌管tomcat的生命周期,它下边的所有节点的生死大权全由它来掌管。
service:
2.一个server可以包含多个service,但是至少有一个,service是具体来提供服务的。
下边请出tomcat最核心的部分,这两部分相当于计算机的cpu,其重要性不言而喻,Connector和Container。
Connector:
可以有多个,功能是处理socket与request和response的转化的,就是socket携带信息来时,把它封装成request请求。处理完请求时把response转化为socket。
Container:
只能有一个,真正处理request请求的地方,用于封装和管理servlet。
在这里插入图片描述
这里说一下,Connector会把请求(request)转发给Container,Container处理完请求再把response给Connector。
注意一点是:Connector像一个中转站,只是对请求和响应封装一下但是它要支持的协议有tcp/ip,http协议,真正处理的地方是Container。
在这里插入图片描述
这个图是tomcat8,我把注释去掉了,这里的Engine就是相当于那个Container容器。
在这里插入图片描述
这个图更加直观一些。好了以上介绍的就是那个大的方面。
总结一下就是

(1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;

(2) Server掌管着整个Tomcat的生死大权;

(4)Service 是对外提供服务的;

(5)Connector用于接受请求并将请求封装成Request和Response来具体处理;

(6)Container用于封装和管理Servlet,以及具体处理request请求;

但是你或许会有疑问,Connector和Container既然那么重要,他们是否可以再分呐,很好,是可以再分的。

Connector:你或许会提出疑问:
在这里插入图片描述
那么上图吧,
在这里插入图片描述

Connector包含Protocolhandler
Protocolhandler包含三个部分:Endpoint 和 Processor 和 Adapetr

作用:
Endpoint :用于处理处理Socket和request或者response转化
			Endpoint:又可以分成三部分 Acceptor 和 Handler 和 AsyncTimout
			其中Handler 是处理Socket和request或者response转化的内部调用Processor。
			Acceptor是用于监听请求的
			AsyncTimout用于检查异步request是否超时的
 Adapetr:用于将请求交给Container的

Container:到底是怎样将响应传给Connector呐
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Container如何处理请求的:
Container处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意)
在这里插入图片描述
Pipeline-Valve是责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将处理后的请求返回,再让下一个处理着继续处理。
但是!Pipeline-Valve使用的责任链模式和普通的责任链模式有些不同!区别主要有以下两点:
在这里插入图片描述
我们知道Container包含四个子容器,而这四个子容器对应的BaseValve分别在:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。

Pipeline的处理流程图如下:
在这里插入图片描述

(1)Connector在接收到请求后会首先调用最顶层容器的Pipeline来处理,这里的最顶层容器的Pipeline就是EnginePipeline(Engine的管道);
(2)在Engine的管道中依次会执行EngineValve1、EngineValve2等等,最后会执行StandardEngineValve,在StandardEngineValve中会调用Host管道,然后再依次执行Host的HostValve1、HostValve2等,最后在执行StandardHostValve,然后再依次调用Context的管道和Wrapper的管道,最后执行到StandardWrapperValve。
(3)当执行到StandardWrapperValve的时候,会在StandardWrapperValve中创建FilterChain,并调用其doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理!
(4)当所有的Pipeline-Valve都执行完之后,并且处理完了具体的请求,这个时候就可以将返回的结果交给Connector了,Connector在通过Socket的方式将结果返回给客户端。

https://juejin.im/entry/5b87815651882542f1054e6c

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值