勿忘初心做自己 发表于 4 天前

WEB应用服务器 -- Tomcat详解及案例实现

一、Web前端三大核心技术

1.1 HTML

HTML(HyperText Markup Language)超文本标记语言,它不同于一样平常的编程语言。超文本即超出纯文本的范畴,比方:描述文本颜色、大小、字体等信息,或利用图片、音频、视频等非文本内容。
HTML由一个个的标签(标记)组成,这些标签各司其职,有的提供网页信息,有的负责文字,有的负责图片,有的负责网页布局,以是一个HTML文件,是由格式标签和数据组成。
<!DOCTYPE html>
<html lang="en">
        <head>
                <meta charset="UTF-8">
                <title>首页</title>
        </head>
        <body>
                <h1>嘻嘻哈哈</h1>
        </body>
</html>
超文本需要表现,就得有软件能够出现超文本界说的排版格式,比方表现:图片、表格,表现字体的大小、颜色,这个软件就是浏览器。
超文本的诞生是为了解决纯文本不能格式表现的题目,是为了悦目,但是只有通过网络才能分享超文本的内容,以是订定了HTTP协议。
1.2 CSS(Cascading Style Sheets)层叠样式表

​ HTML本身为了格式化表现文本,但是当网页出现各人面前的时候,需求HTML提供更多样式能力。这使得HTML变得越来越臃肿。这促使了CSS的诞生。
​ **CSS(Cascading Style Sheets,层叠样式表)**是一种用于描述HTML或XML文档的表现情势的样式表语言。CSS告急用于控制网页的布局、样式和表面,使网页更加美观和用户友爱。
​ CSS 3接纳了模块化头脑,每个模块都在CSS 2底子上分别加强功能。以是,这些模块是连续发布的。
​ 不同厂家的浏览器利用的引擎,对CSS的支持不一样,导致网页布局、样式在不同浏览器不一样。因此,想要保证不同用户利用不同浏览器看到的网页效果一直非常困难。
CSS 的应用


[*]排版与布局:通过设置元素的宽度、高度、浮动、定位等来控制页面的布局。
[*]文本样式:界说字体、字号、颜色、行高、文本对齐等。
[*]背景与边框:设置背景图片、颜色、边框样式、圆角等。
[*]动画与过渡:通过 transition 和 animation 实现元素的动态效果。
1.3 JavaScript

​ JavaScript 是一种轻量级的、解释型或即时编译型的编程语言,广泛用于网页开发。它是一种高层次、动态、弱类型的语言,具有基于原型的面向对象编程能力。JavaScript 是 Web 技术的三大核心之一(另两项是 HTML 和 CSS),通常与 HTML 和 CSS 一起利用,为网页添加动态功能和互动效果。
JavaScript 的告急特点:

[*]跨平台:JavaScript 可以在多个平台上运行,包括浏览器、服务器和移动装备。当代浏览器都支持 JavaScript,使其成为 Web 开发的核心语言。
[*]动态类型:JavaScript 是一种动态类型语言,变量的类型是在运行时确定的,而不是在编译时。
[*]变乱驱动:JavaScript 支持变乱处置惩罚,可以对用户的利用(如点击、鼠标悬停、键盘输入等)作出响应。
[*]基于对象:JavaScript 是一种基于原型的面向对象语言,但与传统的基于类的语言不同,它利用对象而不是类来实现继承。
[*]高效的字符串和数组处置惩罚:JavaScript 提供了强大的字符串和数组处置惩罚功能,允许开发者轻松利用文本和数据集。
[*]广泛的浏览器支持:险些所有当代浏览器都支持 JavaScript,并提供丰富的内置 API,使得开发者可以访问和利用 DOM(文档对象模型)、处置惩罚变乱、进行网络哀求等。
JavaScript 的告急用途:

