出处:https://cloud.tencent.com/developer/article/1402997

基于redis实现tomcat的session会话保持

在实际生产中,我们经常部署应用服务,在部署的过程中,要让用户无感知你的应用升级,这种方式可以通过负载均衡方式来实现灰度部署,如前些文章的Nginx方式来实现,通过负载均衡Nginx,更新某一台tomcat服务,再通知负载均衡Nginx,把Tomcat节点重新加载上去。依次这么做,把集群中的所有Tomcat都替换一次即可,就可以实现服务的灰度部署。

如何让用户无感知?就是要实现用户的会话是可以共享的,基于session共享的方式有如下几种:

1,使用数据库来存储session 2,使用cookie来存储session 3,使用redis来存储session 4,使用tomcat的session复制 5,使用mamcached来存储session

我们这里主讲解redis的方式来实现Tomcat的session共享。

我们的例子使用了一台Nginx做负载均衡,后端挂接了两台Tomcat,且每台Tomcat的Session会话都保存到Redis数据库中。其中,Nginx配置为non-sticky运行模式,也即每一个请求都可以被分配到集群中的任何节点。当要上线新代码时,只需简单地取下Tomcat实例,此时所有的访问用户会被路由到活动的Tomcat实例中去,而且由于会话数据都是保存在redis数据库中,所以活跃用户并不会受影响。当Tomcat更新完毕,又可以把此节点加入到Nginx中。

架构图如下:

主机规划

主机名

IP地址

服务

lb01-5

10.0.0.5,172.16.1.5

nginx-1.14

web01-7

172.16.1.7

Tomcat-9.0

web02-8

172.16.1.8

Tomcat-9.0

db01-51

172.16.1.51

Redis-3.2

在两台web上安装tomcat

//安装java环境
[root@web01-7 local]# yum -y install java
//下载tomcat安装包
[root@web01-7 local]# wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-9/v9.0.12/bin/apache-tomcat-9.0.12.tar.gz
[root@web01-7 local]# tar xf apache-tomcat-9.0.12.tar.gz
[root@web02-8 local]# mv apache-tomcat-9.0.12 tomcat
[root@web01-7 local]# echo "export CATALINA_HOME=/usr/local/tomcat" >> /etc/profile
[root@web01-7 local]# source /etc/profile
[root@web01-7 local]# sed -i '/Host name=/c <Host name="jpress.sentinel.org" appBase="webapps"' /usr/local/tomcat/conf/server.xml
[root@web01-7 local]# /usr/local/tomcat/bin/startup.sh

搭建redis 安装redis,编写配置文件

[root@db01-51 ~]# cat /usr/local/redis/conf.d/master.conf
bind 172.16.1.51 127.0.0.1
protected-mode yes
daemonize yes
dir /redis_data
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000
requirepass 123123
[root@db01-51 ~]# redis-server /usr/local/redis/conf.d/master.conf
[root@db01-51 ~]# netstat -ntalp | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1173/redis-server 1
tcp 0 0 172.16.1.51:6379 0.0.0.0:* LISTEN 1173/redis-server 1

基础环境搭建完成之后我们开始正常的进行session会话保持 1,通过TomcatClusterRedisSessionManager,这种方式支持redis3.0的集群方式

下载TomcatRedisSessionManager-2.0.zip包,https://github.com/ran-jit/tomcat-cluster-redis-session-manager,放到$TOMCAT_HOMA/lib下,并解压

[root@web01-7 local]# cd tomcat/lib/
[root@web01-7 lib]# wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/2.0.4/tomcat-cluster-redis-session-manager.zip
[root@web01-7 lib]# unzip tomcat-cluster-redis-session-manager.zip
Archive: tomcat-cluster-redis-session-manager.zip
creating: tomcat-cluster-redis-session-manager/conf/
inflating: tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties
creating: tomcat-cluster-redis-session-manager/lib/
inflating: tomcat-cluster-redis-session-manager/lib/commons-logging-1.2.jar
inflating: tomcat-cluster-redis-session-manager/lib/commons-pool2-2.4.2.jar
inflating: tomcat-cluster-redis-session-manager/lib/jedis-2.9.0.jar
inflating: tomcat-cluster-redis-session-manager/lib/tomcat-cluster-redis-session-manager-2.0.4.jar
inflating: tomcat-cluster-redis-session-manager/readMe.txt

拷贝解压文件中lib文件到$TOMCAT_HOMA/lib下

[root@web01-7 lib]# cp tomcat-cluster-redis-session-manager/lib/* ./
拷贝redis-data-cache.properties到$TOMCAT_HOMA/conf文件下
[root@web01-7 lib]# cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties ../conf/

[root@web01-7 lib]# cat ../conf/redis-data-cache.properties
//远端redis数据库的地址和端口
redis.hosts=172.16.1.51:6379
//远端redis数据库的连接密码
#- redis password (for stand-alone mode)
redis.password=123123
//是否支持集群,默认的是关闭
#- set true to enable redis cluster mode
redis.cluster.enabled=false
//连接redis的那个库
#- redis database (default 0)
#redis.database=0
//连接超时时间
#- redis connection timeout (default 2000)
#redis.timeout=2000

在$TOMCAT_HOMA/conf/context.xml文件中增加以下两行

//在这个<Context>标签里面配置
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
 

配置会话到期时间在$TOMCAT_HOMA/conf/web.xml

<session-config>
<session-timeout>60</session-timeout>
</session-config>

启动tomcat服务

[root@web01-7 lib]# /usr/local/tomcat/bin/startup.sh 
然后web01和web07配置是一模一样

在$TOMCAT_HOMA/webapps/ROOT里面编写一个配置文件tt.jsp文件

