tomcat-架构原理

 

Apache Tomcat,一般称为Tomcat服务器,是一个开源的java servlet容器由Apache软件基金会(ASF)开发。Tomcat实现了几个java EE规范包括java servlet和JavaServer Pages(JSP),java EL和WebSocket,并提供了一个“纯java”HTTP Web服务器环境中的java代码能够运行。html

总体架构

tomcat achive

tomcat achive2

组件

这里写图片描述

这里写图片描述

如下说明以tomcat 8.0 版本为前提java

Catalinaweb

Calalina是Tomcat的servlet容器。Calalina实现了Sun MyStand对Servlet和JavaServer页面(JSP)的规范。在Tomcat中,领域元素表示分配给这些用户的用户名、密码和角色(相似于UNIX组)的“数据库”。领域的不一样实现容许Calalina集成到已经建立和维护这样的认证信息的环境中,而后使用servlet规范中描述的信息来实现容器管理的安全性。数据库

Serverapache

Server:服务器的意思,表明整个tomcat服务器,一个tomcat只有一个Server; 
Server是Tomcat最顶层的容器,表明着整个服务器,即一个Tomcat只有一个Server,Server中包含至少一个Service组件,用于提供具体服务。这个在配置文件中也获得很好的体现(port=”8005” shutdown=”SHUTDOWN”是在8005端口监听到”SHUTDOWN”命令,服务器就会中止)。tomcat

service 
Service:Server中的一个逻辑功能层, 一个Server能够包含多个Service;安全

接收客户端的请求,而后解析请求,完成相应的业务逻辑,而后把处理后的结果返回给客户端,通常会提供两个节本方法,一个start打开服务Socket链接,监听服务端口,一个stop中止服务释放网络资源。服务器

Connector 
称做链接器,是Service的核心组件之一,一个Service能够有多个Connector,主要是链接客户端请求; 
用于接受请求并将请求封装成Request和Response,而后交给Container进行处理,Container处理完以后在交给Connector返回给客户端。markdown

一个Connector会监听一个独立的端口来处理来自客户端的请求。server.xml默认配置了两个Connector: 
,它监听端口8080,这个端口值能够修改,connectionTimeout定义了链接超时时间,单位是毫秒,redirectPort 定义了ssl的重定向接口,根据上述配置,Connector会将ssl请求转发到8443端口。 
, AJP表示Apache Jserv Protocol,它将处理Tomcat和Apache http服务器之间的交互,此链接器用于处理咱们将Tomcat和Apache http服务器结合使用的状况,如在同一台物理Server上部署一个Apache http服务器和多台Tomcat服务器,经过Apache服务器来处理静态资源以及负载均衡时,针对不一样的Tomcat实例须要AJP监听不一样的端口。 
Connector使用ProtocolHandler来处理请求的,不一样的ProtocolHandler表明不一样的链接类型,好比:Http11Protocol使用的是普通Socket来链接的(tomcat9已经删除了这个类,再也不采用BIO的方式),Http11NioProtocol使用的是NioSocket来链接的。网络

其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。 
1. Endpoint用来处理底层Socket的网络链接,Processor用于将Endpoint接收到的Socket封装成Request(这个Request和ServletRequest无关),Adapter充当适配器,用于将Request转换为ServletRequest交给Container进行具体的处理。 
2. Endpoint因为是处理底层的Socket网络链接,所以Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。 
3. Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。

Container

Service的另外一个核心组件,按照层级有Engine,Host,Context,Wrapper四种,一个Service只有一个Engine,其主要做用是执行业务逻辑;

但若是将请求监听和请求处理放在一块儿,扩展性会变差,毕竟网络协议不止HTTP一种,若是想适配多种网络协议,请求处理又相同,这时就无能为力了,tomcat的设计大师不会采起这种作法,而是将请求监听和请求处理分开为两个模块,分别是Connector和Container,Connector负责处理请求监听,Container负责处理请求处理。

但显然tomcat能够有多个Connector,同时Container也能够有多个。那这就存在一个问题,哪一个Connector对应哪一个Container,提供复杂的映射吗?相信看过server.xml文件的人已经知道了tomcat是怎么处理的了。

没错,Service就是这样来的。在conf/server.xml文件中,能够看到Service组件包含了Connector组件和Engine组件(前面有提过,Engine就是一种容器),即Service至关于Connector和Engine组件的包装器,将一个或者多个Connector和一个Engine创建关联关系。在默认的配置文件中,定义了一个叫Catalina 的服务,它将HTTP/1.1和AJP/1.3这两个Connector与一个名为Catalina 的Engine关联起来。

一个Server能够包含多个Service(它们相互独立,只是公用一个JVM及类库),一个Service负责维护多个Connector和一个Container。

这里写图片描述

Engine 
一个Service中有多个Connector和一个Engine,Engine表示整个Servlet引擎,一个Engine下面能够包含一个或者多个Host,即一个Tomcat实例能够配置多个虚拟主机,默认的状况下 conf/server.xml 配置文件中 定义了一个名为Catalina的Engine。

Host 
Host,表明一个站点,也能够叫虚拟主机,一个Host能够配置多个Context,在server.xml文件中的默认配置为, 其中appBase=webapps, 也就是\webapps目录,unpackingWARS=true 属性指定在appBase指定的目录中的war包都自动的解压,autoDeploy=true 属性指定对加入到appBase目录的war包进行自动的部署。

一个Engine包含多个Host的设计,使得一个服务器实例能够承担多个域名的服务,是很灵活的设计。

