您好,欢迎访问三七文档
当前位置:首页 > 法律文献 > 理论/案例 > tomcat架构和源码简析
Tomcat架构和源码简析作者:淋雨目录一、Tomcat的架构图............................................................................................................3二、Tomcat各个组件说明....................................................................................................31.Server组件......................................................................................................................32.Service组件...................................................................................................................43.Connector组件...............................................................................................................6一、Tomcat的架构图二、Tomcat各个组件说明1.Server组件它代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它用来控制Tomcat实例的启动与停止。在Tomcat启动阶段,通过server来控制的各个service的启动。启动完成后它启动独立的端口监听,用来接收Tomcat的停止命令。当接收到停止命令后它会触发service的停与注销。并提供一个接口让其它程序能够访问到这个Service集合、同时要维护它所包含的所有Service的生命周期,包括服务初始化、服务终结、Service定位与查找。Server的类结构图如下:Server接口的标准实现类是StandardServer,它实现了server接口的所有方法。StandardServer最重要的有方法addService,主要是将各个service组件加入到server中来,进行统一管理。他的实现如下:在这个方法中除了将service组件注册到Server中,同时还完成了Service组件的初始化与启动。2.Service组件Service是一个抽象的服务封装组件,是web容器的一个独立的运行单元。它具备了一个web容器所需要的监听连接,servlet查找与调用,Session创建与管理,日志服务等常用功能。Service只是在Connector和Container外面多包一层,把它们组装在一起,向外面提供服务,一个Service可以设置多个Connector,但是只能有一个EngineContainer容器,将多个Connector收到的连接发送到同一个EngineContainer进行处理。Service、Connector和EngineContainer关系如下:Service接口如下:从Service接口中定义的方法中可以看出,它主要是为了关联Connector和Container,同时会初始化它下面的其它组件,注意接口中它并没有规定一定要控制它下面的组件的生命周期。所有组件的生命周期在一个Lifecycle的接口中控制的。Tomcat中Service接口的默认实现类是StandardServic它不仅实现了Service接口同时还实现了Lifecycle接口,这样它就可以控制它下面的组件的生命周期了。StandardService类结构图如下:下面看一下StandardService中主要的几个方法实现的代码,下面是setContainer和addConnector方法的源码。setContainer的源码如下:它先判断当前的这个Service有没有已经关联了EngineContainer,如果已经关联了,那么去掉这个关联关系。如果这个老的Container已经被启动了,结束它的生命周期。然后再替换新的关联、再初始化并开始这个新的Container的生命周期。最后将所有的Connector的容器修改给当前新的容器。注意Service和Container是双向关联,Connector和Container的关联关系式是单向关联。addConnector方法的源码如下:上面是addConnector方法,这个方法也很简单,首先是设置关联关系,然后是初始化Connector,然后启动Connector进行监听。3.Connector组件Connector组件是Tomcat容器最重要的组件之一,主要负责服务器的端口监听、接收浏览器的发过来的TCP连接请求,将收到的HTTP请求信息转换成Request对象,并将Request提交Engine组件去执行,将执行完成后所得到的Response对象转换HTTP的响应信息返回给浏览器。Connector类主要有Initialize和Start两个方法来控制整个connector的初始化和启动。Initialize方法源码如下:Start方法源码如下:通过上面的代码我们能明显的观察到Connector并没有直接启动socket的监听功能,而是委托给ProtocolHandler协议处理器来做的。下面我们来看下ProtocolHandler接口的类图:ProtocolHandler本身是个接口,他有四个具体的实现类来实现它的功能:也就是我们常用的四中Connector。下面我们就以Http11NioProtocol为例详细了解下Connector的实现细节。整个流程图如下:整个时序图如下:1Http11NioProtocol调用NioEndpoint的init方法初始化服务端SocketServer的基础信息2Http11NioProtocol调用NioEndpoint的start方法启动端口监听,并初始化好Acceptor,Executer和Poller。让这些线程开始工作。至此服务端启动完成。3客户端发起socket连接,Acceptor将socket连接封装成NioChannel对象注册到Poller中。4Poller进一步将NioChannel封装成PollerEvent对象,并放到event的事件队列中。5Poller在run方法中将event队列中的PollerEvent,注册到当前的selector中,注册SelectionKey.OP_READ事件。6当selector中获取到读的事件后,获取到SocketProcessor处理线程,将NioChannel绑定到SocketProcessor,交由SocketProcessor处理。7当线程SocketProcessor开始工作后,先检查NioChannel的状态,然后调用Http11ConnectionHandler进行解析socket数据信息。8Http11ConnectionHandler主要用就是掉Http11NioProcessor用来对socket进行处理,当处理完成了之后将结果反馈给客户端,并对资源进行回收。Init方法源码如下:初始化了服务端点的信息,并为端点设置了协议处理器,和数据缓冲区大小Start方法源码如下:上面代码说明Http11NioProtocol是将服务端点NioEndpoint和协议处理器Http11ConnectionHandler来进行绑定的。NioEndpoint负责收到socket请求,而协议处理器Http11ConnectionHandler负责处理请求。NioEndpoint的类图如下:通过上面的类图我们发现NioEndpoint有很多的内部类,下面我们就看下里面重要的内部类,分别都是用来干什么的。看内部类之前我们还是看下NioEndpoint的init和start方法分别做了哪些工作。Init方法源码如下:Start方法源码如下:在start的方法中初始化了任务队列和线程处理器,同时初始化了socketnio事件的监听数组,听初始化socket连接的接收器。Acceptor是一个用来接收socket的连接请求,对他进行封装,将socket封装成NioChannel对象,然后将NioChannel对象放入到pollers数组中。源码如下:setSocketOptions方法的源码如下:KeyAttachment将NioChannel和Poller组合成的一个钩子,用来在socketNIO的attache方法中使用Poller是用来做socketnio读写事件的selector持有容器。在前面讲到Acceptor将socket对象封装成一个NioChannel对象,然后注入到Poller中来。下面是Poller的类图:他包含一个Selector是用来对具体每一个socket的读写事件进行注册的。Register的方法源代码如下:Poller同时实现了Runnable接口,他又是一个线程类,当前面初始完成后它就变成一个处于运行状态的线程。Poller线程通过循环不停的来获取到当前selector中所有发生的读写事件,然后进行处理。通过上面的代码可以看出具体进行处理是在processKey方法里面进行的。下面我们来看下processKey的具体源码:通过上面我们看到对SelectionKey进行了处理,并将attachment对象绑定到SelectionKey上面。当判断SelectionKey是读写事件的时候,通过processSocket方法来读取HTTP请求信息,或者发送HTTP响应信息。下面是processSocket的源码:它主要的功能是获取到用来处理HTTP请求信息的线程SocketProcessor,然后启动线程进行执行。SocketProcessor的类图结果如下:SocketProcessor实现了Runnable接口是个线程类,每个处理器就会启动一个线程。Http11ConnectionHandler主要用就是掉Http11NioProcessor用来对socket进行处理,当处理完成了之后对资源进行回收。Http11NioProcessor主要的处理方法如下:
本文标题:tomcat架构和源码简析
链接地址:https://www.777doc.com/doc-4556124 .html