1 服务器分类

1.1JavaEE 更名

JavaEE,很多人都知道它是社区驱动的企业软件标准。JavaEE 是利用 Java Community

Process 开发的,每个版本都集成了符合业界需求的新特性,提供了一个丰富的企业软件平

台,提高了应用可移植性,提高了开发人员的工作效率。

2018-03-05 日,据国外媒体报道,开源组织 Eclipse 基金会宣布将 JavaEE(Enterprise

Edition)被更名为 JakartaEE(雅加达)。这是 Oracle 将 Java 移交给开源组织 Eclipse 后实现对 Java

品牌控制的最新举措。

1.2应用服务器( JavaEE Application Server )

应用服务器是 Java EE 规范的具体实现, 可以执行/驱动基于 JavaEE 平台开发的 web 项

目。绝大部分的应用服务器都是付费产品。

常见的应用服务:

Weblogic(BEA)

WebLogic 是 BEA 公司的产品。WebLogic 支持企业级的、多层次的和完全分布式的 Web

应用,并且服务器的配置简单、界面友好。对于那些正在寻求能够提供 JavaEE 平台所拥有

的一切应用服务器的用户来说,WebLogic 是一个十分理想的选择。

Webshpere(IBM)

WebSphere 是 IBM 公司的产品,WebSphere Application Server 是基于 JavaEE 的应用环

境,可以运行多种操作系统平台,用于建立、部署和管理 JavaEE 应用程序。

JBoss(RedHad)

JBoss 是一个种遵从 JavaEE 规范的、开放源代码的、纯 Java 的 EJB 服务器,对于 JavaEE

有很好的支持。

Geronimo(Apache)

Geronimo 是 Apache 软件基金会的开放源码 J2EE 服务器,是一个符合 J2EE 标准的应

用服务器。

1.3Web 容器( Web Server )

只实现了 JavaEE 平台下部分技术标准,如 Servlet,Jsp,JNDI,JavaMail。Web 容器是开

源免费的。

Tomcat(Apache 开源免费)

Tomcat 是 Apache 软件基金会的一款完全开源免费的 Servlet 容器,它是全世界最著名

的基于 Java 语言的轻量级应用服务器,它支持 HTML、JS 等静态资源的处理,因此又可以作

为轻量级 Web 容器使用

Jetty(Jetty 开源免费)

Jetty 是挂在 eclipse 基金会下,基于 Java 语言编写的实现 Servlet 规范的 Web 容器。

2 TCP 协议

TCP 是一个可靠的传输协议,在创建连接时会经历三次握手,在断开连接时会经历四次

挥手。

2.1建立连接的三次握手

所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认

连接的建立。

Tomcat 工作原理_java

A 和 B 打电话:

A 对 B 说:你好,我是 A,你能听到我说话吗?

B 对 A 说:嗯,我能听到你说话。

A 对 B 说:好,那我们开始聊天吧

2.2断开连接的四次挥手

四次挥手即终止 TCP 连接,就是指断开一个 TCP 连接时,需要客户端和服务端总共发送

4 个包以确认连接的断开。

Tomcat 工作原理_客户端_02

A 和 B 打电话:

A 对 B 说:我说完了,我要挂电话了

B 对 A 说:等一下,我还没说完

B 继续对 A 说:我说完了,你可以挂电话了

A 对 B 说:好,我挂电话了

3 Http 协议

3.1Http 协议简介

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、

协作式和超媒体信息系统的应用层协议。HTTP 是万维网的数据通信的基础。

HTTP 是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个 HTTP 请求到服务器上指定端