[root@web01-7 ROOT]# cat /usr/local/tomcat/webapps/ROOT/tt.jsp
<body>
<%
//HttpSession session = request.getSession(true);
System.out.println(session.getCreationTime());
out.println("<br> SESSION ID:" + session.getId() + "<br>");
out.println("Session created time is :" + session.getCreationTime()
+ "<br>");
%>
</body>
测试,我们每次强刷他的sessionID都是一致的,所以我们认为他的session会话保持已经完成,你们也可以选择换个客户端的IP地址来测试

基于redis实现tomcat的session会话保持 (转)的更多相关文章

  1. Tomcat负载均衡、调优核心应用进阶学习笔记(三):LNMT nginx+tomcat、LAMT apache+tomcat、session会话保持、不错的站点

    文章目录 LNMT nginx+tomcat LAMT apache+tomcat 基于mod_proxy 单节点 配置基于mod_proxy的负载均衡 基于mod_jk(需要编译安装) 单节点 配置 ...

  2. 为Tornado框架加上基于Redis或Memcached的session 【第三方】

    Tornado 没有session,只有cookie_secret,这在一些情况下是不利于开发的.所有我们可以给Tornado加上session的功能. 这篇文章讲解的是依靠第三方包来实现.以后的文章 ...

  3. Redis存储Tomcat集群的Session

    Redis存储Tomcat集群的Session 如何 做到把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机.对使用用户零影响. 设想 是使用集群来搞定,通过通知负载均衡Nginx,取下集群中 ...

  4. 用Redis存储Tomcat集群的Session

    作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 前段时间,我花了不少时间来寻求一种方法,把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机.对使用 ...

  5. 用Redis存储Tomcat集群的Session实现session共享

    一.存储 前段时间,我花了不少时间来寻求一种方法,把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机.对使用用户零影响. 我的设想是使用集群来搞定,通过通知负载均衡Nginx,取下集群中的To ...

  6. 用Redis存储Tomcat集群的Session(转载)

    本文转自http://blog.csdn.net/chszs/article/details/42610365 感谢作者 前段时间,我花了不少时间来寻求一种方法,把新开发的代码推送到到生产系统中部署, ...

  7. Tomcat中session共享问题的简单解决办法

    tomcat-redis-session-manager 使用redis配置tomcat共享session 结构图: 分析: 分布式web server集群部署后需要实现session共享,针对 to ...

  8. 基于redis实现tomcat8及以上版本的tomcat集群的session持久化实现(tomcat-redis-session-manager二次开发)

    前言: 本项目是基于jcoleman的tomcat-redis-session-manager二次开发版本 1.修改了小部分实现逻辑 2.去除对juni.jar包的依赖 3.去除无效代码和老版本tom ...

  9. 基于redis实现tomcat8的tomcat集群的session持久化实现(tomcat-redis-session-manager二次开发)

    前言: 本项目是基于jcoleman的tomcat-redis-session-manager二次开发版本 1.修改了小部分实现逻辑 2.去除对juni.jar包的依赖 3.去除无效代码和老版本tom ...

随机推荐

  1. Adversarial Examples Improve Image Recognition

    Xie C, Tan M, Gong B, et al. Adversarial Examples Improve Image Recognition.[J]. arXiv: Computer Vis ...

  2. matplotlib 高阶之Transformations Tutorial

    目录 Data coordinates Axes coordinates Blended transformations 混合坐标系统 plotting in physical units 使用off ...

  3. 使用PyTorch构建神经网络以及反向传播计算

    使用PyTorch构建神经网络以及反向传播计算 前一段时间南京出现了疫情,大概原因是因为境外飞机清洁处理不恰当,导致清理人员感染.话说国外一天不消停,国内就得一直严防死守.沈阳出现了一例感染人员,我在 ...

  4. HTML5 纯CSS3实现正方体旋转3D效果

    实现效果: 实现代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  5. UML的定义和组成详细介绍

    目录 1.UML 1.1概述 1.2 UML是一种建模语言 1.3 UML语言包含三方面 2.UML支持软件体系结构建模 2.1 逻辑视图 2.2 实现(开发)视图 2.3 部署视图 2.4 过程视图 ...

  6. VUE3 之 键盘事件

    1. 概述 老话说的好:宁愿自己吃亏,也不让他人吃亏. 言归正传,今天我们来聊聊 VUE3 的 键盘事件. 2. 键盘事件 2.1 敲击任意键触发事件 <body> <div id= ...

  7. Python常用功能函数系列总结(三)

    本节目录 常用函数一:词频统计 常用函数二:word2vec 常用函数三:doc2vec 常用函数四:LDA主题分析 常用函数一:词频统计 # -*- coding: utf-8 -*- " ...

  8. 强化学习实战 | 自定义gym环境之显示字符串

    如果想用强化学习去实现扫雷.2048这种带有数字提示信息的游戏,自然是希望自定义 gym 环境时能把字符显示出来.上网查了很久,没有找到gym自带的图形工具Viewer可以显示字符串的信息,反而是通过 ...

  9. SYCOJ1717负二进制

    题目-负二进制 (shiyancang.cn) 进制的实质在于对于进制数的选择,选择不满足的填入当前的位置,然后除掉,继续开始选择.但是对于本题,是负数,但是进制上的数字为正数,所以就要调整,借位,因 ...

  10. weblogic 未授权命令执行漏洞(CVE-2020-14882,CVE-2020-14883)复现

    漏洞描述 2020年10月29日,360CERT监测发现 Weblogic ConSole HTTP 协议代码执行漏洞,该漏洞编号为 CVE-2020-14882,CVE-2020-14883 ,漏洞 ...