一起进阶学习JAVA:Tomcat

一起进阶学习JAVA:Tomcat

  • 什么是Tomcat
  • Tomcat系统架构
    • 浏览器访问服务器流程
    • Tomcat请求处理过程
    • Tomcat Servlet容器处理流程
    • Tomcat系统总体架构
    • Tomcat连接器组件Coyote
      • 什么是Coyote
      • Coyote的流程
      • Coyote 组件及作用
    • Tomcat Servlet容器Catalina
      • Servlet容器Catalina的结构
      • Container 组件的具体结构
  • Tomcat服务器核心配置
    • Server标签
    • Service标签
    • Executor标签
    • Connector标签
    • Engine标签
    • Host标签
    • Context标签

文章内容输出来源:拉勾教育Java高薪训练营

什么是Tomcat

Tomcat 是一个开源的轻量级Web应用服务器,可实现JavaWeb程序的装载,它也具有传统的Web服务器的功能,也可以说Tomcat是一个Servlet容器。

Tomcat系统架构

Tomcat主要服务区B/S架构:浏览器客户端与服务器端交互。

浏览器访问服务器流程

一起进阶学习JAVA:Tomcat_第1张图片
浏览器访问服务器使用的是Http协议,Http是应用层协议,用于定义数据通信格式。数据传输使用的是TCP/IP协议

Tomcat请求处理过程

  1. 用户通过浏览器向网站发送Http请求。
  2. Http服务器接收到用户请求。
  3. Http服务器将请求交予Servlet容器。
  4. Servlet容器通过Servlet接口调用业务类。
  5. 返回请求数据。

Tomcat Servlet容器处理流程

当用户请求某个URL资源时

  1. HTTP服务器会把请求信息使用ServletRequest对象封装
  2. Servlet容器根据URL喝Servlet的映射关系调用具体的Servlet
  3. 如果Servlet还没有被加载,就使用反射机制创建这个Servlet并且调用init方法来初始化
  4. 调用该Servlet中的service方法来处理请求
  5. 使用ServletResponse对象丰庄返回数据
  6. 把ServletResponse对象返回给HTTP服务器
  7. HTTP服务器将响应发送给客户端

Tomcat系统总体架构

Tomcat有两个非常重要的功能

  1. 和客户端浏览器进行交互,进行Socket通信,将字节流喝Request以及Response等对象进行转换
  2. Servlet容器处理业务逻辑

因此Tomcat设计了两个核心组件连接器(Connector)容器(Container)来完成Tomcat的两大核心功能

  • 连接器,负责对外交流,处理Socket连接,负责网络字节流与RequestResponse对象的转化;
  • 容器,负责内部处理,夹在和管理Servlet,以及具体的处理Request请求

Tomcat连接器组件Coyote

什么是Coyote

Coyote是Tomcat中连接器组件,是对外的接口。客户端通过Coyote与服务器建立连接、发送请求、接受请求。

  1. Coyote封装了底层的网络通信(Socket请求及响应处理);
  2. Coyote使Catalina容器(容器组件)与具体的请求协议以及IO操作方式完全解耦
  3. Coyote将Socket输入转换封装为Request对象,进一步封装后交由Catalina容器进行处理,处理请求完成后,Catalina通过Coyote提供的Response对象将结果写入输出流
  4. Coyote负责的是具体协议(应用层)和IO(传输层)相关内容
    一起进阶学习JAVA:Tomcat_第2张图片
    Tomcat Coyote支持多种应用层协议和I/O模型
应用层 应用层协议 描述
HTTP/1.1 这是大部分Web应用采用的访问协议
AJP 用于和WX集成(如Apache),以实现对静态资源的优化以及集群部署,当前支持AJP/1.3
HTTP/2 HTTP2.0大幅度的提升了Web性能。下一代HTTP协议,自8.5以及9.0版本之后开始支持
传输层 IO模型 描述
NIO 非阻塞I/O,采用Java NIO类库实现
NIO2 异步I/O,采用JDK7最新的NIO2类库实现
APR 采用Apache可移植运行库实现,是C/C++编写的本地库。如果选择该方案,需要单独安装APR库

在8.0之前,Tomcat默认采用的I/O的方式为BIO,之后改为NIO。无论NIO、NIO2还是APR,在性能方面均优于以往的BIO。如果采用APR,伸直可hi达到Apache HTTP Server的影响性能

Coyote的流程

