web应用服务器-tomcat笔记

Web应⽤服务器-Tomcat笔记

主要课程内容

  • 第一部分: Tomcat系统架构与原理分析
  • 第二部分: Tomcat服务器核心配置详解
  • 第三部分: Tomcat对Https的支持与性能优化

第一部分: Tomcat系统架构与原理分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O9fJsRA0-1590573958422)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526152345264.png)]

b/s服务,及浏览器(谷歌,http协议)请求服务器(tomcat)

第1节 浏览器访问服务器的流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nZYTzfNx-1590573958424)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526113805229.png)]

1.用户点击页面发起请求到浏览器中

2.浏览器给服务器发送TCP连接请求

3.服务器接收到请求并与浏览器建立连接

4.浏览器生成HTTP格式的数据包

5.浏览器发送请求数据包给服务器

6.服务器解析HTTP请求数据包

7.服务器通过解析的数据,执行请求

8.服务器生成HTTP格式的响应数据包

9.服务器发送响应数据包给浏览器

10.浏览器解析HTTP格式数据包

11.浏览器把解析的数据包呈现出静态数据给用户

注意:浏览器与服务器直接的协议是http协议,是应用层协议,用于定义通讯格式的,具体底层的传输协议是TCP/IP协议

第2节 Tomcat系统总体架构

2.1 tomcat请求的大致流程

tomcat是一个http服务器(能够接受与处理http请求)

浏览器想某一个网站发送请求,是发送http请求到服务器tomcat,在远端tomcat,是不同的请求交个不同的java程序去执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tFwXy0u8-1590573958427)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526114927091.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qSUYdQmH-1590573958428)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526115015647.png)]

所以最终HTTP服务器接受到请求后,把请求交给servlet容器去处理,servlet容器通过servlet接口调用业务类,这样就解决HTTP服务器与业务解耦问题

而servlet容器与servlet接口这一套内容我们叫做servlet规范

tomcat有着两个重要的身份

  1. http服务器
  2. servlet容器

2.2 tomcat servlet容器处理流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zjhaU079-1590573958429)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526134138941.png)]

当用户请求某一个URL资源时

  1. http服务器会把请求信息使用servletRequest对象封装起来
  2. 进一步去调用servlet容器中的某一个具体的Servlet
  3. Servlet容器拿到请求后,根据URL和Servlet映射关系,找到对应的Servlet
  4. 如果Servlet没有被加载,就通过反射机制去创建这个Servlet,并且调用它的init方法来完成初始化
  5. 接着调用具体的service()方法来处理请求,请求处理结果通过ServletResponse对象封装
  6. 把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端

2.3 Tomcat系统总体架构

通过2.1 与2.2的讲解,我们知道tomcat有两个非常重要的组成成分

  1. 和客户端浏览器进行交互,进行socket通信.将字节流和Request/Response等对象进行转换
  2. servlet容器处理业务流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zs9pVnvx-1590573958430)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526134953850.png)]

Tomcat设计了两个核心组件**连接器组件(Connector)容器组件(container)**来完成两大核心功能

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

第 3 节 Tomcat 连接器组件-Coyote

3.1 Coyote 简介

Coyote 是Tomcat 中连接器的组件名称 , 是对外的接⼝。客户端通过Coyote与服务器建⽴连接、发送请 求并接受响应 。

  1. Coyote 封装了底层的⽹络通信(Socket 请求及响应处理)
  2. Coyote 使Catalina 容器(容器组件)与具体的请求协议及IO操作⽅式完全解耦
  3. Coyote 将Socket 输⼊转换封装为 Request 对象,进⼀步封装后交由Catalina 容器进⾏处理,处 理请求完成后, Catalina 通过Coyote 提供的Response 对象将结果写⼊输出流
  4. Coyote 负责的是具体协议(应⽤层)和IO(传输层)相关内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Xcs6lQF-1590573958430)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526135507815.png)]

3.2 Tomcat Coyote ⽀持的 IO模型与协议

Tomcat⽀持多种应⽤层协议和I/O模型,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pw09onJB-1590573958431)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526135606518.png)]

在 8.0 之前 ,Tomcat 默认采⽤的I/O⽅式为 BIO,之后改为 NIO。 ⽆论 NIO、NIO2 还是 APR, 在性 能⽅⾯均优于以往的BIO。 如果采⽤APR, 甚⾄可以达到 Apache HTTP Server 的影响性能。

3.3 Coyote 的内部组件及流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7mf7A6N-1590573958432)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526135721372.png)]

组件 描述这样
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,再调⽤容器

第4节 Tomcat Servlet容器-Catalina

4.1 Tomcat 模块分层结构图及Catalina位置

Tomcat是⼀个由⼀系列可配置(conf/server.xml)的组件构成的Web容器,⽽Catalina是Tomcat的 servlet容器。

从另⼀个⻆度来说,Tomcat 本质上就是⼀款 Servlet 容器, 因为 Catalina 才是 Tomcat 的核⼼ , 其 他模块都是为Catalina 提供⽀撑的。 ⽐如 : 通过 Coyote 模块提供链接通信,Jasper 模块提供 JSP 引 擎,Naming 提供JNDI 服务,Juli 提供⽇志服务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3KsMYqej-1590573958432)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526144232410.png)]

