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

服务器 0

一、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 的应用

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

1.3 JavaScript

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

JavaScript 的主要特点:

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

JavaScript 的主要用途:

  1. 网页交互:JavaScript 最常见的用途是为网页添加交互功能,如表单验证、动态内容更新、动画效果等。
  2. DOM 操作:通过 JavaScript,可以实时操作网页的 DOM 结构,动态修改 HTML 元素的内容、样式或结构。
  3. AJAX 请求:JavaScript 支持异步通信,可以使用 AJAX 技术在不重新加载页面的情况下与服务器交换数据,提升用户体验。
  4. 事件处理:JavaScript 可以处理用户事件(如点击、输入、悬停等),响应用户操作,提供实时反馈。
  5. 服务器端开发:通过 Node.js,JavaScript 也可以用于服务器端编程,构建快速、可扩展的网络应用。
  6. 游戏开发: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)是一种传统的应用程序架构模式,其中所有的功能模块都被打包成一个独立的可执行文件或部署单元。整个应用程序作为一个整体运行,所有的业务逻辑、数据访问、用户接口、后台任务等都包含在一个代码库和一个进程中。

在这里插入图片描述

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 强调服务的松散耦合、可重用性和可组合性,使得系统在扩展和维护方面更加灵活。

在这里插入图片描述

  • 在 SOA 中,服务是一个独立的功能单元,它可以是一个业务流程、一个计算任务或数据处理逻辑。服务通过标准化的接口提供功能,可以被不同的应用程序或其他服务调用。

  • SOA 强调服务之间的松散耦合,这意味着服务可以独立地开发、部署和更新,而不会对其他服务产生重大影响。这种特性增强了系统的灵活性和可维护性。

  • SOA 中的服务是通用的,能够被多个应用程序复用,避免了重复开发,提高了开发效率。

  • 服务可以通过编排或组合形成更复杂的业务流程或应用程序,从而实现更高级别的业务功能。这通常通过业务流程管理(BPM)工具来实现。

  • SOA 使用标准化的通信协议,如 SOAP(Simple Object Access Protocol)或 REST(Representational State Transfer),以确保不同平台和语言的服务之间能够互操作。

优点

  • 提高系统的灵活性和可扩展性:由于服务是松散耦合的,系统可以很容易地扩展新功能或修改现有功能,而不需要对整个系统进行大规模的变更。

  • 增强复用性:服务是通用的,可以在不同的应用程序中复用,减少了重复开发的成本。

  • 支持异构系统集成:SOA 使用标准化的通信协议,能够在不同的平台和编程语言之间进行系统集成,适用于复杂的企业级系统。

  • 改进系统的维护性:服务可以独立开发、测试、部署和升级,降低了维护和更新的复杂性。

缺点

  • 复杂性增加:构建和管理一个完整的 SOA 体系结构可能会增加系统的复杂性,特别是在服务编排、治理和通信方面。

  • 性能开销:由于服务之间通常通过网络通信,这可能带来一定的性能开销,尤其是在服务数量较多或数据量较大的情况下。

  • 服务治理和安全:随着服务数量的增加,管理和保护这些服务成为一个挑战。需要有效的服务治理策略和安全机制,以确保系统的稳定性和安全性。

2.2.3 微服务

微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等.

属于SOA(Service Oriented Architecture)的子集

在这里插入图片描述

从技术角度讲就是一种小而独立的处理过程,类似与进程的概念,能够自行单独启动或销毁微服务架构(分布式系统),各个模块/服务,各自独立出来,“让专业的人干专业的事”,独立部署。分布式系统中,不同的服务可以使用各自独立的数据库。

