JavaWEB大神成长篇:深入 Tomcat 内核之Server、Service、Connector、Engine 组件全解析与请求处理流程(第二期)
本文摘要: Tomcat核心组件解析:详细介绍了Tomcat的Server、Service、Connector、Engine、Host和Context等核心组件及其配置参数,阐述了请求处理流程。HTTP协议部分解释了超文本概念,HTTP作为超文本传输协议的特点(基于TCP/IP、客户端/服务器模式、简单快速、灵活支持多种数据类型),以及无连接特性(每次请求后释放连接)。文章通过架构图和配置示例直观
·
Tomcat主要组件
-
Tomcat体系结构图

-
Server组件
-
启动一个server实例(即一个JVM),它监听在8005端口以接收shutdown命令
-
Server的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个Server实例,必须配置它们使用不同的端口
<Server port="8005" shutdown="SHUTDOWN"> // port: 接收shutdown指令的端口,默认为8005 // shutdown: 发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN -
-
Service组件
<Service name="Catalina"> // name: 此服务的名称,默认为Catalina -
Connector组件
-
支持处理不同请求的组件,一个引擎可以有一个或多个连接器,以适应多种请求方式
-
默认只开启了处理Http协议的连接器
-
如果需要使用其他协议,需要在Tomcat中配置该协议的连接器
-
在Tomcat中连接器类型通常有4种:
<Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> // port:监听的端口 // protocol:连接器使用的协议,默认为HTTP/1.1 // connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒 // redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口 // maxThreads:支持的最大并发连接数,默认为200个
-
-
Engine组件
-
Engine是Servlet处理器的一个实例,即servlet引擎,定义在server.xml中的Service标记中
-
Engine需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件
<Engine name="Catalina" defaultHost="localhost"> // name:Engine组件的名称 // defaultHost:Tomcat支持基于FQDN(Fully Qualified Domain Name 全限定域名)的虚拟主机,这些虚拟主机可以通过在Engine容器中定义多个不同的Host组件来实现 // 但如果此引擎的连接器收到一个发往非非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在Engine中定义的多个虚拟主机的主机名称中至少要有一个跟defaultHost定义的主机名称同名 -
-
Host组件
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> // name:虚拟主机的名称,Tomcat通过在请求URL中的域名与name中的值匹配,用于查找能够处理该请求的虚拟主机。如果未找到则交给在Engine中defaultHost指定的主机处理 // appBase:此Host的webapps目录,即指定存放web应用程序的目录的路径 // autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true // unpackWARs:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true -
Context组件
<Context path="/test" docBase="D:\mashibing.war" /> // path:context path既浏览器访问项目的访问路径 // docBase:相应的Web应用程序的存放位置 // 也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径 -
Tomcat处理请求过程

-
1、用户访问
localhost:8080/test/index.jsp,请求被发送到Tomcat,被监听8080端口并处理HTTP/1.1协议的Connector获得 -
2、
Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应 -
3、
Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host -
4、
Engine匹配到名为localhost的Host虚拟主机来处理/test/index.jsp请求(即使匹配不到会请求交给默认Host处理),Host会根据/test匹配它所拥有的所有的Context -
5、匹配到的
Context获得请求/index.jsp -
6、构造
HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost(), 执行业务逻辑、数据存储等程序 -
7、
Context把执行完之后的结果通过HttpServletResponse对象返回给Host -
8、
Host把HttpServletResponse返回给Engine -
9、
Engine把HttpServletResponse对象返回Connector -
10、
Connector把HttpServletResponse对象返回给客户Browser
-
-
HTTP协议
-
HTTP协议
-
概念
-
HTTP协议介绍
-
HTTP协议特点
-
HTTP协议发展和版本
-
概念
-
http1.0
-
http1.1
-
到1999年广泛在各大浏览器网络请求中使用,HTTP/1.0中默认使用Connection: close
-
在
HTTP/1.1中已经默认使用Connection: keep-alive(长连接),避免了连接建立和释放的开销,但服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容 -
不允许同时存在两个并行的响应
-
1.1中最重要的一个特点是支持“长连接”,即“一次连接可以多次请求”

