赞
踩
对于tomcat,大家都应该很熟悉。在日常开发中我们一般都是用tomcat来进行部署测试的,tomcat是属于apache的一个轻量级的应用服务器,tomcat本身涉及的底层技术有很多,大家有兴趣可以深入研究一下。这里主要是和大家一起学习一下tomcat的核心配置文件server.xml。之所以说它是tomcat的核心配置文件,因为tomcat中的组件都是在server.xml中进行配置的,了解清楚server.xml是很有必要的。话不多说,开始正文!
请求从客户端发出之后,进入了tomcat(这里是指没有经过nginx等代理服务器),然后在tomcat容器中是怎么运转的?要先了解大致的运转流程,再来结合流程看server.xml配置文件。
上图的具体流程如下
上面的具体流程详细的解析了,一个http请求在tomcat内部是如何进行运转的。而这些组件如何正确的进行运行是需要依赖于tomcat的核心配置文件server.xml。
下面是一个基础的server.xml的例子,其中除掉了tomcat中默认的注释,监听器还有全局命名资源。只是保留了一些核心组件,结合下面的例子来学习server.xml
<?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Connector connectionTimeout="20000" disableUploadTimeout="true" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> <Engine defaultHost="localhost" name="Catalina"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log." resolveHosts="false" suffix=".txt"/> <Context docBase="htgl" path="/htgl" reloadable="true" source="org.eclipse.jst.j2ee.server:htgl"/> </Host> </Engine> </Service> </Server>
上面的server.xml中的组件元素和tomcat容器的实际组件是一一对应的,可以对比下图来进行比对
从上面可以看出,在最顶层是一个顶层元素server,一个tomcat中对应一个server,他是一个非容器组件,里面不能内嵌像valve这样的组件。server上的8005端口是用来监听tomcat的shutdown动作的。Server的主要任务,就是提供一个接口让客户端能够访问到这个Service集合,同时维护它所包含的所有的Service的声明周期,包括如何初始化、如何结束服务、如何找到客户端要访问的Service。
对于Service,他也是一个非容器组件,当然也是不能内嵌像valve这样的组件的。一个server中包含多个Service,Service的作用,是在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。一个Service可以包含多个Connector,但是只能包含一个Engine;其中Connector的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。
Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。
在上面的server例子中,一个Service中包含了两个Connector,分别是
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
上面的两个Connector,上面那个是用来监听8080端口,http协议的请求连接。其中,protocol属性规定了请求的协议,port规定了请求的端口号,redirectPort表示当强制要求https而请求是http时,重定向至端口号为8443的Connector,connectionTimeout表示连接的超时时间。
下面那个Connector,客户端可以通过8009端口号使用AJP协议访问Tomcat。AJP协议负责和其他的HTTP服务器(如Apache)建立连接;在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。之所以使用Tomcat和其他服务器集成,是因为Tomcat可以用作Servlet/JSP容器,但是对静态资源的处理速度较慢,不如Apache和IIS等HTTP服务器;因此常常将Tomcat与Apache等集成,前者作Servlet容器,后者处理静态资源,而AJP协议便负责Tomcat和Apache的连接。
对于Engine组件,Engine在Service组件中有且只有一个;他是Service组件中的请求处理组件。Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。
对于Host组件,一个Engine引擎中至少包含一个Host虚拟主机,而且至少存在一个虚拟主机的name是和Engine中的defaultHost是对应的,当在客户端输入地址的请求匹配不到对应的虚拟主机的时候,就会跳转到默认的虚拟主机。虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
上面的appBase是指web应用发布存放的路径,上面就是我们一般存放在webapps目录下面,而autoDeploy是指是否会自动发布,name就是虚拟主机的名字,upapackWARs是指web应用是直接以war包的形式运行,还是以解压之后的目录来运行。
对于Context,可以认为就是所谓的web应用,Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的,还有一点就是 Context 如何才能找到正确的 Servlet 来执行它呢? Tomcat5 以前是通过一个 Mapper 类来管理的,Tomcat5 以后这个功能被移到了 request 中。
上图中还包含一些jsp编译监听器,全局命名资源等等一些其他组件,这里就不一一介绍了,有兴趣的可以自己深入了解一下!
tomcat本身能够作为一个轻量级的服务器,在日常开发中发挥很大作用,主要是靠内部的各个组件和容器协同合作。所以理解清楚内部的运行机制和一些基础原理,对自己在日常开发中会有不小的作用。不会出现问题就懵逼的窘境!当然tomcat里面还运行了很多很好的设计模式设计理念,像责任链模式等等,这些后续再和大家一起学习总结!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。