理解Tomcat架构、启动流程及其性能优化
PS:but, it's bullshit !
备注:实话说,从文档上扒拉的,文档地址:在每一个Tomcat安装目录下,会有一个webapps文件夹,里面有一个docs文件夹,点击index.html 或者直接上官网看文档也一样:http://tomcat.apache.org/tomcat-8.0-doc/
一、Tomcat目录结构说明
说明:这个是Tomcat 8 版本!
整体的目录结构如下,对于每个文件夹都是干嘛的,文件夹内部的文件又是用来干嘛的,那就点开RUNNING.txt文件看吧,说的特别清晰明白。我就简单说说第一层的内容:
* bin - Only the following files:
* setenv.sh (*nix) or setenv.bat (Windows),
* tomcat-juli.jar
The setenv scripts were described above. The tomcat-juli library
is documented in the Logging chapter in the User Guide.
* conf - Server configuration files (including server.xml)
* lib - Libraries and classes, as explained below
* logs - Log and output files
* webapps - Automatically loaded web applications
* work - Temporary working directories for web applications
* temp - Directory used by the JVM for temporary files (java.io.tmpdir)
备注:webapps里面有培训资料哦,Tomcat实现的Java EE规范,怎么实现的,都有哦!它告诉你怎么学Tomcat,傻瓜式教程,哈哈!
二、Tomcat的启动流程
文档路径:http://tomcat.apache.org/tomcat-8.0-doc/architecture/index.html
1,Tomcat架构
server
在Tomcat的世界里,一个server代表了整个容器。Tomcat为用户提供了server interface的默认实现,因此用户可不必自定义实现。
service
service是server容器中的一个内部组件,它绑定一个或多个Connector到一个具体的引擎上。关于service节点很少有用户去自定义实现,因为默认的实现足够简单和健全。
engine
engine表示特定服务的请求处理流程。一个service可能有多个connector,引擎接收并处理来自这些连接器的所有请求,将响应返回到适当的连接器以传输到客户端。引擎接口可以自定义实现,尽管这并不常见。 请注意:引擎可以通过jvmRoute参数用于Tomcat服务器集群。 关于集群配置,需要阅读集群文档(妈蛋的,我是背不住那么多了,面试被问到,算我倒霉)
host
host是网络名称的关联,例如www.yourcompany.com,关联到Tomcat服务器。一个engine可能包含多个主机,Host元素还支持网络别名,例如yourcompany.com和abc.yourcompany.com。用户很少创建自定义host,因为StandardHost实现提供了显著的附加功能
connector
一个connector处理与客户端的通信。 Tomcat有多个connector,包括用于大多数HTTP流量的HTTP连接器,特别是作为独立服务器运行Tomcat时,以及实现将Tomcat连接到Web服务器(如Apache HTTPD服务器)时使用的AJP协议的AJP连接器。创建定制连接器是一项巨大的工程。
context
一个context表示一个Web应用程序。一个主机可能包含多个上下文,每个具有唯一的路径。可以实现Context接口来创建自定义上下文,但是很少出现这种情况,因为StandardContext提供了基本的所需功能
2,Tomcat的启动流程
文档路径:http://tomcat.apache.org/tomcat-8.0-doc/architecture/startup.html
文档里面有时序图和文字说明,图有点大,文字说明太过详细,我直接简化一下文字说明。
处理Tomcat命令(bootstrap类)——处理命令中的参数(bootstrap类)
处理Tomcat命令包括:
1,设置类加载器,第一个是公共类加载;第二个是共享的类加载;第三个是服务(应用)的类加载。备注:在5 的时候,Tomcat对lib里面的jar包做了分类,而现在没有了!
2,通过反射加载用于启动服务的类(Catalina),首先是加载公共的类,再加载服务的类
3,初始化Tomcat命令完成:Bootstrap.daemon.init()
处理命令中的参数包括:
这个过程很庞大,我说第一层宏观,再详细的,看文档吧。以start 参数为例:
1,Catalina.setAwait(true)——2,Catalina.start()——3, Tomcat receives a request on an HTTP port——4,Invocation of the servlet class
关键:根据Tomcat的启动流程,可以优化的点:加快Tomcat的启动:如果Tomcat的lib文件夹里面,有应用程序中涉及到的jar,那么删除应用文件中的jar,maven使用provided标签。 我在想一个问题,Tomcat会启动一个JVM进程,那这个进程会首先去加载JRE里面的jar包,JDK,Tomcat容器,应用程序,这几个之间能不能共享jar,如果不能共享,那要是我版本不一样,jar冲突???
3,Tomcat处理一个请求的流程
时序图,看了一下,大概是从协议—adapter适配—engine—host—context—filterChain—servlet
http://tomcat.apache.org/tomcat-8.0-doc/architecture/requestProcess/request-process.png
三、Tomcat优化
1,Tomcat官网的公共问题区有相关提问,可以参考一下
2,Tomcat给出的性能提升的方案建议:https://tomcat.apache.org/articles/performance.pdf 哈哈,仔细看,那是相当有意思。
3,一个比较谱儿的网站,给出的关于Tomcat优化的几个切入点:https://www.packtpub.com/mapt/book/application_development/9781849516624/3
4,一些别的说法:修改启动模式、调整线程数等:http://tomcat.apache.org/tomcat-8.0-doc/config/http.html
理解Tomcat架构、启动流程及其性能优化的更多相关文章
- Tomcat详解系列(2) - 理解Tomcat架构设计
Tomcat - 理解Tomcat架构设计 前文我们已经介绍了一个简单的Servlet容器是如何设计出来,我们就可以开始正式学习Tomcat了,在学习开始,我们有必要站在高点去看看Tomcat的架构设 ...
- Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析
Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...
- (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...
- (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...
- java架构师负载均衡、高并发、nginx优化、tomcat集群、异步性能优化、Dubbo分布式、Redis持久化、ActiveMQ中间件、Netty互联网、spring大型分布式项目实战视频教程百度网盘
15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; ...
- Java 架构师+高并发+性能优化+Spring boot大型分布式项目实战
视频课程内容包含: 高级 Java 架构师包含:Spring boot.Spring cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.Zer ...
- MySQL 启动参数说明及性能优化建议
[mysqld] port = 3306 serverid = 1 socket = /tmp/mysql.sock skip-name-resolve #禁止MySQL对外部连接进行DNS解析,使用 ...
- php运行代码流程和性能优化方法
---恢复内容开始--- php文件->扫描->zd引擎去理解->opcodes->执行->输出 例子,用white随机循环20000数据进行性能测试,分别对比isset ...
- 大型网站技术架构,4网站的高性能架构之Web前端性能优化
一般说来Web前端指网站业务逻辑之前的部分,包括浏览器加载.网站视图模型.图片服务.CDN服务等,主要优化手段有优化浏览器访问.使用反向代理.CDN等. 4.2.1 浏览器访问优化 1.减少http请 ...
随机推荐
- UVALive 3938 Ray, Pass me the dishes! (动态最大连续和)
题意:求一个动态区间的最大连续和. 静态版本的O(n)算法显示不适用了,但是可以用线段树分治,因为一个连续和要在两边的区间,要么跨越两边,对于一个结点维护最大前缀和,后缀和,子区间连续和. 题目要求输 ...
- Android(java)学习笔记134:Android数据存储5种方式总结
1.使用文件(File)存储 存储一般的数据 2.使用sharedperference(xml) 存储设置信息.配置信息.密码 3.数据库Sqlite 开源的,嵌入式的数据库,轻量级 4.使用Cont ...
- Controller接收处理json、xml格式数据
1.RequestBody接收json格式的数据,并直接转为对象. User.java使用lombok依赖包 @Data @AllArgsConstructor @NoArgsConstructor ...
- leetcode 179. Largest Number 、剑指offer33 把数组排成最小的数
这两个题几乎是一样的,只是leetcode的题是排成最大的数,剑指的题是排成最小的 179. Largest Number a.需要将数组的数转换成字符串,然后再根据大小排序,这里使用to_strin ...
- spring-data-JPA源码解读
spring-data-JPA源码部分有两个很重要的部分:1.识别repositories接口 2.将接口添加代理实现类并托管spring管理 JpaRepositoriesRegistrar 目的是 ...
- PAT (Basic Level) Practise (中文)- 1008. 数组元素循环右移问题 (20)
一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……AN-1)变换为(AN-M …… AN-1 A0 ...
- Find the Longest Word in a String-freecodecamp算法题目
Find the Longest Word in a String(找出最长单词) 要求 在句子中找出最长的单词,并返回它的长度 函数的返回值应该是一个数字. 思路 用.split(' ')将句子分隔 ...
- Windows 10+Ubuntu双系统修复Ubuntu启动引导
U盘启动,联网 $ sudo su sudo add-apt add-apt-repository ppa:yannubuntu/boot-repair apt-get update apt-get ...
- chrome浏览器跳过(忽略)所有的js断点
在调试程序时我们经常通过打断点的方式来跟踪代码的执行流程,所以可能会在很多时候打很多断点,当我们知道了程序大概的执行流程之后,这时候断点就不太需要了.但是我们又不想马上把所有的断点清除掉,因为我们打的 ...
- SQL Server ALwayson 正在解析
原因:把主库切换到辅助副本以后,集群全部出现正在解析的情况,数据库显示“恢复挂起” 过程:把服务器重启,原以为正在解析会恢复正常.结果失败. 解决方法:出现“正在解析”的情况跟故障转移群集有关,进故障 ...