-
HTTP 1.1支持持久连接(HTTP/1.1的默认模式使用带流水线的持久连接),在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟
-
一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接
-
HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间
-
-
http2.0
-
长连接
-
多路复用 (Multiplexing)
-
HTTP2.0中所有加强性能的核心是二进制传输,在HTTP1.x中,我们是通过文本的方式传输数据 -
在HTTP2.0中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码
-
多路复用,连接共享 -
不同的request可以使用同一个连接传输(最后根据每个request上的id号组合成正常的请求) -
HTTP2.0中,有两个概念非常重要:帧(frame)和流(stream) -
帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流是多个帧组成的数据流 -
所谓多路复用,即在一个TCP连接中存在多个流,即可以同时发送多个请求,对端可以通过帧中的表示知道该帧属于哪个请求 -
在客户端,这些帧乱序发送,到对端后再根据每个帧首部的流标识符重新组装 -
通过该技术,可以避免HTTP旧版本的队头阻塞问题,极大提高传输性能
-
-
首部压缩(Header Compression)
-
服务端推送(Server Push)
-
更安全
-
-
-
-
HTTP请求
-
HTTP协议的请求
-
Request 消息分为3部分
-
请求的主要组成部分
-
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:



-
请求行:
-
请求头:
-
请求体
-
请求方式
-
GET和POST的区别 (重要, 面试常问)
-
GET 在浏览器回退时是无害的,而 POST 会再次提交请求
-
GET 产生的 URL 地址可以被 Bookmark,而 POST 不可以
-
GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置
-
GET 请求只能进行 url 编码,而 POST 支持多种编码方式
-
GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留
-
GET 请求在 URL 中传送的参数是有长度限制的,而 POST 则没有
-
对参数的数据类型 GET 只接受 ASCII 字符,而 POST 即可是字符也可是字节
-
GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息
-
GET 参数通过 URL 传递,POST 放在 Request body 中
-
-
-
HTTP响应
-
响应的主要组成部分
-
HTTP状态码分类
-
HTTP状态码列表
-
常见状态码及含义
-
响应头
-
响应体
-
JAVAWEB项目的开发和部署
-
认识JAVAWEB项目结构
-
使用idea开发JAVAWEB项目
-
使用idea运行项目
-
在项目中开发一些资源
-
启动项目之前, 先对项目进行配置
-
点击 Edit Configurations 对项目进行启动之前的配置

-
在 Deployment 中, Deployed at the server startup 里确认要部署的项目是不是我们要运行的项目
-
在 Application context 中指定我们项目访问的路径名
-
idea 默认是 项目名 + “_war_exploded”, 在这里我们可以对项目的访问名进行修改, 如果不修改, 也OK, 可以一样使用

-
在Server选项中, 勾选 Open browser 中的 After launch 选项, 这样 idea 在启动项目之后可以自动帮助我们打开浏览器并访问 URL 中的资源
-
On Update action :
-
On Frame deactivation :
-
HTTP port 默认为 8080 不用修改
-
JMX port 默认为 1099 不用修改
-
然后点击OK

-
然后点击运行启动即可

-
启动之后 用浏览器打开对应文件, 控制台网络一栏共发现4个有效请求,
firstpage.html为我们请求的页面 -
myjs.jsmycss.csslogo.png这三个请求和响应是因为firstpage.html中引入的 这三个文件, 浏览器自动发送请求获得这三个文件 -
favicon.ico是在请求Tomcat中的"小狮子" 图片, 这里请求失败, 响应码是 404 无所谓, 暂时当它不存在即可, 后续会解释
-
-
第一种 Idea部署JAVAWEB项目并运行的方式 (掌握)
-
在
Idea中默认的并不会把web项目真正的部署到Tomcat的webapps目录中,而是通过为每个web项目创建一个独立的Tomcat副本并在Tomcat副本中通过的Tomcat的Context组件完成项目的目录指定,在Context组件的docBase属性中会指定Idea对web项目编译后的目录out/artifacts/…
-
默认部署方式
-
Idea会在C:\Users\Administrator\.IntelliJIdea2019.2\system\tomcat中为每个Web项目创建一个独立的Tomcat副本
-
C:\Users\Administrator\.IntelliJIdea2019.2\system\tomcat\Tomcat_9_0_34_demo_4\conf\Catalina\localhost目录中生成一个该项目的xml文件名称为:"项目名.xml"
-
Idea通过执行Tomcat的catalina.bat启动脚本启动Tomcat,通过启动参数来指定启动Tomcat副本运行指定目录中的web项目
-
Idea在启动Tomcat之前会先在操作系统中设置一些临时环境变量,这些变量会被Tomcat的启动脚本所读取
-
CATALINA_BASE
-
CATALINA_HOME
-
在
Catalina.bat启动脚本运行时,会先去判断脚本中的CATALINA_HOME以及CATALINA_BASE是否有默认值,如果没有则直接读取系统环境变量中的值作为他们的默认值 -
由于
Idea在启动Tomcat之前已经设置了临时环境变量,所以tomcat在启动后就会运行部署在Tomcat副本中的web项目
-
-
-
第二种部署方式(了解)
-
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



















所有评论(0)