tomcat详解

1 tomcat源码项目部署,编译,运行。
https://www.cnblogs.com/grasp/p/10061577.html

HTTP服务器直接调用具体业务类,它们是紧耦合的。

Tomcat请求流程
HTTP服务器不直接调用业务类,而是把请求交给容器来处理,容器通过Servlet接口调用业务类。因此Servlet接口和Servlet容器的出现,达到了HTTP服务器
与业务类解耦的目的。而Servlet接口和Servlet容器这一整套规范叫作Servlet规范。
Tomcat按照Servlet规范的要求实现了Servlet容器,同时它们也具有HTTP服务器的功能。作为Java程序员,如果我们要实现新的业务功能,只需要实现一个
Servlet(Spring MVC内部实现Servlet),并把它注册到Tomcat(Servlet容器)中,剩下事情就由Tomcat帮我们处理了。

Servlet容器工作流程
当客户请求某个资源时,HTTP服务器会用一个ServletRequest对象把客户的请求信息封装起来,然后调用Servlet容器的service方法,Servlet容器拿到请求后,
根据请求URL和Servlet的映射关系(定位),找到相应的Servlet,如果Servlet还没有被加载,就用反射机制创建这个Servlet,并调用Servlet的init方法来完成初始化(加载)。接
着调用Servlet的service方法来处理请求(调用),把ServletResponse对象返回给HTTP服务器,HTTP服务器把响应发送给客户端。
Servlet容器工作流程:定位->加载->调用

Tomcat整体流程:
1 处理Socket连接,负责网络字节流与Request和Response对象的转化。
2 加载和管理Servlet,以及具体处理Request请求。
因此Tomcat设计了两个核心组件:
连接器(Connector):负责对外交流。
容器(Container): 负责内部处理。

连接器: 使用的网络通信框架是:Coyote。

在Tomcat8.0之前,Tomcat默认采用I/O方式为BIO,之后改为NIO。

连接器(Connector)组件:
请求进来
EndPoint组件:监听Socket请求,处理TCP/IP协议
Processor组件:处理TCP/IP协议,转换为HTTP/AJP协议,封装为request请求对象
Adapter组件:将request请求对象,转换为servletRequest对象。(使用适配器模式实现)

ProtocolHandler: 协议处理器,为EndPoint组件与Processor组件的组合。

容器架构:Catalina,Tomcat是一个由一系列可配置的组件构成的Web容器,而Catalina是Tomcat的servlet容器。
Catalina是Servelet容器实现,通过松耦合方式集成Coyote,已完成按照请求协议进行数据读写。同时,它还包括我们的启动入口、Shell程序等。
Catalina是Tomcat核心,其他组件为Catalina提供支持。例如:Coyote为Catalina提供数据连接通信支持。

容器(Catalina)组件:
Catalina 负责解析Tomcat的配置文件,以此来创建服务器Server组件,并根据命令来对其进行管理。
Server 服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动Servlet引擎,Tomcat连接器。Server通过实现Lifecycle接口,提供了一种
优雅的启动和关闭整个系统的方式。
Service 服务是Server内部的组件,一个Server包含多个Service。它将若干个Connector组件绑定到一个Container(Engine)上。
Connector 连接器,处理与客户端的通信,它负责接收客户请求,然后转给相关的容器处理,最后向客户返回响应结果。->调用对应连接器组件实现通信
Container 容器,负责处理用户的servlet请求,并返回对象给Web用户的模块。

Container容器组件:
Engine :一个service最多有一个Engine。Servlet引擎
Host : 虚拟主机,可以有多个。一个虚拟主机可包含多个Context
Context : 表示一个Web应用程序。一个Web应用程序可以有多个Wrapper
Wrapper :具体servlet处理路径。

Tomcat启动流程:
1 加载Tomcat的配置文件,初始化容器组件。(调用一系列组件init()方法)
2 监听对应端口号,准备接受客户端请求。(调用一系列组件start()方法)