4.2 Servlet 容器 Catalina 的结构

Tomcat(我们往往有⼀个认识,Tomcat就是⼀个Catalina的实例,因为Catalina是Tomcat的核⼼)

Catalina结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qS6fbFYK-1590573958433)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526144346903.png)]

其实,可以认为整个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⽤户的模块

4.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服务器核心配置文件详解

配置文件server.xml

核⼼配置在tomcat⽬录下conf/server.xml⽂件




<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">

    
    
    
    <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 port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    
    
    
    
    
    

    
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


    

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

      
      

      
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      Realm>
			
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        
				<Context docBase="/Users/yingdian/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>
    Engine>
  Service>
Server>

第三部分 Tomcat对Https的支持与性能优化

第1节 Tomcat对https的支持

Https是⽤来加强数据传输安全的

1.1 HTTPS 简介

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-voJLAisI-1590573958433)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526155412188.png)]

Http超⽂本传输协议,明⽂传输 ,传输不安全,https在传输数据的时候会对数据进⾏加密

ssl协议

TLS(transport layer security)协议

1.2HTTPS和HTTP的主要区别

  • HTTPS协议使⽤时需要到电⼦商务认证授权机构(CA)申请SSL证书
  • HTTP默认使⽤8080端⼝,HTTPS默认使⽤8443端⼝
  • HTTPS则是具有SSL加密的安全性传输协议,对数据的传输进⾏加密,效果上相当于HTTP的升级版
  • HTTP的连接是⽆状态的,不安全的;HTTPS协议是由SSL+HTTP协议构建的可进⾏加密传输、身份认证的⽹络协议,⽐HTTP协议安全

1.3 HTTPS⼯作原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KSeGDd7F-1590573958434)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526155636076.png)]

1.4 Tomcat 对 HTTPS 的配置

  1. 使⽤ JDK 中的 keytool ⼯具⽣成免费的秘钥库⽂件(证书)。

    keytool -genkey -alias lagou -keyalg RSA -keystore lagou.keystore
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvUUOwKV-1590573958435)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526155846461.png)]

  2. 配置conf/server.xml

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="150" schema="https" secure="true" SSLEnabled="true">
    	<SSLHostConfig> 
        
      	<Certificate certificateKeystoreFile="/Users/yingdian/workspace/servers/apache-tomcat-8.5.50/conf/lagou.keystore" certificateKeystorePassword="lagou123" type="RSA"/>
    	SSLHostConfig> 
    Connector>
    
  3. 使⽤https协议访问8443端⼝(https://localhost:8443)。

第2节 Tomcat 性能优化策略

2.1 系统性能的衡量指标,主要是响应时间和吞吐量。

  • 响应时间:执⾏某个操作的耗时;
  • 吞吐量:系统在给定时间内能够⽀持的事务数量,单位为TPS(Transactions PerSecond的缩写,也 就是事务数/秒,⼀个事务是指⼀个客户机向服务器发送请求然后服务器做出反应的过程。

2.2 Tomcat优化从两个⽅⾯进⾏

  • JVM虚拟机优化(优化内存模型)
  • Tomcat⾃身配置的优化(⽐如是否使⽤了共享线程池?IO模型?)

2.3 虚拟机运⾏优化(参数调整)

Java 虚拟机的运⾏优化主要是内存分配和垃圾回收策略的优化:

  • 内存直接影响服务的运⾏效率和吞吐量
  • 垃圾回收机制会不同程度地导致程序运⾏中断(垃圾回收策略不同,垃圾回收次数和回收效率都是 不同的)

Java 虚拟机内存相关参数

参数 参数作用 优化建议
-server 启动Server,以服务端模式运⾏ 服务端模式建议开启
-Xms 最⼩堆内存 建议与-Xmx设置相同
-Xmx 最⼤堆内存 建议设置为可⽤内存的80%
-XX:MetaspaceSize 元空间初始值
-XX:MaxMetaspaceSize 元空间最⼤内存 默认⽆限
-XX:NewRatio 年轻代和⽼年代⼤⼩⽐值,取值为整数,默认为2 不需要修改
-XX:SurvivorRatio Eden区与Survivor区⼤⼩的⽐值,取值为整 数,默认为8 不需要修改

JVM内存模型回顾

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IJuevmNo-1590573958436)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526161103214.png)]

参数调整示例

JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m XX:MaxMetaspaceSize=512m"

2.4 垃圾回收(GC)策略

垃圾回收性能指标

  • 吞吐量:⼯作时间(排除GC时间)占总时间的百分⽐, ⼯作时间并不仅是程序运⾏的时间,还包 含内存分配时间。
  • 暂停时间:由垃圾回收导致的应⽤程序停⽌响应次数/时间。

