本章节为介绍如何安装Tomcat工具以及其主要架构知识概念,深入浅出让新人玩家理解为什么选择该容器以及该容器的优点
web服务器
概念
服务器:安装了服务器软件的计算机
服务器软件:接收用户的请求,处理请求,做出响应
web服务器软件:接收用户的请求,处理请求,做出响应。
在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目
常见web服务器软件
1、webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费。
2、websphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费。
3、JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费。
4、Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源、免费。
Tomcat
一、Tomcat 安装
下载
https://tomcat.apache.org/download-80.cgi
apache-tomcat-8.5.42-windows-x64.zip
安装
将下载的.zip 压缩包解压到系统的目录(建议是没有中文不带空格的目录)下即可。
目录结构如图:
二、Tomcat源码
下载
地址:https://tomcat.apache.org/download-80.cgi
apache-tomcat-8.5.42-src.zip
运行
1)解压zip压缩包
2)进入解压目录,并创建一个目录,命名为home ,并将conf、webapps日录移入home目录中
3)在当前目录下创建一个pom.xml文件,引入tomcat的依赖包
HTTP服务器的请求处理原理
servlet容器的工作流程
HTTP服务器不直接调用servlet,而是把请求交给servlet容器来处理
问:那servlet容器是怎么工作的?
当客户请求某个资源时,HTTP服务器会用一个servletRequest对象把客户的请求信息封装起来,然后调用servlet容器的service方法,
servlet容器金到请求后,根据请求的URI和servlet的映射关系,找到相应的servlet,如果servlet还没有被加载,就用反射机制创建这个servlet,
并调用servlet的init方法来完成初始化,接着调用servlet的service方法来处理请求,把servletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端。
三、Tomcat整体架构
我们知道如果要设计一个系统,首先是要了解需求,而我们已经了解了Tomcat要实现两个核心功能:
1)处理socket连接,负责网络字节流与Request和Response对象的转化。
2)加载和管理servlet,以及具体处理Reguest请求。
因此romcat设计了两个核心组件连接器(connector)和容器(container)来分别做这两件事情,连接器负责对外交流,容器负责内部处理。
连接器coyote
Coyote 是Tomcat的连接器框架的名称,是Tomcat服务器提供的供客户端访问的外部接口。
客户端通过coyote与服务器建立连接、发送请求并接受响应。
Covote 封装了底层的网络通信(socket 请求及响应处理),为catalina 容器提供了统一的接口,使catalina容器与具体的请求协议及I0操作方式完全解耦。
coyote 将socket 输入转换封装为 Request 对象,交由catalina 容器进行处理,处理请求完成后,Catalina 通过coyote 提供的Response 对象将结果写入输出流
Coyote 作为独立的模块,只负责具体协议和I0 的相关操作,与servlet 规范实现没有直接关系,因此即便是 Request 和Response 对象也并未实现servlet规范对应的接口,
而是在catalina 中将他们进一步封装为servletRequest 和ServletResponse。
Io模型与协议
在coyote中
Tomcat支持的多种I/o模型和应用层协议,具体包含的IO模型和应用层协议,看下表
Tomcat 支持的Io模型(自8.5/9.0 版本起,Tomcat 移除了 对 BI0 的支持):
IO模型 | 描述 |
---|---|
NIO | 非阻塞I/0,采用Java NIo类库实现。 |
NIO2 | 异步I/0,采用JDK 7最新的NIO2类库实现。 |
APR | 采用apache可移植运行库实现,是c/c++编写的本地库。如果选择该方案,需要单独安装APR库 |
Tomcat 支持的应用层协议:
应用层协议 | 描述 |
---|---|
HTTP/1.1 | 这是大部分web应用采用的访问协议。 |
AJP | 用于和web服务器集成(如apache),以实现对静态资源的优化以及集群部署,当前支持AJP/1.3。 |
HTTP/2 | HTTP 2.0大幅度的提升了web性能。下一代HTTP协议,自8.5以及9.0版本之后支持。 |
连接器组件
连接器的组件对数据处理的流程简介
客户端发起的socket请求会被EndPoint接收并且会把请求发送给处理器processor,processor在接受到请求之后将该请求转换成http协议的请求,
并将http的请求进行解析封装成request对象,但是容器需要的是servletRequest对象,所以Tomcat用到了设计模式-适配器设计模式,先调用adapter(适配器)的转换方法将Request对象转换成servletRequest对象再传输给容器。
连接器中的各个组件的作用
EndPoint
1、EndPoint:coyote 通信端点,即通信监听的接口,是具体socket接收和发送处理器,是对传输层的抽象,因此Endpoint用来实现TCP/P协议的。
2、Tomcat 并没有Endpoint接口,而是提供了一个抽象类abstractEndpoint,里面定义了两个内部类:acceptor和Socketprocessor。
Acceptor用于监听socket连接请求。socketprocessor用于处理接收到的socket请求,它实现Runnable接口,在Run方法里调用协议处理组件processor进行处理,为了提高处理能力,
socketprocessor被提交到线程池来执行。而这个线程池叫作执行器(Executor),(后面再详细介绍Tomcat如何扩展原生的Java线程池)
Processor
Processor:Coyote协议处理接口如果说Endpoint是用来实现TCP/IP协议的,那么Processor用来实现HTTP协议,Processor接收来自Endpoint的socket,
读取字节流解析成Tomcat Recuest和Response对象,并通过Adapter将其提交到容器处理,processor是对应用层协议的抽象。
ProtocolHandler
ProtocolHandler:Coyote协议接口,通过Endpoint和Processor ,实现针对具体协议的处理能力。Tomcat按照协议和I/O 提供了6个实现类:
AjpNio2Protocol、AjpAprProtocol、Http11Nio2Protocol、AjpNio2Protoco1,Http11NioProtoco1、Http11Aprprotocol,在配置tomcat/conf/server.xml 时,至少要指定具体的ProtocolHandler,当然也可以指定协议名称,如:HTTP/1.1,如果安装了APR,那么将使用nttp11Aprprotocol ,否则使用 Http11Nioprotocol
Adapter
由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的Request类来”存放”这些请求信息。Protoco1Hand1er接口负责解析请求并生成Tomcat Reguest类。但是这个Reguest对象不是标准的servletReguest,也就意味着,不能用omcat Request作为参数来调用容器。Tomcat设计者的解决方案是引入coyoteAdapter,这是适配器模式的经典运用,连接器调用covoteAdapter的Sevice方法,传入的是Tomcat Request对象,CoyoteAdapter负责将Tomcat Reguest转成servletRequest,再调用容器的service方法。