[*]网页交互:JavaScript 最常见的用途是为网页添加交互功能,如表单验证、动态内容更新、动画效果等。
[*]DOM 利用:通过 JavaScript,可以及时利用网页的 DOM 结构,动态修改 HTML 元素的内容、样式或结构。
[*]AJAX 哀求:JavaScript 支持异步通讯,可以利用 AJAX 技术在不重新加载页面的情况下与服务器交换数据,提升用户体验。
[*]变乱处置惩罚:JavaScript 可以处置惩罚用户变乱(如点击、输入、悬停等),响应用户利用,提供及时反馈。
[*]服务器端开发:通过 Node.js,JavaScript 也可以用于服务器端编程,构建快速、可扩展的网络应用。
[*]游戏开发:JavaScript 的性能和机动性使其成为网页游戏开发的理想选择,特别是在 HTML5 和 WebGL 的支持下。
同步
交互式网页,用户提交了哀求,就是想看到查询的结果。服务器响应到来后是一个全新的页面内容,哪怕URL不变,整个网页都需要重新渲染。比方,用户填写注册信息,只是2次暗码不一致,提交后,整个注册页面重新刷新,所有填写项目重新填写(当然有办法让用户减少重填)。这种交互非常不友爱。从代价的角度看,就是为了注册的一点点信息,结果返回了整个网页内容,不但浪费了网络带宽,还需要浏览器重新渲染网页,太浪费资源了,影响了用户体验和感受。上面这些哀求的过程,就是同步过程,用户发起哀求,页面整个刷新,直到服务器端响应的数据到来并重新渲染。
异步
1996年微软实现了iframe标签,可以在一个网页利用iframe标签局部异步加载内容。
1999年微软推出异步数据传输的ActiveX插件技术,太笨重了,但是也火了很多年。有一个组件XMLHttpRequest被大多数浏览器支持。
传统的网页假如需要更新内容,必需重载整个网页面。Ajax的出现,改变这统统,同时极大的促进了Javascript的发展。Ajax即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,最早起源于1998年微软的Outlook Web Access开发团队。Ajax 通过在背景与服务器进行少量数据交换, 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。Javascript 通过调用浏览器内置的WEB API中的XMLHttpRequest 对象实现Ajax 技术。早期Ajax联合数据格式XML,现在更多的利用JSON。利用AJAX可实现前后端开发的彻底分离,改变了传统的开发模式。
AJAX是一种技术的组合,技术的重新发现,而不是发明,但是它深远的影响了整个WEB开发。
二、WEB框架

2.1 web资源和访问



[*] 从静态服务器哀求HTML、CSS、JS等文件发送到浏览器端,浏览器端接收后渲染在浏览器上从图片服务器哀求图片资源表现
[*] 从业务服务器访问动态内容,动态内容是哀求后有背景服务访问数据库后得到的,最终返回到浏览器端
手机 App 访问
手机内置了HTML和JS文件,不需要从静态WEB服务器下载 JS 或 HTML。为的就是减少文件的发送,当代前端开发利用的JS文件太多或太大了有须要就从图片服务器哀求图片,从业务服务器哀求动态数据客户需求多样,更多的内容还是需要由业务服务器提供,业务服务器往往都是由一组服务器组成。
2.2 背景应用架构

经过衍生背景应用架构分为以下三种:


[*]单体架构
[*]SOA(Service-Oriented Architecture,面向服务的架构)
[*]Microservice微服务架构
2.2.1 单体架构

单体架构(Monolithic Architecture)是一种传统的应用步伐架构模式,其中所有的功能模块都被打包成一个独立的可实行文件或部署单元。整个应用步伐作为一个团体运行,所有的业务逻辑、数据访问、用户接口、背景任务等都包罗在一个代码库和一个历程中。
https://i-blog.csdnimg.cn/direct/16f09fc951534b2ab31cba87be1ad512.png
Java实现:JSP、Servlet,打包成一个jar、war部署


[*] 长处
易于开发和测试:也十分方便部署;当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了。
[*] 缺点

[*] 假如某个功能模块出题目,有可能全站不可访问,修改Bug后、某模块功能修改或升级后,需要停掉整个服务,重新团体重新打包、部署这个应用war包,功能模块相互之间耦合度高,相互影响,不得当当今互联网业务功能的快速迭代。
[*] 特别是对于一个大型应用,我们不可能吧所有内容都放在一个应用内里,我们如何维护、如何分工合作都是题目。假如项目庞大,管理难度大

web应用服务器:开源的tomcat、jetty、glassfish。商用的有weblogic、websphere、Jboss
2.2.2 SOA面向服务的架构

