一、浏览器访问服务器的流程
b/s (浏览器/服务器模式) 浏览器是客户端(发送http请求)-——> 服务器端
http请求的处理过程
注意:浏览器访问服务器使用的是Http
协议,Http
是应用层协议,用于定义数据通信的格式,具体的数据传输使用的是TCP/IP
协议。
二、Tomcat 系统总体架构
1、Tomcat 请求处理大致过程
Tomcat是一个Http服务器(能够接收并且处理http请求,所以tomcat是一个Http服务器)
我们使用浏览器向某一个网站发起请求,发出的是Http
请求,那么在远程,Http
服务器接收到这个请求 之后,会调用具体的程序(Java
类)进行处理,往往不同的请求由不同的Java
类完成处理。
如果Http服务器(Tomcat)直接调用业务处理类完成业务处理的话存在一定的问题:Tomcat与业务类耦合在一起了。
架构进行优化后:
HTTP
服务器接收到请求之后把请求交给Servlet
容器来处理,Servlet
容器通过Servlet接口调用业务 类。Servlet接口
和Servlet容器
这一整套内容叫作Servlet规范
。
注意:Tomcat
既按照Servlet规范
的要求去实现了Servlet容器
,同时它也具有HTTP服务器
的功能。
Tomcat
的两个重要身份:
Http
服务器Tomcat
是一个Servlet
容器
2、Tomcat Servlet容器处理流程
当用户请求某个URL
资源时:
HTTP
服务器会把请求信息使用ServletRequest
对象封装起来;- 进一步去调用
Servlet
容器中某个具体的Servlet
; - 在2中,
Servlet
容器拿到请求后,根据URL
和Servlet
的映射关系,找到相应的Servlet
; - 如果
Servlet
还没有被加载,就用反射机制创建这个Servlet
,并调用Servlet
的init
方法来完成初始化; - 接着调用这个具体
Servlet
的service
方法来处理请求,请求处理结果使用ServletResponse
对象封装; - 把
ServletResponse
对象返回给HTTP
服务器,HTTP
服务器会把响应发送给客户端。
3、Tomcat 系统总架构
通过上面的讲解,我们发现tomcat
有两个非常重要的功能需要完成
- 和客户端浏览器进行交互,进行
socket
通信,将字节流和Request/Response
等对象进行转换; Servlet
容器处理业务逻辑。
Tomcat
设计了两个核心组件连接器(Connector
)和容器(Container
)来完成 Tomcat
的两大核心功能。
连接器
,负责对外交流: 处理Socket
连接,负责网络字节流与Request
和Response
对象的转化;
容器
,负责内部处理:加载和管理Servlet
,以及具体处理Request
请求;
三、Tomcat 连接器组件 Coyote
1、Coyote 简介
Coyote
是Tomcat
中连接器的组件名称 , 是对外的接口。客户端通过Coyote
与服务器建立连接、发送请 求并接受响应 。
Coyote
封装了底层的网络通信(Socket
请求及响应处理);Coyote
使Catalina
容器(容器组件)与具体的请求协议及IO
操作方式完全解耦;Coyote
将Socket
输入转换封装为Request
对象,进一步封装后交由Catalina
容器进行处理,处理请求完成后,Catalina
通过Coyote
提供的Response
对象将结果写入输出流;Coyote
负责的是具体协议(应用层)和IO
(传输层)相关内容。
Tomcat
Coyote
支持的 IO
模型与协议
Tomcat
支持多种应用层协议和I/O
模型,如下:
’ fill=’%23FFFFFF’%3E%3Crect x=’249’ y=’126’ width=’1’ height=’1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)在 8.0
之前 ,Tomcat
默认采用的I/O
方式为 BIO
,之后改为 NIO
。 无论 NIO
、NIO2
还是 APR
, 在性能方面均优于以往的BIO
。 如果采用APR
, 甚至可以达到 Apache HTTP Server
的影响性能。
2、Coyote 的内部组件及流程
Coyote
组件及作用:
组件 | 作用描述 |
---|---|
EndPoint | EndPoint 是 Coyote 通信端点,即通信监听的接口,是具体Socket接收和发 送处理器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议的。 |
Processor | Processor 是Coyote 协议处理接口 ,如果说EndPoint是用来实现TCP/IP协 议的,那么Processor用来实现HTTP协议,Processor接收来自EndPoint的 Socket,读取字节流解析成Tomcat Request和Response对象,并通过 Adapter将其提交到容器处理,Processor是对应用层协议的抽象。 |
ProtocolHandler | Coyote 协议接口, 通过Endpoint 和 Processor , 实现针对具体协议的处 理能力。Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol , AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol , Http11Nio2Protocol ,Http11AprProtocol。 |
Adapter | 由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的 Request类来封装这些请求信息。ProtocolHandler接口负责解析请求并生成 Tomcat Request类。但是这个Request对象不是标准的ServletRequest,不 能用Tomcat Request作为参数来调用容器。Tomcat设计者的解决方案是引 入CoyoteAdapter,这是适配器模式的经典运用,连接器调用 CoyoteAdapter的Sevice方法,传入的是Tomcat Request对象, CoyoteAdapter负责将Tomcat Request转成ServletRequest,再调用容器。 |
四、Tomcat Servlet 容器 Catalina
1、 Tomcat 模块分层结构图及Catalina位置
Tomcat
是一个由一系列可配置(conf/server.xml
)的组件构成的Web
容器,而Catalina
是Tomcat
的 servlet
容器。
从另一个⻆度来说,Tomcat
本质上就是一款 Servlet
容器, 因为 Catalina
才是 Tomcat
的核心 , 其他模块都是为Catalina
提供支撑的。 比如 : 通过 Coyote
模块提供链接通信,Jasper
模块提供 JSP
引擎,Naming
提供JNDI
服务,Juli
提供日志服务。
2、Servlet 容器 Catalina 的结构
Tomcat
(我们往往有一个认识,Tomcat
就是一个Catalina
的实例,因为Catalina
是Tomcat
的核心)
Tomcat/Catalina
实例
其实,可以认为整个Tomcat
就是一个Catalina
实例,Tomcat
启动的时候会初始化这个实例,Catalina
实例通过加载server.xml
完成其他实例的创建,创建并管理一个Server
,Server
创建并管理多个服务, 每个服务又可以有多个Connector
和一个Container
。
一个Catalina
实例(容器) 一个 Server
实例(容器) 多个Service
实例(容器)
每一个Service
实例下可以有多个Connector
实例和一个Container
实例
Catalina
负责解析Tomcat
的配置文件(server.xml
) , 以此来创建服务器Server组件并进行管理。Server
服务器表示整个Catalina Servlet
容器以及其它组件,负责组装并启动Servlaet
引擎,Tomcat
连接器。Server
通过实现Lifecycle
接口,提供了一种优雅的启动和关闭整个系统的方式。Service
服务是Server
内部的组件,一个Server
包含多个Service
。它将若干个Connector
组件绑定到一个Container
。Container
容器,负责处理用户的servlet
请求,并返回对象给web
用户的模块。
3、Container 组件的具体结构
Container
组件下有几种具体的组件,分别是Engine
、Host
、Context
和Wrapper
。这4种组件(容器) 是父子关系。Tomcat
通过一种分层的架构,使得Servlet
容器具有很好的灵活性。
Engine
表示整个Catalina
的Servlet
引擎,用来管理多个虚拟站点
,一个Service
最多只能有一个Engine
, 但是一个引擎可包含多个Host
。Host``代表一个虚拟主机
,或者说一个站点,可以给Tomcat
配置多个虚拟主机地址,而一个虚拟主机下 可包含多个Context
。Context
表示一个Web
应用程序, 一个Web
应用可包含多个Wrapper
。Wrapper
表示一个Servlet
,Wrapper
作为容器中的最底层,不能包含子容器。
上述组件的配置其实就体现在conf/server.xml
中。
好了,Tomcat 系统架构与原理剖析我们就讲到这里,下一讲我们来讲一下Tomcat 服务器核心配置详解。