Tomcat理论介绍


在介绍Tomcat以前咱们再来好好回顾一下Servlet和JSP前端


Servlet是一种CGI技术,能实现让Java开发动态的Web资源,并经过CGI技术与前端的Web服务器进行通讯,但其对HTML文档的定义都要有JAVA程序来实现,任何静态资源以发生修改都要从新编译整个Java页面程序,很是的麻烦,而且Java程序员必须了解前端HTML的展现方式java

servlet也能够被认为是服务器端的applet。servlet被Web服务器加载和执行,就如同applet被浏览器加载和执行同样。servlet从客户端(经过Web服务器)接收请求,执行某种做业,而后返回结果。使用servlet的基本流程以下:程序员


1.客户端经过HTTP提出请求.web

2.Web服务器接收该请求并将其发给servlet。若是这个servlet还没有被加载,Web服务器将把它加载到  Java虚拟机而且执行它。
数据库

3.servlet将接收该HTTP请求并执行某种处理。apache

4.servlet将向Web服务器返回应答。后端

5.Web服务器将从servlet收到的应答发送给客户端。浏览器


因为servlet是在服务器上执行,一般与applet相关的安全性的问题并不需实现。要注意的是Web浏览器并不直接和servlet通讯,servlet通常是由前端Web服务器加载和执行的;而servlet是用Java编写的,因此servlet编写一次就能够在任何平台运行(write once,run anywhere)。tomcat



JSP是一种脚本语言,它能够实现将Java程序以标签<% %>的形式嵌入到HTML文档中,这样极大的方便了程序的编译和修改(Servlet的程序一发生修改(那怕是HTML静态资源修改)就要从新编译整个Java程序页面),JSP修改后能够当即看到结果,不须要手工编译,JSP引擎会来作这些工做;而Servelt却须要编译,从新启动Servlet引擎等一系列动做安全


可是JSP程序(通常为.jsp结尾)要被执行必须先被转译(如Jasper)为.java的源代码,.java再由编译器编译为.class类,而后在JVM中进行类加载、解释才能执行


总之相对于Servlet来讲,JSP能够方便的让Java与HTML进行结合,让程序员能够很方便的实如今HTML静态文档中加入或者修改Java编写的动态内容,这也能够说是Servlet和JSP惟一区别,其余区别是在不大





Tomcat 服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是不少的场合下被广泛使用,是开发和调试JSP 程序的首选;通常来讲以JSP格式开发的网站,几乎都用Tomcat来做为Java的应用程序服务器。Tomcat不严格来讲的话就是一个Web Container(具备JVM,Jasper的功能,能够直接对.jsp程序进行处理执行),可让JSP编写的动态web资源在Tomcat中运行,并将运行结果直接响应给client或者交给前端web server再响应给client


Tomcat的集群通常都是前端由Apache做为代理服务器,将用户的.jsp请求所有转发给位于后端的Tomcat进行处理,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器同样,具备处理HTML页面的功能,另外它仍是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0。



Tomcat的组件构成如图

tomcat news



Tomcat的架构:

Tomcat 6支持Servlet 2.5和JSP 2.1的规范,它由一组嵌套的层次和组件组成,通常可分为如下四类:

1.顶级组件:位于配置层次的顶级,而且彼此间有着严格的对应关系;Server、Service

2.链接器:链接客户端(能够是浏览器或Web服务器)请求至Servlet容器,

3.容器:包含一组其它组件;Engine、Host、Context

4.被嵌套的组件:位于一个容器当中,但不能包含其它组件;


各常见组件:

一、服务器(server):Tomcat的一个实例,一般一个JVM只能包含一个Tomcat实例;所以,一台物理服务器上能够在启动多个JVM的状况下在每个JVM中启动一个Tomcat实例,每一个实例分属于一个独立的管理端口。这是一个顶级组件。


二、服务(service):一个服务组件一般包含一个引擎和与此引擎相关联的一个或多个链接器。给服务命名能够方便管理员在日志文件中识别不一样服务产生的日志。一个server能够包含多个service组件,但一般情下只为一个service指派一个server。


链接器类组件:

三、链接器(connectors):负责链接客户端(能够是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,一般指的是接收客户发来请求的位置及服务器端分配的端口。默认端口一般是HTTP协议的8080,管理员也能够根据本身的须要改变此端口。一个引擎能够配置多个链接器,但这些链接器必须使用不一样的端口。默认的链接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2链接器。


容器类组件:

四、引擎(Engine):引擎一般是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每个请求的HTTP首部信息以辨别此请求应该发往哪一个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来讲,容器没必要非得经过引擎来实现,它也能够是只是一个容器。若是Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而若是Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,由于Web服务器自身就能肯定将用户请求发往何处。一个引擎能够包含多个host组件。

五、主机(Host):主机组件相似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件,但当引擎有多个Host时,请求到达引擎要决定发往哪一个HOST或者用户请求了一个不存在的主机,因此这时通常要为引擎指定一个默认的虚拟主机;每个虚拟主机均可以是一个独立的网站。

六、上下文(Context):Context组件是最内层次的组件,它表示Web应用程序自己。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器可以将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实如今用户访问发生错误时提供友好的提示信息;每一个context均可以单独部署一个应用程序。


容器类组件:Engine、Host、Context

顶级组件:Server、Service


一个Service内只能有一个Engine,但能够将一个或多个Connector(链接器)关联到Engine上,一个Engine内能够有多个Host,一个Host内能够有多个Context


此外还有其余被嵌套类(nested)组件:

这类组件一般包含于容器类组件中以提供具备管理功能的服务,它们不能包含其它组件,但有些却能够由不一样层次的容器各自配置。

七、阀门(Valve):用来拦截请求并在将其转至目标以前进行某种处理操做,相似于Servlet规范中定义的过滤器。Valve能够定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术一般被称做请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。

八、日志记录器(Logger):用于记录组件内部的状态信息,可被用于除Context以外的任何容器中。日志记录的功能可被继承,所以,一个引擎级别的Logger将会记录引擎内部全部组件相关的信息,除非某内部组件定义了本身的Logger组件。

九、领域(Realm):用于用户的认证和受权;在配置一个应用程序时,管理员能够为每一个资源或资源组定义角色及权限,而这些访问控制功能的生效须要经过Realm来实现。Realm的认证能够基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍布整个引擎或顶级容器,所以,一个容器内的全部应用程序将共享用户资源。同时,Realm能够被其所在组件的子组件继承,也能够被子组件中定义的Realm所覆盖。



Tomcat链接器架构:

基于Apache作为Tomcat前端的架构来说,Apache经过mod_jk、mod_jk2或mod_proxy模块与后端的Tomcat进行数据交换。而对Tomcat来讲,每一个Web容器实例都有一个Java语言开发的链接器模块组件,在Tomcat6中,这个链接器是org.apache.catalina.Connector类。这个类的构造器能够构造两种类别的链接器:HTTP/1.1负责响应基于HTTP/HTTPS协议的请求,AJP/1.3负责响应基于AJP的请求。但能够简单地经过在server.xml配置文件中实现链接器的建立,但建立时所使用的类根据系统是支持APR(Apache Portable Runtime)而有所不一样。

APR是附加在提供了通用和标准API的操做系统之上一个通信层的本地库的集合,它可以为使用了APR的应用程序在与Apache通讯时提供较好伸缩能力时带去平衡效用。

同时,须要说明的是,mod_jk2模块目前已经再也不被支持了,mod_jk模块目前还apache被支持,但其项目活跃度已经大大下降。所以,目前更经常使用 的方式是使用mod_proxy模块。


若是支持APR:

一、HTTP/1.1:org.apache.cotote.http11.Http11AprProtocol

二、AJP/1.3:org.apache.coyote.ajp.AjpAprProtocol

若是不支持APR:

HTTP/1.1: org.apache.coyote.http11.Http11Protocol

AJP/1.3: org.apache.jk.server.JkCoyoteHandler


链接器协议:


Tomcat的Web服务器链接器支持两种协议:AJP和HTTP,它们均定义了以二进制格式在Web服务器和Tomcat之间进行数据传输,并提供相应的控制命令。


AJP(Apache JServ Protocol)协议:

若是Tomcat的集群前端是Apache依据本身的proxy_mod模块做为反向代理,则Apache能够将前端的http请求以AJP协议发送给后端的Tomcat,AJP协议是基于二进制的格式在Web服务器和Tomcat之间传输数据


HTTP协议:如过Tomcat集群的前端是由Nginx实现的反向代理,则其是使用HTTP或HTTPS协议在Web服务器和Tomcat之间创建通讯,此时,Tomcat就是一个彻底功能的HTTP服务器,它须要监听在某端口上以接收来自于商前服务器的请求。


其使用Http协议转发请求效率不如AJP的二进制格式,因此通常推荐Tomcat集群的前端为Apache,何况Apache与Tomcat都是ASF(Apache Software Foundation)出品的开源软件。



Tomcat 工做模式

(1).独立的Servlet容器

Tomcat 的默认工做模式,做为独立的Servlet容器,是内置在Web服务器中的一部分,是指使用基于JAVA的Web服务器的情形。其余两种方式是TOMCAT与其余服务器集成的方式。

(2).进程内的Servlet容器

Servlet容器做为Web服务器的插件和JAVA容器的实现。Web服务器的插件在内部地址空间打开一个JVM(JAVA VIRTUAL MACHINE)使JAVA容器得以在内部运行。若有某个须要调用Servlet的请求,插件将取得对此请求的控制并将它传递(使用JNI)给JAVA容器。进程内的容器对于多线程、单进程的服务器很是适合,而且提供了很好的运行速度,只是伸缩性有所不足。

注,JNI是JAVA NATIVE INTERFACE的缩写,是JAVA本地调用接口,经过JNI,JAVA程序能够和其余语言编写的本地程序进行通讯。

(3).进程外的Servlet容器

Servlet容器运行于Web服务器以外的地址空间,而且做为Web服务器的插件和JVM使用IPC(如TCP/IP)进行通讯。进程外容器的反应时间不如进程内的容器,但有较好的伸缩性、稳定性等性能。

IPC INTERPROCESS COMMUNICATION(进程间通讯)的简写,它是实现进程间通讯的一种技术。


6.Tomcat各组件之间的关系

Tomcat是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的给件是CATALINA SERVLET容器,其余的组件按照必定的格式要求配置在这个顶层容器中。Tomcat的各个组件是server.xml文件中配置的,Tomcat服务器默认状况下对各类组件都有默认的实现,server.xml是Tomcat的核心配置文件,描述了Tomcat各个组件之间的关系


<Server>    顶层组件,表明一个服务器

  <Service>  顶层组件,是Connector的集合,一个service只能有一个Engine

      <Connectior/>   链接器,多个链接器能够关联到同一个Engine

          <Engine>   容器类组件,为特定的Service组件处理全部客户请求,可包含多个Host

              <Host> 容器类组件,为特定的虚拟主机处理全部客户请求

                  <Context>容器类组件,为特定的WEB应用处理全部客户请求

                  </Context>

              </Host>

          </Engine>

</Service>

</Server>


Tomcat中真正处理客户请求与生成响应的三个组件是Engine 、Host、 Context。


以下图为Tomcat对用户请求的处理及个组件的关系图:




tomcat 组织

相关文章
相关标签/搜索