Context

Context,表明一个应用程序,就是平常开发中的web程序,或者一个WEB-INF目录以及下面的web.xml文件,换句话说每个运行的webapp最终都是以Context的形式存在,每一个Context都有一个根路径和请求路径;与Host的区别是Context表明一个应用,如,默认配置下webapps下的每一个目录都是一个应用,其中ROOT目录中存放主应用,其余目录存放别的子应用,而整个webapps是一个站点。

在Tomcat中一般采用以下方式建立一个Context: 
1. 在\webapps 目录中建立一个目录dirname,此时将自动建立一个context,默认context的访问url为http://host:port/dirname,也能够经过在ContextRoot\META-INF 中建立一个context.xml文件,其中包含以下内容来指定应用的访问路径: 
2. 在server.xml文件中增长context 元素,以下:

这样就能够经过http://host:port/urlpath访问上面配置的应用。

Wrapper

一个Context能够包含多个Servlet处理不一样请求,固然如今的SpringMVC,struts框架的出现致使程序中再也不是大量的Servlet,但其实本质是没变的,都是由Servlet来处理或者看成入口。

在tomcat中Servlet被称为wrapper,其标准类图以下:

那么为何要用Wrapper来表示Servlet?这和tomcat的处理机制有关,为了更加灵活,便于扩展,tomcat是用管道(pipeline)和阀(valve)的形式来处理请求,因此将Servlet丢给Wrapper。这个后续再分析。

那么如今tomcat就是这样的:

Coyote 
CyoOt是Tomcat的一个链接器组件,支持ajp、http1.一、spdy三种协议。

一、http 
默认状况下,HTTP链接器使用Tomcat进行安装,并准备使用。该链接器具备最低的等待时间和最佳的总体性能。 
对于集群,必须安装支持Web会话粘性的HTTP负载平衡器,以将流量引导到Tomcat服务器。Tomcat支持Adache HTTP Server 2 .x上的MODJOXER代理,并在默认状况下包含在Apache HTTP服务器2.2中做为负载均衡器。应该注意的是,HTTP代理的性能一般低于AJP的性能,因此AJP聚类一般是优选的。

二、ajp 
当使用单个服务器时,在Tomcat实例前面使用 native webserver时的性能大部分时间都比具备默认HTTP链接器的独立Tomcat更差,即便Web应用程序的很大一部分是由静态文件构成的。若是出于任何缘由须要与本机WebServer集成,AJP链接器将提供比代理HTTP更快的性能。从Tomcat的角度来看,AJP聚类是最有效的。它在功能上等同于HTTP集群。

此Tomcat版本支持的本机链接器为:

JK 1.2 .x与任何支持的服务器

Apache HTTP Server 2 .x(默认状况下包含在Apache HTTP服务器2.2中)的MODY代理,启用了AJP

三、spdy 
还有对SPDY协议的支持,尽管SPDY还不够完善。

Jasper 
Tomcat的JSP引擎。解析JSP文件编译成java代码的servlet(能够处理卡特琳娜)。在运行时,Jasper检测到对JSP文件的更改并从新编译它们。

在版本5中,Tomcat使用JasPar 2,它是Sun MyStices的JSP 2规范的一个实现。从Jasper到Jasper2,增长了重要的特征:

JSP标记库池——JSP文件中的每一个标记标记由标记处理程序类处理。能够在整个JSP servlet中聚集并重用标记处理程序类对象。 
背景JSP编译,编译修改JSP java代码,旧的版本仍然是可用的服务器的请求。旧JSP servlet一旦新的JSP servlet完成从新编译就被删除。 
在包含页面更改时从新编译JSP——能够在运行时插入页面并将其包含到JSP中。JSP不只能够用JSP文件更改从新编译,并且还能够包含页面更改。 
java编译器JDT -Jasper2可使用Eclipse JDT(java开发工具)而不是蚂蚁和java编译器javac。 
添加三个新的组分,释放Tomcat 7:

Cluster 
This component has been added to manage large applications. It is used for load balancing that can be achieved through many techniques. Clustering support currently requires the JDK version 1.5 or higher.

High availability 
A high-availability feature has been added to facilitate the scheduling of system upgrades (e.g. new releases, change requests) without affecting the live environment. This is done by dispatching live traffic requests to a temporary server on a different port while the main server is upgraded on the main port. It is very useful in handling user requests on high-traffic web applications.[6]

Web application 
It has also added user- as well as system-based web applications enhancement to add support for deployment across the variety of environments. It also tries to manage sessions as well as applications across the network.

Tomcat is building additional components. A number of additional components may be used with Apache Tomcat. These components may be built by users should they need them or they can be downloaded from one of the mirrors.[7]

启动流程

tomcat的启动流程很标准化,入口是BootStrap,统一按照生命周期管理接口Lifecycle的定义进行启动。首先,调用init()方法逐级初始化,接着调用start()方法进行启动,同时,每次调用伴随着生命周期状态变动事件的触发。

每一级组件除完成自身的处理外,还有负责调用子组件的相关调用,组件和组件之间是松耦合的,能够经过配置进行修改。

大体流程图以下:

这里写图片描述

机制

生命周期

tomcat为全部的组件都提供了生命周期管理,继承LifecycleMBeanBase则跟tomcat中的生命周期机制有关。

参考资料

https://tomcat.apache.org/tomcat-8.5-doc/default-servlet.html

http://www.javashuo.com/article/p-tvtzgxhv-em.html

相关文章
相关标签/搜索