Tomcat启动过程非常标准化,统一按照生命周期管理接口Lifecycle的定义进行启动。首先调用init()方法进行组件的逐级初始化操作,然后再调用start()方法进行启动。
每一级的组件除了完成自身的处理外,还要负责调用子组件响应的生命周期管理方法,组件与组件之间是松耦合的,因此我们可以很容易的通过配置文件进行修改和替换。

从配置的一方面了解:
URL请求流程:
http://www.itcast.cn/bbs/findAll

Connector 指定协议http,端口80
Engine->Host 指定域名www.itcast.cn #一个Server有多个Service->有多个Connector与一个Container绑定。
Context 指定bbs #Context 在service.xml文件中,<Host name=“localhost” appBase="webapps"unpackWARs=“true” autoDeploy=“true”>由 appBase指定
Wrapper 指定findAll

原理:Tomcat用Mapper组件来完成任务的,Mapper组件的功能是将用户请求的URL定位到一个Servlet,它的工作原理是:Mapper组件里保存了web应用的配置信息,
其实就是容器组件与访问路径的映射关系,比如Host容器里配置的域名,Context容器里的Web应用路径,以及Wrapper容器里Servlet映射路径,你可以想象
这些配置信息就是一个多层次的Map。
当一个请求到来时,Mapper组件通过解析请求URL里的域名和路径,再到自己保存的Map里去查找,就能定位到一个Servlet.
注意:一个请求URL最后只会定位到一个Wrapper容器,也就是一个Servlet.

Tomcat组件扩展:通过Pipeline(管道)和Valve(处理器)两个接口,Pipeline用于构建责任链,后者代表责任链上的每个处理器。采用责任链模式完成具体请求处理,
与组件扩展。

Jasper模块:Tomcat的JSP核心引擎,将用户进行访问jsp时,将.jsp页面转换成.class文件,最终将访问结果直接响应在浏览器端。
index.jsp->index.java(里面包含里html页面的输出流数据)->index.java.class-> 由Servlet处理.class文件。再响应html页面数据给浏览器端。

Tomcat服务器配置:

server.xml配置文件:
Server 相当于Tomcat容器。一个Tomcat,只能有一个Server。
一个Service 相当于一个服务实例
可以有多种连接服务实例的方式(http,https,Ajp等) 多个Connector :创建多种不同连接器实例
一个Container容器 (相当于工程源码工作地方,可以部署多套工程)
Engine顶级标签


#docBase 指向为解压的web工程文件
可以有多个Context




Context 为Host的子标签,用于配置一个Web应用。默认配置如下:



docBase: Web应用目录或者War包的部署路径,可以是绝对路径,也可以是相对于Host appBase的相对路径。
path : Web应用的Context路径。如果我们Host名为localhost,则该web应用访问的根路径为: http://localhost:8080/myApp

redirectPort :当前Connector不支持SSL请求(https请求),接收到了一个请求,并且也符合security-constraint约束,
需要SSL传输,Catalina自动将请求重定向到指定的端口。

execute: 指定共享线程池的名称。

tomcat-users.xml
该配置文件中,主要配置的是Tomcat的用户,角色等信息,用来控制Tomcat中manager,host-manager的访问权限。

web应用配置:
web.xml :web应用一下默认配置,
例如:所有请求拦截,拦截器Servelt配置:org.apache.catalina.servlets.DefaultServlet
jsp拦截器配置: org.apache.jasper.servlet.JspServlet 等等。
会话超时配置:Session

Session会话机制:
http第一次请求登录操作,会在Tomcat创建一个Session,Session记录相关登录信息。然后Tomcat服务器会把此Session的唯一标识(SessionId),返回给相应
请求的浏览器。以Cookie形式存储(JSESSIONID)。

http第二次请求服务器时,携带相关Cookie(JSESSIONID的值(SessionID)),Tomcat通过SessionID找到Session,分析Session里面的信息。来起到识别用户的功能。