一起进阶学习JAVA:Tomcat_第3张图片

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提供的实现类: AjpNioProtocol, AjpAprProtocol҅ ,AjpNio2Protocol ,Http11NioProtocol,Http11Nio2Protocol ,Http11AprProtocol
Adapter 由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的Request类来封装这些请求信息。ProtocolHandler接口负责解析请求并生成Tomcat Request类。但是这个Request对象不是标准的ServletRequest,不能用Tomcat Request作为参数来调用容器。Tomcat设计者的解决方案是引入CoyoteAdapter,这是适配器模式的经典运用,连接器调用CoyoteAdapter的Service方法,传入的是Tomcat Request对象,CoyoteAdapter负责将Tomcat Request转换成ServletRequest对象,然后再调用容器

Tomcat Servlet容器Catalina

Tomcat是一个由一系列可配置(conf/server.xml)的组件构成的Web容器,而Catalina是Tomcat的Servlet容器。
Catalina是Tomcat的核心,其他模块都是为Catalina提供支撑的
一起进阶学习JAVA:Tomcat_第4张图片

Servlet容器Catalina的结构

一起进阶学习JAVA:Tomcat_第5张图片
我们可以认为整个Tomcat就是一个Catalina实力,Tomcat启动的时候会初始化这个实力,Catalina实力通过加载server.xml来完成创建一个Server,Server创建并管理多个服务,每个服务又可以又多个Connector和一个Container

  • Catalina:负责解析Tomcat的配置文件(server.xml)用于创建服务器Server组件并进行管理
  • Server:服务器表示整个Catalina Servlet容器以及其他组件,负责组装并启动Servlet引擎,Tomcat连接器。Server通过实现Lifecycle接口,提供了一种优雅的启动和关闭整个系统的方式
  • Service:Service是Server的内部组件,一个Server包含多个Service。它将多个Connerctor组件绑定到一个Container
  • Container:Container容器负责处理用户Servlet请求,并返回对象给web用户的模块

Container 组件的具体结构

Cintainer组件下有集中具体的组件,分别是Engine、Host、Context和Wrapper。具体配置在conf/server.xml

  • Engine:表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最懂只能有一个Engine,但是一个Engine可以包含多个Host
  • Host:代表一个虚拟主机或者站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下可以包含多个Context
  • Context:表示一个Web应用成语,一个Web应用可以包含多个Wrapper
  • Wrapper:表示一个Servlet,Wrapper作为容器中的最底层,不能包含子容器

Tomcat服务器核心配置

Tomcat作为服务器的配置,主要是server.xml文件的配置,server.xml中包含了Servlet容器的相关配置,即Catalina的配置

主要标签如下


<Server>
	
	<Listener />
	
	<GlobalNamingResources />
	
	<Service />
Server>

Server标签

 
<Server port="8005" shutdown="SHUTDOWN">  
	
	<Listener className="org.apache.catalina.startup.VersionLoggerListener" />  
	  
	  
	 
	<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />  
	  
	  
	<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />  
	  
	<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />  
	
	<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />      
	  
	<GlobalNamingResources>    
		    
		<Resource name="UserDatabase" auth="Container"              
				  type="org.apache.catalina.UserDatabase"              
				  description="User database that can be updated and saved"              
				  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"              
				  pathname="conf/tomcat-users.xml" />  
				  
	GlobalNamingResources>
	  
	<Service name="Catalina">    
			...  
	Service> 
  Server>

Service标签

  
<Service name="Catalina">  
	... 
Service>

Executor标签


<Executor name="commonThreadPool"   
		  namePrefix="thread-exec-"    
		  maxThreads="200"    
		  minSpareThreads="100"    
		  maxIdleTime="60000"    
		  maxQueueSize="Integer.MAX_VALUE"    
		  prestartminSpareThreads="false"     
		  threadPriority="5"    
		  className="org.apache.catalina.core.StandardThreadExecutor"/>

Connector标签

Connector标签用于创建链接器实例,默认有2个,一个支持HTTP协议,一个支持AJP协议

一般情况下我们不需要新增,只需要对已有的进行优化


<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

还可以使用共享线程池

<Connector port="8080"             
		protocol="HTTP/1.1"          
		executor="commonThreadPool"          
		maxThreads="1000"             
		minSpareThreads="100"             
		acceptCount="1000"            
		maxConnections="1000"            
		connectionTimeout="20000"          
		compression="on"            
		compressionMinSize="2048"            
		disableUploadTimeout="true"            
		redirectPort="8443"            
		URIEncoding="UTF-8" /> 

Engine标签

Engine标签标识Servlet引擎


<Engine name="Catalina" defaultHost="localhost">
 ...
Engine>

Host标签

Host标签用于配置一个虚拟主机

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
 ...
Host> 

Context标签

Context用于配置一个Web应用

<Host name="www.xxx.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
	
 <Context docBase="/xxx/xxx/web_demo" path="/web3">Context>

 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
 prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
Host>

你可能感兴趣的:(Tomcat,tomcat,java,servlet,http)