口(默认端口为 80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上

存储着一些资源,比如 HTML 文件和图像。我们称这个应答服务器为源服务器(origin server)。

通常,由 HTTP 客户端发起一个请求,创建一个到服务器指定端口(默认是 80 端口)

的 TCP 连接。HTTP 服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客

户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、

或者其它信息。

3.2Http 协议特点

单向性

无状态

3.3Http 工作原理

HTTP 请求/响应的步骤:

  1. 客户端连接到 Web 服务器

一个 HTTP 客户端,通常是浏览器,与 Web 服务器的 HTTP 端口(默认为 80)建立一个

TCP 套接字连接。例如,http://www.baidu.com。

  1. 发送 HTTP 请求

通过 TCP 套接字,客户端向 Web 服务器发送一个文本的请求报文,一个请求报文由请

求行、请求头部、空行和请求数据 4 部分组成。

  1. 服务器接受请求并返回 HTTP 响应

Web 服务器解析请求,定位请求资源。服务器将资源复本写到 TCP 套接字,由客户端

读取。一个响应由状态行、响应头部、空行和响应数据 4 部分组成。

  1. 释放连接 TCP 连接

若 connection 模式为 close,则服务器主动关闭 TCP 连接,客户端被动关闭连接,释放

TCP 连接;若 connection 模式为 keepalive,则该连接会保持一段时间,在该时间内可以继续

接收请求

  1. 客户端浏览器解析 HTML 内容

客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响

应头,响应头告知以下为若干字节的 HTML 文档和文档的字符集。客户端浏览器读取响应数

据 HTML,根据 HTML 的语法对其进行格式化,并在浏览器窗口中显示

例如:在浏览器地址栏键入 URL,按下回车之后会经历以下流程:

浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;

浏览器发出读取文件(URL 中域名后面部分对应的文件)的 HTTP 请求,该请求报文作为

TCP 三次握手的第三个报文的数据发送给服务器;

服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

释放 TCP 连接;

浏览器将该 html 文本并显示内容;

4 Tomcat 架构介绍

Tomcat 工作原理_服务器_03

在架构图中包含了 Tomcat 内部的主要组件,每个组件之间的层次包含关系很清楚。

Tomcat 大体上可以看成由 Connector 和 Container 组件组成。Connector 组件负责在服务器

端处理客户端连接(客户端连接、接收客户端消息报文、消息报文的解析等),Container

负责对客户端的请求进行逻辑处理,并把结果返回给客户端。

对应 server.xml

<Server>
<Listener/>
<GlobalNamingResources>
<Resource/>
</GlobalNamingResources>
<Service>
<Executor/>
<Connector/>
<Engine>
<Cluster/>
<Realm/>
<Host>
<Context/>
</Host>
</Engine>
</Service>
</Server>


5 Tomcat 组件介绍

5.1Server 组件

Server 是最顶级的组件,代表 Tomcat 的运行实例,一个 JVM 中只会有一个 Server。

5.2Listener 组件

在 Tomcat 生命周期中完成不同的工作。

5.3GlobalNamingResources 组件

集成 JNDI。

5.4Service 组件

指的是一个服务,主要的功能是把 connector 组件和 engine 组织起来,使得通过

connector 组件与整个容器通讯的应用可以使用 engine 提供的服务。

5.5Connector 组件

连接器组件,可以配置多个连接器支持多种协议,如 http,APJ 等。

5.6Engine 组件

服务引擎,这个可以理解为一个真正的服务器,内部提供了多个虚拟主机对外服务。

5.7Host 组件

虚拟主机,每一个虚拟主机相当于一台服务器,并且内部可以部署多个应用,每个虚拟

主机可以绑定一个域名,并指定多个别名。

5.8Context 组件

应用上下文,每一个 webapp 都有一个单独的 context,也可以理解为每一个 context 代

表一个 webapp。

5.9Valva 组件

Access Log Valve 用来创建日志文件,格式与标准的 web server 日志文件相同。可以使用

用日志分析工具对日志进行分析,跟踪页面点击次数、用户会话的活动等。

6 Tomcat 处理请求过程

Tomcat 工作原理_服务器_04

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 将响应内容返回给 Engine。

9 Engine 将响应内容返回 Connector。
10 Connector 将响应内容返回给客户 Browser。