之前的两篇文章探讨了两种HTTP Server的工作原理,本篇讲解Java开发中最常使用的一款应用web服务器Tomcat。有过开发经验的人应该了解因为Apache,Nginx等HTTP Server只能解析静态资源,不能解析Java Web开发中使用的Servlet和JSP,因此需要有一款能够解析Java语言的服务器使得Java Web项目能够正常运行。Tomcat作为Java Web项目的容器将项目部署到其webapps目录下即可运行。
Tomcat工作原理
基于Java的Web 应用程序是 servlet、JSP 页面、静态页面、类和其他资源的集合,它们可以用标准方式打包,并运行在来自多个供应商的多个容器。Web 应用程序存在于结构化层次结构的目录中,该层次结构是由 Java Servlet 规范定义的。Web 应用程序的根目录包含直接存储或存储在子文件夹中的所有公共资源,比如图像、HTML 页面等。构成:Web应用由Web组件(一组Java类库)、html文件,静态资源文件(如图像)、帮助类和库组成。
Tomcat Server的组成部分
①Server
一个英文的比较官方的定义
A Server element represents the entire Catalina servlet container. (Singleton)
大致意思就是Server是一个Servlet容器,有且只有一个。Server起管理者的作用,管理Tomcat的其他组件。
②Service
A Service element represents the combination of one or more Connector components that share a single Engine
Service是这样一个集合:它由共享同的一个Engine一个或者多个Connector组成,负责处理所有Connector所获得的客户请求。
③Connector
一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户。
Tomcat包含两类Connector,分别是Coyote Http/1.1 Connector,默认监听8080端口,直接侦听来自browser的http请求。另一类是Coyote JK2 Connector,监听8009端口,侦听来自其它WebServer的请求。如来自Apache或者Nginx的请求。
④Engine
The Engine element represents the entire request processing machinery associated with a particular Service
It receives and processes all requests from one or more Connectors
and returns the completed response to the Connector for ultimate transmission back to the client
从上面这段话得知Engine是处理请求并返回响应的中枢组件,且可以关联一个或多个Connector。Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名。当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理。Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理。如果出现匹配不到的情况,则交由localhost处理。
⑤Host
指一个Virtual Host,虚拟主机和某个网络域名Domain Name相匹配。每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path。当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理。
⑥Context
一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成。Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类。当Context获得请求时,将在自己的映射表(即web.xml中的一众mapping)中寻找相匹配的Servlet类,如果找到,则执行该类,获得请求的回应,并返回。
Tomcat Server处理一个http请求的过程
以http://localhost:8080/mypro/index.jsp的请求过程为例
①请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得。
②Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应。
③ Engine获得请求localhost/mypro/index.jsp,匹配它所拥有的所有虚拟主机Host。
④Engine匹配到名为localhost的Host。
⑤localhost Host获得请求/mypro/index.jsp,匹配它所拥有的所有Context。匹配到路径为/mypro的Context。
⑥Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet。Context匹配到URL PATTERN为*.jsp的Servlet。
⑦构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用Servlet的doGet或doPost方法并把执行完了之后的HttpServletResponse对象返回给Host。
⑧Host把HttpServletResponse对象返回给Engine。
⑨Engine把HttpServletResponse对象返回给Connector。
⑩Connector把HttpServletResponse对象返回给客户browser。
Tomcat的工作流程讲到这里,之后将有专门的文章讲解HTTP Server如何与Application Server相结合使用。将以Tomcat和Nginx整合使用为例。