**SOA(Service-Oriented Architecture,面向服务的架构)**是一种通过服务的概念来组织和利用分布式资源的软件架构模式。SOA 的核心头脑是将应用步伐的功能单元设计为独立的服务,这些服务通过标准的协议进行通讯和协作。SOA 夸大服务的疏松耦合、可重用性和可组合性,使得系统在扩展和维护方面更加机动。
https://i-blog.csdnimg.cn/direct/bda28ad97f0b4ce0927db20d08f5085f.png


[*] 在 SOA 中,服务是一个独立的功能单元,它可以是一个业务流程、一个计算任务或数据处置惩罚逻辑。服务通过标准化的接口提供功能,可以被不同的应用步伐或其他服务调用。
[*] SOA 夸大服务之间的疏松耦合,这意味着服务可以独立地开发、部署和更新,而不会对其他服务产生重大影响。这种特性加强了系统的机动性和可维护性。
[*] SOA 中的服务是通用的,能够被多个应用步伐复用,避免了重复开发,进步了开发服从。
[*] 服务可以通过编排或组合形成更复杂的业务流程或应用步伐,从而实现更高级别的业务功能。这通常通过业务流程管理(BPM)工具来实现。
[*] SOA 利用标准化的通讯协议,如 SOAP(Simple Object Access Protocol)或 REST(Representational State Transfer),以确保不同平台和语言的服务之间能够互利用。
长处


[*] 进步系统的机动性和可扩展性:由于服务是疏松耦合的,系统可以很轻易地扩展新功能或修改现有功能,而不需要对整个系统进行大规模的变动。
[*] 加强复用性:服务是通用的,可以在不同的应用步伐中复用,减少了重复开发的成本。
[*] 支持异构系统集成:SOA 利用标准化的通讯协议,能够在不同的平台和编程语言之间进行系统集成,适用于复杂的企业级系统。
[*] 改进系统的维护性:服务可以独立开发、测试、部署和升级,低落了维护和更新的复杂性。
缺点


[*] 复杂性增加:构建和管理一个完整的 SOA 体系结构可能会增加系统的复杂性,特别是在服务编排、治理和通讯方面。
[*] 性能开销:由于服务之间通常通过网络通讯,这可能带来一定的性能开销,尤其是在服务数目较多或数据量较大的情况下。
[*] 服务治理和安全:随着服务数目的增加,管理和掩护这些服务成为一个挑战。需要有效的服务治理策略和安全机制,以确保系统的稳固性和安全性。
2.2.3 微服务

微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等.
属于SOA(Service Oriented Architecture)的子集
https://i-blog.csdnimg.cn/direct/b23f6c9b182c4619895e077b78dad7c2.png
从技术角度讲就是一种小而独立的处置惩罚过程,类似与历程的概念,能够自行单独启动或销毁微服务架构(分布式系统),各个模块/服务,各自独立出来,“让专业的人干专业的事”,独立部署。分布式系统中,不同的服务可以利用各自独立的数据库。
服务之间接纳轻量级的通讯机制(通常是基于HTTP的RESTful API)。
微服务设计的头脑改变了原有的企业研发团队组织架构。传统的研发组织架构是程度架构,前端、后端、DBA、测试分别有本身对应的团队,属于程度团队组织架构。而微服务的设计头脑对团队的划分有着一定的影响,使得团队组织架构的划分更倾向于垂直架构,比如用户业务是一个团队来负责,付出业务是一个团队来负责。但实际上在企业中并不会把团队组织架构拆分得这么绝对,垂直架构只是一种理想的架构。
微服务的实现框架有多种,不同的应用架构,部署方式也有不同
长处


[*] 每个服务充足内聚,充足小,代码轻易理解。如许能聚焦一个只当的业务功能或业务需求。
[*] 开发简单、开发服从进步,一个服务可能就是专业的只干一件事,微服务能够被小团队单独开发,这个小团队可以是2到5人的开发职员组成
[*] 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
[*] 微服务能利用不同的语言开发
[*] 易于和第三方集成,微服务运行轻易且机动的方式集成自动部署,通过连续集成工具,如:Jenkins、Hudson、Bamboo微服务易于被一个开发职员理解、修改和维护,如许小团队能够更关注本身的工作成果,无需通过合作才能体现价值
[*] 微服务允许你利用融合最新技术。微服务只是业务逻辑的代码,不会和HTML/CSS或其他界面组件混合,即前后端分离
[*] 每个微服务都有本身的存储能力,可以有本身的数据库,也可以有同一数据库
缺点:


[*] 微服务把原有的一个项目拆分成多个独立工程,增加了开发、测试、运维、监控等的复杂度
[*] 微服务架构需要保证不同服务之间的数据一致性,引入了分布式变乱和异步补偿机制,为设计和开发带来一定挑战开发职员和运维需要处置惩罚分布式系统的复杂性,需要更强的技术能力
[*] 微服务适用于复杂的大系统,对于小型应用利用微服务,进行盲目的拆分只会增加其维护和开发成本
常见的微服务框架


[*] Dubbo
阿里开源贡献给了ASF,现在已经是Apache的顶级项目一款高性能的Java RPC服务框架,微服务生态体系中的一个告急组件将单体步伐分解成多个功能服务模块,模块间利用Dubbo框架提供的高性能RPC通讯内部和谐利用Zookeeper,实现服务注册、服务发现和服务治理
[*] Spring cloud
一个完整的微服务解决方案,相称于Dubbo的超集微服务框架,将单体应用拆分为粒度更小的单一功能服务基于HTTP协议的REST(Representational State Transfer 表述性状态转移)风格实现模块间通讯
三、Tomcat应用服务器

https://i-blog.csdnimg.cn/direct/f98a16ad09254d5fb9910c9c7207b0de.png
3.1 tomcat的功能介绍

Apache Tomcat(通常简称为 Tomcat)是一个由 Apache 软件基金会开发和维护的开源 Java 应用服务器。Tomcat 是用于运行 Java Servlets 和 JavaServer Pages (JSP) 的标准实现之一。它广泛用于开发和部署 Java Web 应用步伐,因为它轻量、易于利用且兼容主流的 Java EE(企业版)标准。
起始于SUN 公司的一个Servlet的参考实现项目 Java Web Server,开发者是 James Duncan Davidson,在1999年,将项目贡献给了apache软件基金会(ASF),和ASF现有的项目 JServ 合并,并开源成为顶级项目。
官网:
http://tomcat.apache.org/
官网文档:
https://tomcat.apache.org/tomcat-8.5-doc/index.html
资助文档:
https://cwiki.apache.org/confluence/display/tomcat/
https://cwiki.apache.org/confluence/display/tomcat/FAQ
Tomcat 仅仅实现了Java EE规范中与Servlet、JSP相关的类库,是JavaEE不完整实现。
1999年发布初始版本是Tomcat 3.0,实现了Servlet 2.2 和 JSP 1.1规范。
Tomcat 4.x发布时,内建了Catalina(Servlet容器)和 Jasper(JSP engine)等
当前 Tomcat 的正式版本已经更新到 10.0.x 版本,但当前企业中主流版本为 8.x 和 7.x
3.2 Tomcat的安装



[*]环境部署
主机名IP角色Nginx172.25.254.60Nginx服务器tomcat-node1172.25.254.11tomcat服务器toucat-node2172.25.254.22tomcat服务器   注意:以下所有案例的环境利用系统都为Rhel9.1


[*]tomcat安装
1.安装java环境
# yum install java-1.8.0-openjdk.x86_64 -y   # 下载java1.8版本
2.安装并启动tomcat
# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.93/bin/apache-tomcat-9.0.93.tar.gz         # 从官方网站获取下载链接进行下载

# tar zxf apache-tomcat-9.0.91.tar.gz -C /usr/local/   # 解压文件到默认下载目录中
# ln -s /usr/local/apache-tomcat-9.0.93/ /usr/local/tomcat# 设置软链接到解压文件中
# /usr/local/tomcat/bin/startup.sh   # 使用路径来启动tomcat
3.查看端口
# netstat -antlupe | grep java
tcp6       0      0 :::8080               :::*                  LISTEN      1001       76090      41356/java   
4.访问测试tomcat
https://i-blog.csdnimg.cn/direct/9a34b3e66ed246c2848858af6b9b5d78.png
   tomcat-node2的配置于tomcat-node1的配置一致
3.3 tomcat的文件结构

