Tomcat服务器是Java开发中最常用的Web服务器。
Tomcat是什么?
Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。
由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。但是,不能将Tomcat和Apache HTTP服务器混淆,Apache HTTP服务器是一个用C语言实现的HTTPWeb服务器;这两个HTTP web server不是捆绑在一起的。Apache Tomcat包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。
Tomcat的系统结构
了解一下Tomcat内部的基本概念:
Tomcat最顶层的容器时Server,代表的是整个服务器。一个Tomcat只有一个Server。一个Server可以有多个Service。
Service可以有多个Connector,但是只有一个Container。
Connector主要负责接收浏览器发过来的TCP连接请求,创建一个Request和Response对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的Request和Response对象传给处理这个请求的线程,处理这个请求的线程就是Container组件要做的事情了。
Container用于封装和管理Servlet实例。
image
下面是Tomcat内部细节图:
image
Tomcat是一个基于组件形式的Web容器,其中server.xml 配置如下:
Server服务器:代表整个Tomcat,它包含所有的容器。
Service服务:相当于一个集合,包含多个Connector(连接)、一个Engine(引擎),它还负责处理所有的Connector获取客户的请求。
Connector连接器:一个Connector在指定接口上侦听客户的请求,并将客户的请求交给Engine来处理并获得回应返回给客户请求。
Engine引擎:一个Engine下可以配置多个虚拟主机Host,每个主机都有一个域名。当Engine获得一个请求时,会把这请求发送到相应的Host上,Engine有一个默认的虚拟主机,如果没有虚拟主机能够匹配这个请求,那就由这个默认的虚拟主机来进行处理请求。
Host主机:代表一个虚拟主机,每个虚拟主机都每个网络域名匹配。每个虚拟主机下面可以部署一个或者多个Webapp ,每个Web对应一个Context,有一个Context Path,当一个Host获取请求时,就把该请求匹配到某个Context上。
Context应用服务:一个Context对应一个Web Application ,一个Web有一个或者多个Servlet组成。Context在创建的时候根据配置文件CATALINA_HOME/conf/web.xml和 Webapp_HOMEconf/web.xml 载入Servlet类,当Context获取请求时,将在自己的映射表中找相匹配的Servlet类,如果找到,则执行该类,获得请求的回应并返回。
Wapper:Wapper代表一个Servlet,它负责管理一个Servlet,包括Servlet的装载、初始化、执行和资源回收。Wapper是最底层的容器了,它没有子容器了。Wapper的实现类是StandardWapper,StandardWapper还实现了拥有一个Servlet初始化信息的ServletConfig,由此看出StandardWapper将直接和Servlet的各种信息打交道
image
image
Tomcat的启动过程
Tomcat作为一个Java应用,也一定是由面方法启动的。以Tomcat7为例,bin目录下的启动脚本catalina.sh文件中指出了main方法所在的类org.apache.catalina.startup.Bootstrap。探寻Tomcat的启动流程也是从这个方法开始的。参考
image
在输入参数带有”start”时,tomcat会执行启动,主要调用三个方法,分别是
bootstrap.init() :1.先从JVM启动参数中读取Tomcat目录路径2.然后初始化Tomcat的classLoader
bootstrap.load() :根据conf/server.xml 文件创建Server并调用Server的init方法进行初始化。(调用各级组件和容器的init())
bootstrap.start() :1.调用各级组件和容器的start()(bootstrap.start()会依次调用catalina.start()、server.start()、service.start()、engine.start()和host.start()),然后部署Web项目。
(deamon即bootstrap对象,在init时创建)
Tomcat处理请求的过程
现在来模拟一个Tomcat处理一个Http请求的过程:
设置一个来自客户端的URL:http://localhost:8080/webgateway/index
服务器8080端口接收到客户端发来的请求,被一个在那里监听的叫HTTP1.1的Connector获取了这个链接请求;
Connector把请求交给同在Service下的Engine去处理,并等待Engine的响应;
Engine把URL解析,并把请求传给相对应的Host处理,如果没有相对应的Host,则用默认名叫Localhost的Host处理;
Host在把URL解析为/webgateway/index, 匹配Context-path为/webgateway/index的Context去处理(如果匹配不到就把该请求交给路径名为""的Context去处理);
Context-path为/webgateway/index 的Context会匹配Servlet Mapping为/index 的Servlet处理;
构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用Servlet的doGet或doPost方法;
Context把处理完的HttpServletResponse对象返回给Host;
Host把HttpServletResponse对象返回给Engine;
Engine把HttpServletResponse对象返回给Connector;
Connector把HttpServletResponse对象返回给客户browser。
参考资料