定义错误页面:
1 提高用户体验
2 提高系统安全
#根据错误码返回,错误页面
500
/500.html


404
/404.html

#根据异常类型,返回错误页面
java.lang.Exception
error.jsp

Tomcat管理配置:
提供了Web版的管理控制台,他们是两个独立的Web应用,位于webapps目录下。Tomcat提供的管理应用有
用于管理Host的host-manager和用于管理Web应用的manager。

注意:需要在tomcat-users.xml中配置用户,权限信息。
#host-manager配置

#manager配置: web应用部署服务管理,JVM运行状况


JVM配置
最常见的JVM配置当属内存分配,因为在绝大多数情况下,JVM默认分配的内存可能不能够满足我们的需求,特别是在生产环境下,此时需要手动
修改Tomcat启动时的内存参数分配。

修改配置文件: catalina.bat/.sh ,位置:文件第一行就行。
windows
set JAVA_OPTS=-server -Xms2048m -Xmx2048 -XX:MetaspaceSize=256m -XX:MaxMetaSapceSize=256m -XX:SurvivorRatio=8

Linux
JAVA_OPTS="-server -Xms2048m -Xmx2048 -XX:MetaspaceSize=256m -XX:MaxMetaSapceSize=256m -XX:SurvivorRatio=8"

-Xms 堆内存初始大小
-Xmx 堆内存最大大小
-Xmn 新生代的内存大小
-XX:MetaspaceSize 元空间内存初始大小,在JDK1.8版本之前配置为 -XX:PermSize(永久代)
-XX:MaxMetaSpaceSize 元空间内存最大大小,在JDK1.8版本之前配置为 -XX:MaxPermSize(永久代)
-XX:NewRatio 设置新生代和老年代的相对大小比例。这种方式的优点是新生代大小会随着整个堆大小动态扩展。如: -XX:NewRatio=3
指定老年代/新生代为 3/1 。老年代占堆大小的3/4,新生代占1/4

-XX:SurvivorRatio 指定伊甸园区(Eden)与幸存区大小比例。如 -XX:SurvivorRatio=10 表示伊甸园区(Eden)是 幸存区 To 大小的10倍。
也是幸存区From的10倍。所以,伊甸园区占新生代大小的10/12 , 幸存区From和幸存区 To每个占新生代的 1/12。注意
两个幸存区永远是一样大的。

无论-XX:MetaspaceSize和-XX:MaxMetaspaceSize两个参数如何设置,都会从20.8M开始,随着类加载越来越多不断扩容调整,
上限是-XX:MaxMetaspaceSize,默认是几乎无穷大。

注意:堆的大小是不包含Metaspacesize大小的。

Tomcat集群:
由于单台Tomcat的承载能力是有限的,当我们的业务系统用户量比较大,请求压力比较大时,单台Tomcat是扛不住的,这个时候,就需要搭建Tomcat的集群,
而目前比较流行的做法就是通过Nginx来实现Tomcat集群的负载均衡。
Tomcat1
客户端-》(Nginx+keepalived)集群-> Tomcat2 (集群)
Tomcat3

Session共享方案:
在Tomcat集群中,如果应用需要用户进行登录,那么这个时候,由于tomcat做了负载均衡(默认:轮询),则用户登录并访问应用系统时,就会出现问题。(Session不在同一个Tomcat上导致)

解决方案:
1 ip_hash策略
一个用户发起的请求,只会请求到tomcat1上进行操作,另一个用户发起的请求只在tomcat2上进行操作。那么这个时候
,同一个用户发起的请求,都会通过nginx的ip_hash策略,将请求转发到其中一台Tomcat上。

2 Session复制(Tomcat集群Session使用同一个Session信息(通过广播机制,复制Session实现)),适用中小型项目。大型项目过于耗费资源。
在每个Tomcat添加以下设置,实现Session复制。
1 标签,加入:

2设置工程web.xml文件,添加:
     <distributable/>标签

3 SSO单点登录(常用解决方案)
SSO定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,也是用来解决集群环境Session共享的方案之一。
单独一个构建认证服务,所有请求经过此认证服务进行验证,把验证信息存储在redis中。验证通过则执行Tomcat工程下业务逻辑。验证不通过则,进行相关处理。

Tomcat安全:
1 删除webapps下管理web界面。
2禁用 服务关闭指令端口。
#-1,禁用关闭服务指令执行端口。

3定义错误页面
在webapps/ROOT目录下定义错误页面404.html,500.html;然后在tomcat/conf/web.xml中进行配置

404
/404.html

500 /500.html

应用安全:使用一些安全框架进行认证、授权操作。SpringSecurity,Apache Shiro等。

传输安全:使用HTTPS(超文本传输安全协议),进行数据传输。

Tomcat性能调优:
tomcat性能测试:
1 响应时间
2 吞吐量: 单位时间内,可以处理的请求数。计算单位: TPS(每秒请求数)
通常情况下,我们需要借助于一些自动化工具来进行性能测试,因为手动模拟大量用户的并发访问
几乎是不可行的,而且现在市面上也有很多的性能测试工具可以使用,如:
ApacheBench(免费),ApacheJMeter(免费),
收费: WCAT,WebPolygraph,LoadRunner。

介绍:ApacheBench使用
安装:
yum install httpd-tools
查看版本号:
ab -V

在Linux服务器执行:
ab -n 1000 -c 100 -p data.json -T application/json http://localhost:9000/course/search.do?page=1&pageSize=10

-p data.json #Post请求,请求参数存放在data.json文件中,application/json传输格式,
http://localhost:9000/course/search.do?page=1&pageSize=10 #请求地址URL
-n 在测试会话中执行的请求个数,默认只执行一次请求
-c 一次产生的请求个数,默认一次一个。并发数

请求完成后,会生成测试报告:
分析测试报告

Tomcat性能优化:
1 JVM参数调优
配置:
catalina.sh/.bat
JAVA_OPTS="-server Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:SurvivorRatio=8"

查看Tomcat下,JVM堆内存运行状况
jmap -heap 51904 #51904 tomcat进程号

2 垃圾回收策略选择
JVM垃圾回收性能主要有两个主要指标:
1 吞吐量:工作时间(排除GC时间)占总时间的百分比。
2 暂停时间: 测试时间段内,由垃圾回收导致的应用程序停止响应次数/时间。

tomcat通过:jconsole查看Tomcat,垃圾收集器使用情况。
linux使用:jconsole
1 在 catalina.sh, JAVA_OPTS追加连接信息:
2 重启tomcat
3 打开本地jconsole客户端,选择远程进程。输入配置信息:
192.168.0.103:8999
4 即可展示JVM相关信息

配置垃圾收集器:
bin/catalina.sh脚本中,追加如下配置:
JAVA_OPTS="-XX:+UseConcMarkSweepGC -XX:+PrintGCDetails"
#配置CMS垃圾收集器
#打印每次垃圾收集器回收垃圾详细信息

调试完后,再次进行性能测试,查看测试报告。看是否提高程序应用运行效率。

Tomcat配置调优:
调整tomcat/conf/server.xml中关于链接器的配置可以提升应用服务器的性能。
连接器参数调优(根据服务器硬件状态,进行合理参数配置,可以提升tomcat性能)

WebSocket: HTML5新增的协议,它是在浏览器和服务器之间建立一个不受限的双向通信通道。(长连接),比如说:服务器可以在任意时刻发送消息给浏览器,浏览器也可以任意时刻发送消息给服务器。
ws:// WebSocket通信协议,基于http协议,发展而来。
由浏览器发起请求,与服务器建立长连接。进行双方实时通信。

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页