Tomcat8 结构原理解析
Tomcat是JavaWeb组件架构中一款apache开源的服务器软件,通过对其的学习,总结并且分享了关于它的知识,下边是分享ppt内容,希望对想了解tomcat人有帮助。
Tomcat历史
- 1999年第一个版本(3.x),基于Sun贡献代码,实现Servlet2.2和JSP1.1
- 2001年里程碑版本4.0,实现Servlet2.3和JSP1.2规范
- 当前Tomcat存在5个主要版本:
- 6.x:JDK5以上
- 7.x:JDK6以上
- 8.x:JDK7以上
- 8.5x:JDK7以上,发布于9.0之后,用于取代8,实现了部分9特性
- 9.x:JDK8以上
Tomcat许可
- 以Apache License许可方式发布
- 免费
- 修改并发布变更版本的用户不必公开修改部分源码
- 修改tomcat的用户不必变更捐献给Apache软件基金会
- 所有包含源码及二进制的重新发布均包含Apache许可
- 任何重新发布的资料必须经过Apache基金会批准
- 无Apache基金会许可并派生自Tomcat的源码产品不能命名为Tomcat,Jakarta,Apache
Tomcat安装与启动
- Windows上安装
- .zip
- .exe
- Linux上安装
- apache-tomcat-8.5.6.tar.gz
- 修改$CATALINA_HOME/bin/catalina.sh修改Tomcat启动配置:JAVA_OPTS
Tomcat嵌入使用支持
- Tomcat支持嵌入到应用程序,比如:SpringBoot中的tomcat
- 使系统以安装包形式独立提供
- 为了满足PAAS环境下应用研发、交付、管理。
- 绑定一个端口将HTTP导出为服务
Tomcat Debug启动
- bin>catalina jpda start
- 依赖于JDK提供的JPDA
- 默认调试端口:8000
Tomcat主要目录结构

Tomcat8.5之后新特性
- Servlet3.1、JSP2.3、EL3.0、WebSocket1.1、9.0开始支持Servlet4.0
- Servlet4.0预览API
- 默认的HTTP、AJP链接器采用NIO,而非BIO
- 全新的资源实现
- 链接器新增支持JDK7的NIO2
- 链接器新增支持HTTP/2协议
- 默认采用异步日志处理方式
- 大量代码重构
Tomcat总体架构设计

Tomcat启动流程

Tomcat请求处理流程

Tomcat类加载机制

- 从缓存中加载
- 如果没有,从JVM的Bootstrap类加载器加载
- 如果没有,则从当前类加载器加载(WEB-INF/classes 、WEB-INF/lib的顺序)
- 如果没有,则从父类加载器加载,由于父类加载器采用默认的委派模式,所以加载顺序为System、Common、Shared
- 如果启用Java委派模式(delegate=true):缓存-Bootstrap-从父类(System、common、shared)-当前类加载器加载
组件Catalina
- 包含所有的容器组件
- 通过松耦合方式集成Cotoye
- 包含启动入口以及Shell
- 使用Apache Digester解析XML配置文件并创建服务器
Catalina依赖关系:

Coyote组件:
- Tomcat链接器名称
- 外部访问接口服务
- 建立链接,发送请求,并接收响应
- 封装底层网络通信协议,为Catalina提供接口,使之与请求协议及I/O方式解耦
- 将Socket输入转换为Request交由Catalina处理
- 提供Response对象将Catalina的处理结果写入输出流
- 此处的Request与Response与Servlet还未关联
Coyote与Catalina交互关系:

Cotoye支持的协议
- HTTP/1.1
- AJP
- HTTP/2.0
- 8.5/9之后移除BIO支持
- NIO java类库实现
- NIO2 JDK7最新的NIO2
- APR(跨平台统一API工具) 采用Apache可移植运行库实现APR是使用C/C++编写的本地库
Jasper:
- 从Tomcat4.1开始重新设计了Jasper2
- 运行时编译
- 预编译:提供JspC用于支持JSP预编译
- 转换为Servlet将页面内容输出
JVM配置项
- 例:JAVA_OPTS= “-server -Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m”
- Xms:堆内存的初始大小
- Xmx:堆内存上限
- XX:PermSize:非堆内存初始大小(JDK8中改为:-XX:MetaspaceSize)
- XX:MaxPermSize:非堆内存上限,(JDK8:-XX:MaxMetaspaceSize)
- 涉及:性能、调试、JVM行为、垃圾回收、可按需添加详见Oracle官网文档
系统属性配置
- 通过-Dproperty命令指定系统属性
- 涉及:属性替换、集群、EL、Jasper、安全、规范、
- 会话、日志、jar扫描等
服务器配置
- catalina.properties
- server.xml
- context.xml
Web应用配置
- SerlverContext初始化参数
- 会话配置
- Cookie
- URL
- SSL
- Servlet声明及映射
- 生命周期监听器
- Filter定义及映射(比如:CorsFilter)
- MIME类型映射
- 欢迎页列表、错误页列表、本地化及编码映射
- 安全配置
- JNDI配置以及其他配置
Web服务器集成
- 静态资源优化
- 多应用、虚拟机整合
- 负载均衡
- 复合场景
- Apache HTTP Server
- Ngnix(高并发、延迟处理、SSL、静态内容压缩缓存、请求限流、HTTP流媒体)
其它Tomcat内容
- 集群
- 可伸缩、高可用、高性能
- 使用Apache Tribes通信模块,
- 会话同步
- 安全
- server.xml移除不必要组件、修改关键配置如shutdown端口
- 应用安全
- 传输安全:SSL ,TLS
- catalina.opolicy
- 性能调优
- 测试与诊断工具
- 配置优化
- Appache Bench、JMeter
- Linux:nload、bmon slurm 套接字:iftop iptraf tcptrack pktstat netwatch等
参考资料:
https://book.douban.com/subject/27034717/
完
Tomcat8 结构原理解析的更多相关文章
- MYSQL索引结构原理、性能分析与优化
[转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...
- 开源磁力搜索爬虫dhtspider原理解析
开源地址:https://github.com/callmelanmao/dhtspider. 开源的dht爬虫已经有很多了,有php版本的,python版本的和nodejs版本.经过一些测试,发现还 ...
- Android中插件开发篇之----应用换肤原理解析
一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转 ...
- Skinned Mesh原理解析和一个最简单的实现示例
Skinned Mesh 原理解析和一个最简单的实现示例 作者:n5 Email: happyfirecn##yahoo.com.cn Blog: http://blog.csdn.net/n5 ...
- (转)HashMap深入原理解析
[HashMap]深入原理解析 分类: 数据结构 自考 equals与“==”(可以参考自己的另一篇博文) 1,基本数据类型(byte,short,char,int,long,float,double ...
- Nginx 原理解析和配置摘要
前言 Nginx 作为高性能的 http 服务器,知名度不必多言,相似产品中无出其右.本篇随笔记录我认为较为重要的原理和配置. 1. 原理解析 1.1 结构 以上是 Nginx 的结构图,其包含一个 ...
- [转]谈NAND Flash的底层结构和解析
这里我想以一个纯玩家的角度来谈谈关于NAND Flash的底层结构和解析,可能会有错误的地方,如果有这方面专家强烈欢迎指正. NAND Flash作为一种比较实用的固态硬盘存储介质,有自己的一些物理特 ...
- Java虚拟机(一)结构原理与运行时数据区域
我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文 ...
- 2. Attention Is All You Need(Transformer)算法原理解析
1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...
随机推荐
- yzoj1657货仓选址 题解
题面: 在一条数轴上有N家商店,它们的坐标分别为 A[1]~A[N].现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品.为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的 ...
- 【Offer】[43] 【1~n整数中1出现的次数】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数.例如,输入12, 1~12这些整数中包含1的数字有1.10.11和12,1 ...
- 章节十六、7-DataProviders
一.当我们的同一个test有多套数据需要进行测试,那么我们就需要用到-->DataProviders package testclasses1; import org.testng.annota ...
- Mysql 用户root密码重置
Asterisk安装完成之后,接手新的Asterisk系统后不清楚Mysql的root账号密码. 重新重置mysql的root密码的方式 先查看mysql的版本号. 我的测试环境下的mysql版本为5 ...
- 基础分类网络VGG
vgg16是牛津大学视觉几何组(Oxford Visual Geometry Group)2014年提出的一个模型. vgg模型也得名于此. 2014年,vgg16拿了Imagenet Large S ...
- java路障CyclicBarrier
当所有线程都执行到某行代码,才可已往下执行: package threadLock; import java.util.Random; import java.util.concurrent.Brok ...
- SpringBoot应用启动过程分析
真的好奇害死猫!之前写过几个SpringBoot应用,但是一直没搞明白应用到底是怎么启动的,心里一直有点膈应.好吧,趁有空去看了下源码,写下这篇博客作为学习记录吧! 个人拙见,若哪里有理解不对的地方, ...
- 当递归遇到synchronized
面试题:有一个synchronized方法,加入该方法发生递归调用,会导致线程死锁码? 解析: 所谓递归函数就是自调用函数,在函数体内直接或间接的调用自己,即函数的嵌套是函数本身. 递归方式有两种:直 ...
- Python数据库小程序
源代码: # dict1 是 字典 , 用来对应相应元素的下标,我们将文件转成列表,对应的也就是文件的下标,通过下标来找文件元素 dict1 = {'sort':0 , 'name':1 ,'age' ...
- 快速了解TCP的流量控制与拥塞控制
有关TCP你不能不知道的三次握手和四次挥手问题,点我跳转 流量控制 1. 滑动窗口 数据的传送过程中很可能出现接收方来不及接收的情况,这时就需要对发送方进行控制以免数据丢失.利用滑动窗口机制可以很方便 ...