前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于redis实现tomcat的session会话保持

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

作者头像
张琳兮
发布2019-03-14 10:49:00
1.4K0
发布2019-03-14 10:49:00
举报
文章被收录于专栏:首富手记首富手记首富手记

基于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会话保持
基于redis实现tomcat的session会话保持
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于redis实现tomcat的session会话保持
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档