2018年04月12日 19:55:22 太极小帅帅 阅读数:282
 

前言

一直在用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

tomcat启动原理的更多相关文章

  1. Tomcat启动原理/使用tomcat的应用是如何从tomcat的main函数开始运行的

    从main方法开始打断点,逐步调试,了解程序运行过程 全局唯一的public static void main(String[] args)main Springboot* 内置tomcat,开发的时 ...

  2. SpringBoot内置tomcat启动原理

    前言          不得不说SpringBoot的开发者是在为大众程序猿谋福利,把大家都惯成了懒汉,xml不配置了,连tomcat也懒的配置了,典型的一键启动系统,那么tomcat在springb ...

  3. Tomcat启动过程原理详解 -- 非常的报错:涉及了2个web.xml等文件的加载流程

    Tomcat启动过程原理详解 发表于: Tomcat, Web Server, 旧文存档 | 作者: 谋万世全局者 标签: Tomcat,原理,启动过程,详解 基于Java的Web 应用程序是 ser ...

  4. 从头看看Tomcat启动Spring容器的原理

    通过带注解Spring Boot可以启动一个web容器,并初始化bean容器.那么Tomcat启动并初始化spring容器的原理是怎样的? Tomcat启动web程序时会创建一对父子容器(图1): 有 ...

  5. Tomcat服务器原理详解

    [目录]本文主要讲解Tomcat启动和部署webapp时的原理和过程,以及其使用的配置文件的详解.主要有三大部分: 第一部分.Tomcat的简介和启动过程 第二部分.Tomcat部署webapp 第三 ...

  6. linux开机启动增加tomcat启动项

    需求:开发环境(linux)重启后,每次需手动启动相关应用较为繁琐,如设置为开机自动启动则可减少此工作量. google下,参考了以下博文较好解决了问题: 1. 简单说明 Centos下设置程序开机自 ...

  7. Tomcat工作原理(转)

    Tomcat简介 作者:杨晓(http://blog.sina.com.cn/u/1237288325) 一.Tomcat背景 自从JSP发布之后,推出了各式各样的JSP引擎.Apache Group ...

  8. [解决]Linux Tomcat启动慢--Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [236,325] milliseconds

    一.背景 今天部署项目到tomcat,执行./startup.sh命令之后,访问项目迟迟加载不出来,查看日志又没报错(其实是我粗心了,当时tomcat日志还没打印完),一开始怀疑是阿里云主机出现问题, ...

  9. SpringBoot之旅第六篇-启动原理及自定义starter

    一.引言 SpringBoot的一大优势就是Starter,由于SpringBoot有很多开箱即用的Starter依赖,使得我们开发变得简单,我们不需要过多的关注框架的配置. 在日常开发中,我们也会自 ...

随机推荐

  1. OpenCV Error: Insufficient memory问题解析

    前言 项目程序运行两个月之久之后突然挂了,出现OpenCV Error: Insufficient memory的错误,在此分析一下该问题. 问题的表现形式: 程序内存使用情况: 问题: OpenCV ...

  2. POJ 2312:Battle City(BFS)

    Battle City Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9885   Accepted: 3285 Descr ...

  3. jquery中.prev()

    ☆ 遍历 - .prev()方法:取得一个包含匹配的元素集合中每一个元素紧邻的前一个同辈元素的元素集合.选择性筛选的选择器. (previous:上一个,上一页,前一个,以前的......) 示例: ...

  4. LeetCode Majority Element Python

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  5. Linux下软件包安装

    编译dbus下载地址 :http://dbus.freedesktop.org/releases/dbus/tar zxvf dbus-1.10.0echo ac_cv_have_abstract_s ...

  6. Javascript 正则验证带 + 号的邮箱地址

    很多邮箱地址是可以加上 + 加号为同一个邮箱地址. 比如 Gmail. 如果需要验证带 + 号的邮箱,如下: str = "65485+55@gmail.com"; documen ...

  7. npm 构建时,次要版本变化引起的问题

    问题:下载项目后,运行 npm install 或 yarn install,vue-awesome-swiper 做的功能显示不正常. 解决:从 官方网站 文件 README.md 中找到: // ...

  8. PHP安全相关的配置(2)

    php用越来越多!安全问题更为重要!这里讲解如果安全配置php.ini 安全配置一 (1) 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如syst ...

  9. PLSQL使用SCN码恢复误删表数据

    #查询数据库当前的SCN码select current_scn from v$database 1250494 #将当前的SCN码减小后,根据SCN码查询误删数据表的数据情况#直至找到被删的数据为止s ...

  10. C++将整型数据转换成大端或小端存储顺序

    大端和小端的概念参考之前博客: 大端/小端,高字节/低字节,高地址/低地址,移位运算 昨晚帮导师从指令中恢复图像的时候,导师要我转换成raw格式,也就是记录图像像素的二进制序列,然后反复强调让我注意大 ...