# 查看tomcat的目录
# ls /usr/local/tomcat/
bin         conf             lib      logs    README.md      RUNNING.txtwebapps
BUILDING.txtCONTRIBUTING.mdLICENSENOTICERELEASE-NOTEStemp         work
tomcat的目录结构
目录说明bin服务启动、制止等相关步伐和文件conf配置文件lib库目录logs日志目录webapps应用步伐,应用部署目录,相称于nginx的默认发布目录work jsp编译后的结果文件,建议提前预热访问 3.4 配置tomcat的启动文件

1.生成tomcat的主配置文件
# cat /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre_openjdk
2.配置启动文件
# vim /lib/systemd/system/tomcat.service

Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target


Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat


WantedBy=multi-user.target
3.利用systemctl下令启动tomcat
# systemctl daemon-reload   # 重新加载参数配置
# systemctl enable --now tomcat   # 开启tomcat
# systemctl status tomcat   # 查看tomcat的状况
   以上在tomcat-node2中的配置一致
四、Tomcat的反向代理部署

4.1 常见部署方式

4.1.1standalone模式

https://i-blog.csdnimg.cn/direct/aebd3f26449246729f13ad418262e1be.png
standalone模式,Tomcat单独运行,直接接受用户的哀求,不推荐。
4.1.2 单机反向代理

https://i-blog.csdnimg.cn/direct/2bd0505023cc4e10ac197fdd2c85a0b2.png
反向代理,单机运行,提供了一个Nginx作为反向代理,可以做到静态由nginx提供响应,动态jsp代理给Tomcat


[*] LNMT:Linux + Nginx + MySQL + Tomcat
[*] LAMT:Linux + Apache(Httpd)+ MySQL + Tomcat
4.1.3 反向代理多级

https://i-blog.csdnimg.cn/direct/2c2a3a871feb41ee8aa4bb5b60edf344.png
前置一台Nginx,给多台Tomcat实例做反向代理和负载均衡调理,Tomcat上部署的纯动态页面更得当


[*]LNMT:Linux + Nginx + MySQL + Tomcat
4.1.4 反向代理多级多机
https://i-blog.csdnimg.cn/direct/d074a369d82b4762a64c2d335843eb0b.png
多级代理


[*]LNNMT:Linux + Nginx + Nginx + MySQL + Tomcat
4.2 利用Nginx实现反向代理

https://i-blog.csdnimg.cn/direct/20301f994a7a49fabe7b3eae28b730b8.png
利用nginx反向代理功能,实现图中的代理功能,将用户请叱责部转发至指定的同一个tomcat主机,利用nginx指令proxy_pass 可以向后端服务器转发哀求报文,并且在转发时会保存客户端的哀求报文中的host首部
4.2.1tomcat的反向代理

1.在tomcat端编写proxy_pass的jsp脚本,并将其放置tomcat的ROOT目录下,模拟仿真的Sessione会话界面
# cp test.jsp /usr/local/tomcat/webapps/ROOT/
2.在Nginx端编写访问
# vim /usr/local/nginx/conf.d/tomcat.conf   # 在Nginx的子配置文件下编写新的子配置
server {
    listen 80;
    server_name www.tomcat.org;   # 访问域名地址
    root /data/web/html;
    index index.html;
        location ~ \.jsp$ {
                proxy_pass http://172.25.254.11:8080;    -- 编写访问IP及端口
        }
}
# nginx -s reload
3.在windowns中做地点解析
C: /Windows/System32/drivers/etc/hosts
172.25.254.60 www.tomcat.org
4.访问测试
https://i-blog.csdnimg.cn/direct/b193de99fbf14ba5a95e6d7aab5ab2e0.png
4.3 实现Tomcat中的负载均衡

动态服务器的题目,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压力分摊,这就需要调理,接纳一定的调理策略,将哀求分发给不同的服务器,这就是Load Balance负载均衡。
当单机Tomcat,演化出多机多级部署的时候,一个题目便凸显出来,这就是Session。而这个题目的由来,都是由于HTTP协议在设计之初没有想到未来的发展。
4.3.1HTTP的无状态,有毗连和短毗连



[*] 无状态:指的是服务器端无法知道2次哀求之间的接洽,即使是前后2次哀求来自同一个浏览器,也没有任何数据能够判断出是同一个浏览器的哀求。后来可以通过cookie、session机制来判断。