服务之间采用轻量级的通信机制(通常是基于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应用服务器

在这里插入图片描述

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环境

[root@Tomcat-node1 ~]# yum install java-1.8.0-openjdk.x86_64 -y   # 下载java1.8版本

2.安装并启动tomcat

[root@Tomcat-node1 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.93/bin/apache-tomcat-9.0.93.tar.gz           # 从官方网站获取下载链接进行下载[root@Tomcat-node1 ~]# tar zxf apache-tomcat-9.0.91.tar.gz -C /usr/local/   # 解压文件到默认下载目录中[root@Tomcat-node1 ~]# ln -s /usr/local/apache-tomcat-9.0.93/ /usr/local/tomcat  # 设置软链接到解压文件中[root@Tomcat-node1 ~]# /usr/local/tomcat/bin/startup.sh     # 使用路径来启动tomcat

3.查看端口

[root@Tomcat-node1 ~]# netstat -antlupe | grep javatcp6       0      0 :::8080                 :::*                    LISTEN      1001       76090      41356/java   

4.访问测试tomcat

在这里插入图片描述

tomcat-node2的配置于tomcat-node1的配置一致

3.3 tomcat的文件结构

# 查看tomcat的目录[root@Tomcat-node1 ~]# ls /usr/local/tomcat/bin           conf             lib      logs    README.md      RUNNING.txt  webappsBUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp         work

tomcat的目录结构

目录说明
bin服务启动、停止等相关程序和文件
conf配置文件
lib库目录
logs日志目录
webapps应用程序,应用部署目录,相当于nginx的默认发布目录
work jsp编译后的结果文件,建议提前预热访问

3.4 配置tomcat的启动文件

1.生成tomcat的主配置文件

[root@Tomcat-node1 ~]# cat /usr/local/tomcat/conf/tomcat.conf JAVA_HOME=/etc/alternatives/jre_openjdk

2.配置启动文件

[root@Tomcat-node1 ~]# vim /lib/systemd/system/tomcat.service[Unit]Description=Tomcat#After=syslog.target network.target remote-fs.target nss-lookup.targetAfter=syslog.target network.target[Service]Type=forkingEnvironmentFile=/usr/local/tomcat/conf/tomcat.confExecStart=/usr/local/tomcat/bin/startup.shExecStop=/usr/local/tomcat/bin/shutdown.shPrivateTmp=trueUser=tomcatGroup=tomcat[Install]WantedBy=multi-user.target

3.使用systemctl命令启动tomcat

[root@Tomcat-node1 ~]# systemctl daemon-reload   # 重新加载参数配置[root@tomcat ~]# systemctl enable --now tomcat   # 开启tomcat[root@Tomcat-node1 ~]# systemctl status tomcat   # 查看tomcat的状况

以上在tomcat-node2中的配置一致

四、Tomcat的反向代理部署

4.1 常见部署方式

4.1.1standalone模式

在这里插入图片描述

standalone模式,Tomcat单独运行,直接接受用户的请求,不推荐。

4.1.2 单机反向代理

在这里插入图片描述

反向代理,单机运行,提供了一个Nginx作为反向代理,可以做到静态由nginx提供响应,动态jsp代理给Tomcat

  • LNMT:Linux + Nginx + MySQL + Tomcat

  • LAMT:Linux + Apache(Httpd)+ MySQL + Tomcat

4.1.3 反向代理多级

在这里插入图片描述

前置一台Nginx,给多台Tomcat实例做反向代理和负载均衡调度,Tomcat上部署的纯动态页面更适合

  • LNMT:Linux + Nginx + MySQL + Tomcat

4.1.4 反向代理多级多机

在这里插入图片描述

多级代理

  • LNNMT:Linux + Nginx + Nginx + MySQL + Tomcat

4.2 利用Nginx实现反向代理

在这里插入图片描述

利用nginx反向代理功能,实现图中的代理功能,将用户请求全部转发至指定的同一个tomcat主机,利用nginx指令proxy_pass 可以向后端服务器转发请求报文,并且在转发时会保留客户端的请求报文中的host首部

4.2.1tomcat的反向代理

1.在tomcat端编写proxy_pass的jsp脚本,并将其放置tomcat的ROOT目录下,模拟仿真的Sessione会话界面

[root@Tomcat-node1 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/

2.在Nginx端编写访问

[root@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及端口	}}[root@nginx ~]# nginx -s reload

3.在windowns中做地址解析

C: /Windows/System32/drivers/etc/hosts

172.25.254.60 www.tomcat.org

4.访问测试

在这里插入图片描述

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的负载均衡
[root@nginx ~]# 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;	}}[root@nginx ~]# nginx -s reload

访问测试:

在这里插入图片描述

访问测试成功后,可以看到,虽然实现了负载均衡,但由于是本地哈希的方式,因此当使用另一个浏览器的进行访问的时候,依然会是访问到172.25.254.11的tomcat服务器上,因此需要再进一步优化

4.3.2.2 cookie_JSESSIONID的负载均衡
[root@nginx ~]# vim /usr/local/nginx/conf.d/tomcat.confupstream 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;    }}[root@nginx ~]# nginx -s reload

访问测试:

在这里插入图片描述

使用cookie_JSESSIONID的负载均衡后,当浏览器1访问后,在浏览器2会自动连接到tomcat2中

但是,当模拟tomcat故障下线时,例如在tomcat1中提交了session会话,当重新提交时,tomcat服务器会自动连接到tomcat2,但此时在tomcat1中的session会话会丢失

# 模拟tomcat2出现故障[root@Tomcat-node1 ~]# systemctl stop tomcat

测试:

在这里插入图片描述

因此可以通过Memcached来实现会话保持

五、Seesion的会话保持

5.1Memcached

在这里插入图片描述

Memcached 官网:http://memcached.org/

5.1.1 Memcached的安装与启动
[root@Tomcat-node1 ~]# yum install memcached -y[root@Tomcat-node1 ~]#  vim /etc/sysconfig/memcachedPORT="11211"USER="memcached"MAXCONN="1024"CACHESIZE="64"OPTIONS="-l 0.0.0.0,::1"[root@Tomcat-node1 ~]# systemctl enable --now memcached[root@Tomcat-node1 ~]# netstat -antlupe | grep memcachetcp    0   0 0.0.0.0:11211     0.0.0.0:*       LISTEN  975    122107     43014/memcached tcp6   0   0 ::1:11211         :::*            LISTEN  975    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/replacekey key 			# 用于查找缓存值flags 				# 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息expiration time 	# 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)bytes 				# 在缓存中存储的字节数value			 	# 存储的值(始终位于第二行)#增加key,过期时间为秒,bytes为存储数据的字节数add key flags exptime bytes

示例:

[root@tomcat ~]# telnet localhost 11211Trying ::1...Connected to localhost.Escape character is '^]'.#增加add leekey 0 60 4 #0 是否压缩 60 过期时间 4 字长testSTOREDadd leekey1 0 60 3leeSTORED#查看get leekeyVALUE leekey 0 4testget leekey1VALUE leekey1 0 3lee#改set leekey 0 60 5test1STOREDget leekeyVALUE leekey 0 5test1ENDadd leekey1 0 60 4test#删除delete leekeyDELETEDget leekeyENDget leekey1VALUE leekey1 0 3lee#清空flush_allOKget leekey1END

测试:

使用Memcached实现会话保持后,还需要使用MSM共享服务实现新用户发请求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备份。

5.2 session共享服务器

5.2.1 msm的简介

在这里插入图片描述

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.jarasm-5.2.jarobjenesis-2.6.jarreflectasm-1.11.9.jarminlog-1.3.1.jarkryo-serializers-0.45.jarmsm-kryo-serializer-2.3.2.jarmemcached-session-manager-tc9-2.3.2.jarspymemcached-2.12.3.jarmemcached-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配置[root@Tomcat-node1 ~]# 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>[root@Tomcat-node1 ~]# systemctl restart memcached

在tomcat2中的配置一致

测试:

# 连接上tomcat2后,提交会话数据后,模拟当前tomcat服务器出现故障[root@Tomcat-node2 ~]# systemctl stop tomcat

在这里插入图片描述

也许您对下面的内容还感兴趣: