Tomcat是什么?


首先看下官网的解释说明(看不懂的可以翻译一下),从第一句Tomcat是Java Servlet,JavaServer页,Java表达式语言和Java的WebSocket技术的一个开源实现。我们不难发现tomcat是java语言编写的,所以这就解释了我们为什么需要安装jvm环境了。其次Servlet/JSP container.意思是他是servlet/jsp的容器。那么我们来想一下我们写的servlet是为什么放入tomcat启动后就能在浏览器上展示了呢。

Tomcat 原理

在不少资料上都会去说Tomcat是web容器和Servlet容器。web容器怎么理解呢?就比如我启动tomcat后,这时候有人访问给了一个请求,我肯定需要一个监听端口的功能,这样我可以去处理这个请求。
那Servlet容器又是什么意思呢?容器就好像一个大罐子,把我们所有的servlet都放进去,这样我们收到请求后根据我们的地址上的信息去访问对应的servlet。

如何去写一个简易版Tomcat

看到上面的信息我们不难就能知道大概的tomcat该怎么写了,首先我们需要监听一个端口,例子我们用8080,其实这例子是真的简单哈哈哈哈

class Mytomcat{//servlet容器List<Servlet> list ;//监听8080端口ServerSocket server = new ServerSocket(8080);Socket socket = server.accpet();//根据web.xml配置加载所有的servletlist.add(servlet);
}

那我们tomcat是真的这么写的吗?我们到官网下个源码看看这边我用的tomcat8的源码,我们找到Connector的类

一段乱鼓秋,突然发现了这个类

继续翻

这边有几个实现,我们点进去看看,不看不要紧,一看发现了要找的就在这里


看到最后你发现原来他真的是每次都是new一个seversocket去监听端口。那他在哪建造servlet容器的啊
哈哈哈哈,我就摊牌了我就直接找到那个类我们看看吧,

上面这段注释写的很清楚:Load and initialize all servlets marked “load on startup” in the web application deployment descriptor.加载所有的servlet。
但是为什么这里是list.add(wrapper);,难道wrapper就是servlet吗?
有经验的同学可能知道tomcat最重要的可能就是web.xml文件了我们从那边看看有什么线索吧这种配置文件搜搜config试试吧,碰巧我们找到了这个类有个方法叫createWebXml(),不用想肯定是了


那我们怎么解析这个文件讲servlet添加到容器里的呢?

巧了不是,正好有方法Scan the web.xml files that apply to the web application 。

点进去看看

看到这一段大概就清楚了,扫描servlet标签创建了个wrapper,这样岂不是跟我们想的一样。只是他包装成了wrapper,为什么要包装,一般用包装就是让他更强。
那我就好奇了,既然servlet标签代表的是一个servlet,那难道说web.xml里面的每个标签都是一个组件吗?

解析server.xml文件

从网上找了个tomcat的图,如下图:

这个能很形象描绘tomcat的内部机构,那为什么明明就监听端口、servlet容器这些功能为什么会这么复杂,哈哈哈哈哈,我觉得是为了解耦,高内聚低耦合吧,我们如何会发现图中的组件在server.xml中都有对应的标签等等,每个部分到底什么作用可以参考官网,他们写的比我详细的多。其实我是嫌麻烦哈哈哈。

如何优化Tomcat

评价一个tomcat的性能高取决于哪些因素呢?

吞吐量、响应时间、线程池、CPU、内存等等

命令或者工具有哪些呢?

ps -ef|grep tomcat pid
查看状态
cat /pro/pid/status
查看CPU,和内存占用
top -p pid

工具用哪些呢?
tomcat是一个Java进程,可以用jvm方面的工具查看比如说:
jconsole、jvisualvm、arthas、psi-probe等等
还可以修改tomcat-users.xml利用tomcat自带的功能去查看tomcat进程的属性。

知道如何查看性能了,如果我们想要优化Tomcat,我们就必须知道我们从什么方面开始。首先我先从官网下载Tomcat8的源码(版本随便),怎么开始看呢?我这个人比较偷懒,不想自己动手,想着从官网中看看有没有答案。
还真的找到了:官网地址在这里


我们从中可以看到UML图,这些图分为三步:
1.catalina加载

2.catalina启动

3.发布app

照着源码和时序图慢慢看吧,大概懂啥意思就行。
扯了半天咋优化tomcat啊,其实你从初始化、启动、发布应用三个步骤中我们能发现,其实tomcat就是通过Digester将server.xml解析,将Server、Service、Enginee等等上面那张tomcat组件图全部初始化后启动。这么细细一想,那岂不是优化tomcat本质上就是优化server.xml。想想确实是那么回事,那我们怎么才能优化呢?
还是找着官网的说明吧,

看了官网发现,其实真正可以被我们优化的就只有Connector、Host、Context、Executor这四个了。

Connector优化

怎么优化我们必须得看看代码了,那我们自然会想到connector类里面看看吧。

看看构造函数,在比较比较server.xml

别的都能看得懂protocol是什么东西呢?通过更改会走不同的protocol

再来官网看看有什么发现没?

很详细,但简单的来说:总体有四种实现(根据tomcat的版本不一样而变化)BIO,NIO,NIO2,APR四种,BIO用于并发小,每次请求就会建一个线程。NIO,NIO2是一个线程可以处理多个请求NIO2是NIO的升级版。APR是访问本地库什么巴拉巴拉的。我们可以通过更改xml的protocol,优化tomcat。

Executor优化

线程池优化肯定是跟Connector一起做用的,无非是调线程池最大线程数之类的。

Tomcat原理和源码分析相关推荐

  1. Nacos高级特性Raft算法以及原理和源码分析

    Nacos高级特性Raft算法以及原理和源码分析 对比springcloud-config配置中心 springcloud-config工作原理 Nacos的工作原理图 springcloud-con ...

  2. java.lang.ThreadLocal实现原理和源码分析

    java.lang.ThreadLocal实现原理和源码分析 1.ThreadLocal的原理:为每一个线程维护变量的副本.某个线程修改的只是自己的副本. 2.ThreadLocal是如何做到把变量变 ...

  3. 【项目一、xxx病虫害检测项目】1、SSD原理和源码分析

    目录 前言 一.SSD backbone 1.1.总体结构 1.2.修改vgg 1.3.额外添加层 1.4.需要注意的点 二.SSD head 2.1.检测头predictor 2.2.生成defau ...

  4. RocketMq-dashboard:topic 5min trend 原理和源码分析(一)

    本文阅读基础:使用或了解过rocketMq:想了解"topic 5min trend"背后的原理:想了解监控模式如何实现. RocketMq的dashboard,有运维页面,驾驶舱 ...

  5. ConcurrentHashMap的实现原理和源码分析

    原文链接:http://www.jianshu.com/p/7f42ba895a64 前言 在Java1.5中,并发编程大师Doug Lea给我们带来了concurrent包,而该包中提供的Concu ...

  6. 高级JAVA - 动态代理的实现原理和源码分析

    在之前的一篇文章中 , 我们简单了解了一下代理模式(JAVA设计模式 - 代理模式) , 本篇我们来学习一下动态代理的实现原理 , 以及源码是怎样的 . JDK动态代理的主要实现步骤如下 : 1 . ...

  7. ConcurrentLinkedQueue的实现原理和源码分析

    原文链接:http://www.jianshu.com/p/26d9745614dd 前言 我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法.使用阻塞算法的队列可以 ...

  8. 深入理解GO语言:map结构原理和源码分析

    Map结构是go语言项目经常使用的数据结构,map使用简单对于数据量不大的场合使用非常合适.Map结构是如何实现的?我们先从测试程序入手,我们希望分析map的创建.插入.查询.删除等流程,因此我们的测 ...

  9. Alertmanager 配置文件分析、原理和源码分析

    相关prometheus组件的基本知识总结,以下分析仅代表个人观点,如有错误还请指出,不胜感谢! 基本概述 我们先从应用的角度来看详细的介绍一下alertmanager以下简称am,以下是官方文档介绍 ...

最新文章

  1. shell脚本常用的4种流程控制语句
  2. [Cocoa, 医疗]Dicom Image Viewer for iPad
  3. 分布式理论(一)CAP 理论
  4. 从godaddy转出域名
  5. Notepad++中高亮显示ABAP代码方法
  6. java23中设计模式——行为模式——Memento(备忘机制)
  7. 开发中一些常用的css小技巧
  8. JSON中JObject和JArray,JValue序列化(Linq)
  9. Atitit it计算机应用体系图  大数据 爬虫 非结构数据 nosql redis mongodb 分布式存储 es搜索 可视化 多媒体与office 19.1. 14.3 计
  10. centos7通过阿里云配置docker加速镜像
  11. 【课程设计-毕业设计】机械设计课程设计选题-含设计说明书
  12. LaTeX及TeXstudio下载地址
  13. U盘制作ubuntu18.04.6系统安装盘
  14. 股票账户各权限开通条件总结【干活总结】
  15. Github上的开源项目2
  16. 实现一个HTTP代理服务器(哈工大计网实验一Java版)
  17. 超级计算机在天文学的应用,破世界记录:交大π2.0超算系统实现天文学N体模拟粒子数新突破...
  18. WordPress 函数大全
  19. 【教程】Python科研数据可视化、MATLAB科研数据可视化
  20. PHP curl 中文gbk转utf8

热门文章

  1. jQuery实现的分页功能,包括ajax请求,后台数据
  2. 长沙市明德华兴中学2015班在湖南省智慧教育装备展示体验中心开展寒假社会实践活动
  3. 《数学之美(第一版)》笔记整理 —— 目录
  4. 如何在Ubuntu 20.04上用命令行建立l2tp连接
  5. rundl132.exe,logo1_.exe 病毒专杀工具
  6. 解决MacOS12.6自带的屏幕录制闪退的问题
  7. [学习笔记]Python for Data Analysis, 3E-11.时间序列
  8. android中 menu的属性详细解释
  9. 浅析网络编程之AF_INET和PF_INET
  10. Ubuntu16.04安装MATLAB2018a并进行破解