[*]浏览器端第一次HTTP哀求服务器端时,在服务器端利用session这种技术,就可以在服务器端产生一个随机值即SessionID发给浏览器端,浏览器端收到后会保持这个SessionID在Cookie当中,这个Cookie值一样平常不能持久存储,浏览器关闭就消失。浏览器在每一次提交HTTP哀求的时候会把这个SessionID传给服务器端,服务器端就可以通过比对知道是谁了
[*]Session通常会生存在服务器端内存中,假如没有持久化,则易丢失
[*]Session会定时逾期。逾期后浏览器假如再访问,服务端发现没有此ID,将给浏览器端重新发新的SessionID
[*]更换浏览器也将重新获得新的SessionID

[*] 有毗连:是因为它基于TCP协议,是面向毗连的,需要3次握手、4次断开。
[*] 短毗连:Http 1.1之前,都是一个哀求一个毗连,而Tcp的毗连创建销毁成本高,对服务器有很大的影响。以是,自Http 1.1开始,支持keep-alive,默认也开启,一个毗连打开后,会保持一段时间(可设置),浏览器再访问该服务器就利用这个Tcp毗连,减轻了服务器压力,进步了服从。
服务器端假如故障,即使Session被持久化了,但是服务没有恢复前都不能利用这些SessionID。
假如利用HAProxy大概Nginx等做负载均衡器,调理到了不同的Tomcat上,那么也会出现找不到SessionID的情况。
4.3.2 tomcat负载均衡实现

4.3.2.1 当地Hash的负载均衡

# vim /usr/local/nginx/conf.d/tomcat.conf
upstream tomcat {
        ip_hash;         # 添加本地哈希
        server 172.25.254.11:8080;
        server 172.25.254.22:8080;
}
server {
    listen 80;
    server_name www.tomcat.org;
    root /data/web/html;
    index index.html;
        location ~ \.jsp$ {
                proxy_pass http://tomcat;
        }
}
# nginx -s reload
访问测试:
https://i-blog.csdnimg.cn/direct/1fb73b46e0044e118e2661c939e306bc.png
   访问测试乐成后,可以看到,固然实现了负载均衡,但由于是当地哈希的方式,因此当利用另一个浏览器的进行访问的时候,依然会是访问到172.25.254.11的tomcat服务器上,因此需要再进一步优化
4.3.2.2 cookie_JSESSIONID的负载均衡

# vim /usr/local/nginx/conf.d/tomcat.conf
upstream tomcat {
    hash $cookie_JSESSIONID;
    server 172.25.254.11:8080;
    server 172.25.254.22:8080;
}
server {
    listen 80;
    server_name www.tomcat.org;
    root /data/web/html;
    index index.html;
    location ~ \.jsp$ {
      proxy_pass http://tomcat;
    }
}
# nginx -s reload
访问测试:
https://i-blog.csdnimg.cn/direct/7f4de736c6d842c0b2750bf15292812c.png
   利用cookie_JSESSIONID的负载均衡后,当浏览器1访问后,在浏览器2会自动毗连到tomcat2中
但是,当模拟tomcat故障下线时,比方在tomcat1中提交了session会话,当重新提交时,tomcat服务器会自动毗连到tomcat2,但此时在tomcat1中的session会话会丢失
# 模拟tomcat2出现故障
# systemctl stop tomcat
测试:
https://i-blog.csdnimg.cn/direct/73f5e04d0fd44b03bbc7935e9ede38f4.png
因此可以通过Memcached来实现会话保持
五、Seesion的会话保持

5.1Memcached

https://i-blog.csdnimg.cn/direct/cdec4d98b3d74a35b8bceb09671ed4ec.png
Memcached 官网:http://memcached.org/
5.1.1 Memcached的安装与启动

# yum install memcached -y
#vim /etc/sysconfig/memcached

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"

# systemctl enable --now memcached
# netstat -antlupe | grep memcache
tcp    0   0 0.0.0.0:11211   0.0.0.0:*       LISTEN975    122107   43014/memcached
tcp6   0   0 ::1:11211         :::*            LISTEN975    122108   43014/memcached
   注意:该配置在tomcat服务器中进行编写,tomcat2的配置一致
5.1.2 Memcached利用下令

