zoukankan      html  css  js  c++  java
  • tomcat启动原理

     

    前言

    一直在用Tomcat,但是对其启动原理一直没去研究,这里准备去面试,可能会问道。于是总结了下启动原理。完全凭感觉去揣测,没工夫看源码。因此错误之处希望大家批评指正,大家共同进步。我想这也是在忙碌中进步最快的方式了。

    Tomcat的结构

    一个web应用是按照规范组织在一起的,应用包括servlet,JSP,静态页面

    但是我们常说的Tomcat是什么?大多解释说他是server容器。这种说法是很泛型的说法

    汤姆猫服务器(Server)是由一下模块组成的

    Service

    Connector

    故名思议,一个是服务,一个是连接器的意思。

    java是面向对象的语言,那么如果假如我有实力来写服务器我一定会将这个服务器封装为一个对象。相比换做其他人也会这样做。没错,Tomcat一定会这样(虽然我没看源码但是我干肯定)。打开conf/server.xml文件。Tomcat入口一定会加载这个文件。文件最外层的server标签就是即将被加载成Server对象的

    这个对象里面有很多引用类型的属性。其中就包含几个我们几乎不太关注但是有起决定作用的监听器。

    第一个顾名思义是和日志相关的

    第二个顾名思义是监听声明周期的

    第三个顾名思义是和虚拟机内存泄露相关的监听

    第四个是和全局资源声明周期相关的

    第五个是和线程相关的

    好了不管其他的了 来看server对象中最重要的属性Service

    Service

    A "Service" is a collection of one or more "Connectors" that share a single "Container" Note:  A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. 

    service属性就是许多连接器的集合,服务不是一个容器!

    可以看到,Tomcat默认给定义了两个连接器,连接器监听在端口上监听客户请求

    可见,service对象中的Connector对象是监听客户请求的,怪不得我们常用的localhost:8080会跳转就是在这里设置的。

    获得了请求后就怎么办呢?我开始一直想不通 后来又想既然客户在地址栏敲www.xxw.com之类的东东就能访问到Tomcat中的web应用那么肯定有相关的配置和定义才对。于是往下看就找到了答案

    初学Tomcat的朋友一定很好奇为什么在本地启动localhost:8080就能访问到本机中Tomcat自带的web应用,原因就是localhost:8080被监听在8080的连接器捕获,然后拿着locahost去找engine对象,交给engine对象处理。

    引擎拿到了域名就会去找虚拟主机。引擎对象中的Host就是虚拟主机,虚拟主机就是装web应用的目录。Tomcat中的webapps目录中放了很多应用,自己开发的服务器程序也将打成war包放在其中。如果你不想放在这里就自己定义一个虚拟主机即可,可参考我的另一篇文章,具体讲解了如何搭建虚拟主机。

    Host对象中又有一个Context,这个是配置上下文环境的。一个Context对应一个Web Application

    总的来说 Tomcat核心server就分解完了,访问成总结:

    请求地址被连接器拦截  通过域名分发非引擎中的虚拟主机处理。


    tomcat的线程处理

    在server.xml中的<Service name="Catalina">下有一些注释。大致意思是说多个连接器是共享一个线程池的,当然我们可以定义其他的

    这些连接器一般都代表一个线程,或者说连接器会创建多个线程等待客户链接,如果超出就会创建更多的线程,如果属相太多,那么就为客户端的请求做排队,如果队列中的请求都超过一定数量就返回Connect refused

    web.xml文件的加载

    假设来自客户的请求为:  
    http://localhost:8080/wsota/wsota_index.jsp  
    1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得  
    2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应  
    3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host  
    4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)  
    5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context  
    6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为”"的Context去处理)  
    7) path=”/wsota”的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet  
    8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类  
    9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法  
    10)Context把执行完了之后的HttpServletResponse对象返回给Host  
    11)Host把HttpServletResponse对象返回给Engine  
    12)Engine把HttpServletResponse对象返回给Connector  
    13)Connector把HttpServletResponse对象返回给客户browser

  • 相关阅读:
    Chrome Native Messaging 与本地程序之间的通信
    由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
    linux
    maven POM.xml 标签详解 转
    java-线程观察整个生命周期
    java-Web项目开发中Spring整合Junit单元测试
    java-Map集合的四种遍历方式
    Java-8内置的核心函数式接口接口
    正则表达式
    Java-Atomic系列12大类实例讲解和原理分解
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/10593080.html
Copyright © 2011-2022 走看看