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许可

  1. 以Apache License许可方式发布
  2. 免费
  3. 修改并发布变更版本的用户不必公开修改部分源码
  4. 修改tomcat的用户不必变更捐献给Apache软件基金会
  5. 所有包含源码及二进制的重新发布均包含Apache许可
  6. 任何重新发布的资料必须经过Apache基金会批准
  7. 无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之后新特性

  1. Servlet3.1、JSP2.3、EL3.0、WebSocket1.1、9.0开始支持Servlet4.0
  2. Servlet4.0预览API
  3. 默认的HTTP、AJP链接器采用NIO,而非BIO
  4. 全新的资源实现
  5. 链接器新增支持JDK7的NIO2
  6. 链接器新增支持HTTP/2协议
  7. 默认采用异步日志处理方式
  8. 大量代码重构

Tomcat总体架构设计

Tomcat启动流程

Tomcat请求处理流程

Tomcat类加载机制

  1. 从缓存中加载
  2. 如果没有,从JVM的Bootstrap类加载器加载
  3. 如果没有,则从当前类加载器加载(WEB-INF/classes 、WEB-INF/lib的顺序)
  4. 如果没有,则从父类加载器加载,由于父类加载器采用默认的委派模式,所以加载顺序为System、Common、Shared
  5. 如果启用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/

http://tomcat.apache.org/

最新文章

  1. 用php实现一个简单的链式操作
  2. thinkphp全站静态页实现方法
  3. Spring事务管理者与Spring事务注解--声明式事务
  4. POJ 1094 Sorting It All Out (拓扑排序,判断序列是否唯一,图是否有环)
  5. CSS之图片旋转
  6. 导入旧版本Android项目时的“Unable to resolve target ‘android
  7. mysql数据库编码
  8. Python中星号的本质和使用方式
  9. pytorch查看CUDA支持情况,只需要三行代码,另附Cuda runtime error (48) : no kernel image is available for execution处理办法
  10. ROS中使用Kinect摄像头和usb摄像头
  11. PHP全局变量,超全局变量
  12. Give root password for maintenance(or type control -D to continue)
  13. 通过gmapping和伪造的odom,完成Kinect建图
  14. 将 GitHub 上的代码向 Coding 更新
  15. 在linux中安装字体
  16. 1601O_HOME
  17. 使用libcurl开源库和Duilib做的下载文件并显示进度条的小工具
  18. Codeforces Round #263 (Div. 2) proC
  19. 从源代码来理解ArrayList和LinkedList差别
  20. EMQ ---v2.3.11源码成熟度

热门文章

  1. Ubuntu18.04双系统下安装CUDA10+cuDNN7.5
  2. 解决问题:SpringMvc中转发的html文件中文是乱码
  3. 牛客网暑期ACM多校训练营(第三场)---A.PACM Team
  4. Mac 不显示未知来源选项的解决办法/连接不上网络
  5. 【1】KNN(K-nearest neighbors algorithm)
  6. JavaScript里处理数字的一些常用方法
  7. virtualbox下给centos7固定ip
  8. Vue中的slot(占坑,预留位置)
  9. 脚本代码混淆-Python篇-pyminifier(1)
  10. .Net基础篇_学习笔记_第六天_for循环语法_正序输出和倒序输出