垃圾收集器

  • 串⾏收集器(Serial Collector)

    单线程执⾏所有的垃圾回收⼯作, 适⽤于单核CPU服务器

    ⼯作进程-----|(单线程)垃圾回收线程进⾏垃圾收集|—⼯作进程继续

  • 并⾏收集器(Parallel Collector)

    ⼜称为吞吐量收集器(关注吞吐量), 以并⾏的⽅式执⾏年轻代的垃圾回收, 该⽅式可以显著降 低垃圾回收的开销(指多条垃圾收集线程并⾏⼯作,但此时⽤户线程仍然处于等待状态)。适⽤于多 处理器或多线程硬件上运⾏的数据量较⼤的应⽤

    ⼯作进程-----|(多线程)垃圾回收线程进⾏垃圾收集|—⼯作进程继续

  • 并发收集器(Concurrent Collector)

    以并发的⽅式执⾏⼤部分垃圾回收⼯作,以缩短垃圾回收的暂停时间。适⽤于那些响应时间优先于 吞吐量的应⽤, 因为该收集器虽然最⼩化了暂停时间(指⽤户线程与垃圾收集线程同时执⾏,但不⼀ 定是并⾏的,可能会交替进⾏), 但是会降低应⽤程序的性能

  • CMS收集器(Concurrent Mark Sweep Collector)

    并发标记清除收集器, 适⽤于那些更愿意缩短垃圾回收暂停时间并且负担的起与垃圾回收共享处 理器资源的应⽤

  • G1收集器(Garbage-First Garbage Collector)

    适⽤于⼤容量内存的多核服务器, 可以在满⾜垃圾回收暂停时间⽬标的同时, 以最⼤可能性实现 ⾼吞吐量(JDK1.7之后)

垃圾回收器参数

参数 描述
-XX:+UseSerialGC 启⽤串⾏收集器
-XX:+UseParallelGC 启⽤并⾏垃圾收集器,配置了该选项,那么 -XX:+UseParallelOldGC默认 启⽤
-XX:+UseParNewGC 年轻代采⽤并⾏收集器,如果设置了 -XX:+UseConcMarkSweepGC选 项,⾃动启⽤
-XX:ParallelGCThreads 年轻代及⽼年代垃圾回收使⽤的线程数。默认值依赖于JVM使⽤的CPU个 数
-XX:+UseConcMarkSweepGC(CMS) 对于⽼年代,启⽤CMS垃圾收集器。 当并⾏收集器⽆法满⾜应⽤的延迟需 求是,推荐使⽤CMS或G1收集器。启⽤该选项后, -XX:+UseParNewGC ⾃动启⽤。
-XX:+UseG1GC 启⽤G1收集器。 G1是服务器类型的收集器, ⽤于多核、⼤内存的机器。 它在保持⾼吞吐量的情况下,⾼概率满⾜GC暂停时间的⽬标。

在bin/catalina.sh的脚本中 , 追加如下配置

JAVA_OPTS="-XX:+UseConcMarkSweepGC"

2.4 Tomcat 配置调优

Tomcat⾃身相关的调优

  • 调整tomcat线程池

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uxwGMohu-1590573958436)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526161936184.png)]

  • 调整tomcat的连接器

    调整tomcat/conf/server.xml 中关于链接器的配置可以提升应⽤服务器的性能。

    参数 说明
    maxConnections 最⼤连接数,当到达该值后,服务器接收但不会处理更多的请求, 额外的请求将会阻塞直到连接数低于maxConnections 。可通过ulimit -a 查看服务器 限制。对于CPU要求更⾼(计算密集型)时,建议不要配置过⼤ ; 对于CPU要求 不是特别⾼时,建议配置在2000左右(受服务器性能影响)。 当然这个需要服 务器硬件的⽀持
    maxThreads 最⼤线程数,需要根据服务器的硬件情况,进⾏⼀个合理的设置
    acceptCount 最⼤排队等待数,当服务器接收的请求数量到达maxConnections ,此时 Tomcat会将后⾯的请求,存放在任务队列中进⾏排序, acceptCount指的 就是任务队列中排队等待的请求数 。 ⼀台Tomcat的最⼤的请求处理数量, 是maxConnections+acceptCount
  • 禁⽤ AJP 连接器

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mcisljw6-1590573958437)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526162258886.png)]

  • 调整 IO 模式

    Tomcat8之前的版本默认使⽤BIO(阻塞式IO),对于每⼀个请求都要创建⼀个线程来处理,不适合⾼并发;Tomcat8以后的版本默认使⽤NIO模式(⾮阻塞式IO)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cMFsZGna-1590573958437)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526162327723.png)]

    当Tomcat并发性能有较⾼要求或者出现瓶颈时,我们可以尝试使⽤APR模式,APR(Apache Portable Runtime)是从操作系统级别解决异步IO问题,使⽤时需要在操作系统上安装APR和Native(因为APR 原理是使⽤使⽤JNI技术调⽤操作系统底层的IO接⼝)

  • 动静分离

    可以使⽤Nginx+Tomcat相结合的部署⽅案,Nginx负责静态资源访问,Tomcat负责Jsp等动态资 源访问处理(因为Tomcat不擅⻓处理静态资源)。

你可能感兴趣的:(tomcat)