大家好,今天来为大家分享Tomcat 核心工作原理与架构解析的一些知识点,和的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
在学习框架的时候,我一般都是对这个框架有一个整体的认识。知道它整体是如何运行的,然后再深入其中某部分进行研究,这样会事半功倍。
整体架构
我们想要了解一个框架,首先要了解它是干什么的,Tomcat我们都知道,是用于处理连接过来的Socket请求的。那么Tomcat就会有两个功能:
- 对外处理连接,将收到的字节流转化为自己想要的Request和Response对象
- 对内处理Servlet,将对应的Request请求分发到相应的Servlet中
那么我们整体的骨架就出来了,Tomcat其实就分为两大部分,一部分是连接器(Connnector)处理对外连接和容器(Container)管理对内的Servelet。大体的关系图如下
最外层的大框就是代表一个Tomcat服务,一个Tomcat服务可以对应多个Service。每个Service都有连接器和容器。这些对应的关系我们也可以打开在Tomcat目录配置文件中server.xml中看出来。
- <Server port="8006" shutdown="SHUTDOWN">
- <Service name="Catalina">
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
- <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
- <Engine name="Catalina" defaultHost="localhost">
- <Realm className="org.apache.catalina.realm.LockOutRealm">
- <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
- resourceName="UserDatabase"/>
- </Realm>
- <Host name="localhost" appBase="webapps"
- </Host>
- </Engine>
- </Service>
- </Server>
这里我将其中配置文件中删除了一些内容精简了一下,这里我们可以看到连接器其实就是Connector,一个Service中可以在多个连接器,容器其实对应的就是Engine。
Tomcat的整体架构简单来说就是这样的对应关系。接下来我们简单的介绍连接器的整体架构和容器的整体架构。
连接器
我们可以看到上图中连接器传给容器的是ServletRequest对象,而容器传给连接器的是ServletResponse对象,这些在网络传输过程中是肯定不行的,因为网络传输中传送的字节流。所以连接器的功能需求我们大概能总结出来以下几点。
- Socket连接
- 读取请求网络中的字节流
- 根据相应的协议(Http/AJP)解析字节流,生成统一的Tomcat Requestt对象
- 将Tomcat Reques传给容器
- 容器返回Tomcat Response对象
- 将Tomcat Response对象转换为字节流
- 将字节流返回给客户端
其实上面的细分都能总结为以下的三点
- 网络通信
- 应用层协议的解析
- Tomcat的Request/Response与ServletRequest/ServletResponse对象的转化
而在Tomcat中它也用了三个类来实现上面的三个功能,分别对应如下
- Processor
- Adapter
用图表示他们的关系的话就是这样
容器
容器,顾名思义就是装东西的器具,那么这个Tomcat容器是装什么的呢?其实主要的就是装了Servlet的。那么容器是如何设计的呢?Tomcat的容器设计其实是用了组合设计模式。其实从Server.xml中我们也能看到其关系了。
- <Engine name="Catalina" defaultHost="localhost">
- <Host name="localhost" appBase="webapps"
- unpackWARs="true" autoDeploy="true">
- </Host>
- </Engine>
在这里面我们只能看到容器中的两个模块,一个是顶层模块Engine,另一个是Host,其实还有两个模块,一个是Context对应的是我们webapp里面的每个应用文件夹,每个文件夹就是对应一个Context,还有一个模块Wrapper对应的是我们Context中的所有servlet,Wrapper管理了访问关系与具体的Servlet的对应。图表示就是下面这样。
Tomcat中容器所有模块都实现了Container接口,而组合模式的意义就是使得用户对于单个对象和组合对象的使用具有一致性,即无论添加多少个Context其使用就是为了找到其下面的Servlet,而无论添加多少个Host也是为了找个下面的Servlet。而在容器中设计了这么多的模块,一个请求过来Tomcat如何找到对应的Servlet进行处理呢?
请求如何定位
我们就举个最简单的例子,我们本机应用上启动了一个Tomcat,webapp下有我们部署的一个应用buxuewushu。我们在浏览器上输入http://localhost:8080/buxuewushu/add.do是如何找到对应Servlet进行处理呢?
在我们启动Tomcat的时候,连接器就会进行初始化监听所配置的端口号,这里我们配置的是8080端口对应的协议是HTTP。
- 请求发送到本机的8080端口,被在那里监听的HTTP/1.1的连接器Connector获得
- 连接器Connector将字节流转换为容器所需要的ServletRequest对象给同级Service下的容器模块Engine进行处理
- Engine获得地址http://localhost:8080/buxuewushu/add。匹配他下面的Host主机
- 匹配到名为localhost的Host(就算此时请求为具体的ip,没有配置相应的Host,也会交给名为localhost的Host进行处理,因为他是默认的主机)
- Host匹配到路径为/buxuewushu的Context,即在webapp下面找到相应的文件夹
- Context匹配到URL规则为*.do的servlet,对应为某个Servlet类
- 调用其doGet或者doPost方法
- Servlet执行完以后将对象返回给Context
- Context返回给Host
- Host返回给Engine
- Engine返回给连接器Connector
- 连接器Connector将对象解析为字节流发送给客户端
链接:https://juejin.im/post/5d007570f265da1b8b2b5671
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7875.html
用户评论
终于找到一篇解释tomcat原理的文章了,期待学习一下!
有5位网友表示赞同!
我是程序员新手,对tomcat一直不太了解,这篇分析挺有帮助的。
有12位网友表示赞同!
看看能不能深入理解tomcat的生命周期,这对开发来说很重要。
有7位网友表示赞同!
我一直用过tomcat却没搞清楚它的架构,看完这篇文章也许就能明白了吧。
有13位网友表示赞同!
51CTO的文章质量还是不错的,相信这篇分析会让我对tomcat有更清晰的认识。
有8位网友表示赞同!
准备学习部署Web应用,先来了解一下tomcat运行机制,方便实战操作。
有9位网友表示赞同!
看完评论感觉这篇文章能全面解释tomcat运作方式,值得一读!
有18位网友表示赞同!
我对javaweb开发有兴趣,希望这篇文章能让我更好地理解tomcat的内部结构。
有8位网友表示赞同!
以前总是听说tomcat,现在想终于学习一下它的运行原理了!
有12位网友表示赞同!
我平时用的技术栈里也有tomcat,想更深入地了解它工作原理。
有9位网友表示赞同!
想要做好java web开发,掌握tomcat的知识是必不可少的。
有12位网友表示赞同!
这篇文章应该能解释清楚tomcat各个组件的作用,方便以后调试程序。
有8位网友表示赞同!
之前遇到过tomcat的问题,希望通过这篇分析能找到解决方法
有19位网友表示赞同!
学习一个技术最好的方式就是从基础原理开始,这篇文章正好适合我!
有16位网友表示赞同!
感觉这篇文章能把我对tomcat的理解提升到一个新层次。
有19位网友表示赞同!
tomcat是很多web项目的基础,希望能从这篇分析中获取一些宝贵知识。
有9位网友表示赞同!
我计划学习java开发,掌握tomcat运行机制可以让我更快上手
有16位网友表示赞同!
对程序员来说了解底层的架构和原理非常重要,期待这篇文章能给我启发!
有15位网友表示赞同!
很多人都说理解tomcat关键在于了解它的整体架构,这篇文章正好讲了这一点。
有7位网友表示赞同!