五种根本 memcached 下令实行最简单的利用。这些下令和利用包括:
下令作用set将数据存储在缓存中,假如指定的键已经存在,set 会覆盖现有的数据。add仅在指定的键不存在时,将数据存储在缓存中。假如键已经存在,则利用失败。replace仅在指定的键已经存在时,替换该键下的数据。假如键不存在,则利用失败。get从缓存中检索指定键的数据。delete从缓存中删除指定的键及其数据。 #前三个命令是用于操作存储在 memcached 中的键值对的标准修改命令,都使用如下所示的语法:
command <key> <flags> <expiration time> <bytes>
<value>

#参数说明如下:
command set/add/replace
key key                         # 用于查找缓存值
flags                                 # 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expiration time         # 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes                                 # 在缓存中存储的字节数
value                               # 存储的值(始终位于第二行)

#增加key,过期时间为秒,bytes为存储数据的字节数
add key flags exptime bytes
示例:
# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.

#增加
add leekey 0 60 4 #0 是否压缩 60 过期时间 4 字长
test
STORED
add leekey1 0 60 3
lee
STORED

#查看
get leekey
VALUE leekey 0 4
test
get leekey1
VALUE leekey1 0 3
lee

#改
set leekey 0 60 5
test1
STORED
get leekey
VALUE leekey 0 5
test1
END
add leekey1 0 60 4
test

#删除
delete leekey
DELETED
get leekey
END
get leekey1
VALUE leekey1 0 3
lee

#清空
flush_all
OK
get leekey1
END
测试:
   利用Memcached实现会话保持后,还需要利用MSM共享服务实现新用户发哀求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备份。
5.2 session共享服务器

5.2.1 msm的简介

https://i-blog.csdnimg.cn/direct/d2cee164e95844d5b6585f95c19b5750.png
msm(memcached session manager)提供将Tomcat的session保持到memcached可以实现高可用。
github网站链接: https://github.com/magro/memcached-session-manager
支持Tomcat的 6.x、7.x、8.x、9.x


[*] Tomcat的Session管理类,Tomcat版本不同

[*] memcached-session-manager-2.3.2.jar
[*] memcached-session-manager-tc9-2.3.2.jar

[*] Session数据的序列化、反序列化类

[*] 官方推荐kyro
[*] 在webapp中WEB-INF/lib/下

[*] 驱动类

[*] memcached(spymemcached.jar)
[*] Redis(jedis.jar)

5.2.2 msm的安装

下载相关jar包
下载相关jar包,参考下面官方说明的下载链接
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
将spymemcached.jar、memcached-session-manage、kyro相关的jar文件都放到Tomcat的lib目录中,这个目录是 $CATALINA_HOME/lib/ ,对应本次安装就是/usr/local/tomcat/lib。
kryo-3.0.3.jar
asm-5.2.jar
objenesis-2.6.jar
reflectasm-1.11.9.jar
minlog-1.3.1.jar
kryo-serializers-0.45.jar
msm-kryo-serializer-2.3.2.jar
memcached-session-manager-tc9-2.3.2.jar
spymemcached-2.12.3.jar
memcached-session-manager-2.3.2.jar
5.3 Seesion会话保持的实现

t1和m1部署可以在一台主机上,t2和m2部署也可以在同一台。当新用户发哀求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备份。即Tomcat1 session为主session,memcached2 session为备用session,利用memcached相称于备份了一份Session假如Tomcat1发现memcached2 失败,无法备份Session到memcached2,则将Sessoin备份存放在memcached1中
# 以上在tomcat中安装好memcached后
# 配置msm,修改tomcat配置
# vim /usr/local/tomcat/conf/context.xml
<Context>
    . . . . . .
    <Manager pathname="" />
    -->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
      memcachedNodes="m1:172.25.254.11:11211,m2:172.25.254.22:11211"
      failoverNodes="m1"
      requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
              transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>
# systemctl restart memcached
   在tomcat2中的配置一致
测试:
# 连接上tomcat2后,提交会话数据后,模拟当前tomcat服务器出现故障
# systemctl stop tomcat
https://i-blog.csdnimg.cn/direct/db2a5cfc3c48408198d0026cf6007cbd.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: WEB应用服务器 -- Tomcat详解及案例实现