[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O9fJsRA0-1590573958422)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526152345264.png)]
b/s服务,及浏览器(谷歌,http协议)请求服务器(tomcat)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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协议
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有着两个重要的身份
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zjhaU079-1590573958429)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526134138941.png)]
当用户请求某一个URL资源时
通过2.1 与2.2的讲解,我们知道tomcat有两个非常重要的组成成分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zs9pVnvx-1590573958430)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526134953850.png)]
Tomcat设计了两个核心组件**连接器组件(Connector)与容器组件(container)**来完成两大核心功能
Coyote 是Tomcat 中连接器的组件名称 , 是对外的接⼝。客户端通过Coyote与服务器建⽴连接、发送请 求并接受响应 。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Xcs6lQF-1590573958430)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526135507815.png)]
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 的影响性能。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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,再调⽤容器 |
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)]
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实例
Catalina
负责解析Tomcat的配置⽂件(server.xml) , 以此来创建服务器Server组件并进⾏管理
Server
服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动Servlaet引擎,Tomcat连接 器。Server通过实现Lifecycle接⼝,提供了⼀种优雅的启动和关闭整个系统的⽅式
Service
服务是Server内部的组件,⼀个Server包含多个Service。它将若⼲个Connector组件绑定到⼀个 Container
Container
容器,负责处理⽤户的servlet请求,并返回对象给web⽤户的模块
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⽬录下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>
Https是⽤来加强数据传输安全的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-voJLAisI-1590573958433)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526155412188.png)]
Http超⽂本传输协议,明⽂传输 ,传输不安全,https在传输数据的时候会对数据进⾏加密
ssl协议
TLS(transport layer security)协议
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KSeGDd7F-1590573958434)( https://typora-hb.oss-cn-shanghai.aliyuncs.com/typera/image-20200526155636076.png)]
使⽤ 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)]
配置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>
使⽤https协议访问8443端⼝(https://localhost:8443)。
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"
垃圾回收性能指标
垃圾收集器
串⾏收集器(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"
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不擅⻓处理静态资源)。