当前位置: 首页 > 图灵资讯 > 技术篇> Tomcat 9.X(9.0.74)集群实现Session共享(基于redisson)

Tomcat 9.X(9.0.74)集群实现Session共享(基于redisson)

来源:图灵教育
时间:2023-06-11 09:18:36

tomcat集群session共享问题

j集群环境中多个tomcat之间不共享session存储空间,当请求切换到不同的tomcat服务时,session数据丢失。

思路分析:

每个tomcat都有自己的session,假设用户第一次访问第一个tomcat,并将自己的信息存储在第一个服务器的sesion中,但第二次用户访问第二个tomcat,所以在第二个服务器中,当然没有第一个服务器存储session,所以此时 整个登录拦截功能会出现问题,如何解决这个问题?

常见的Session共享方案分析

Session共享方案应满足:数据共享、内存存储、key/Value结构

一 使用nginxip_hash

当使用ip绑定ip_hash算法时,用户的请求将绑定在同一节点服务器上。这样的设置会导致一个或多个服务器过载,无法提供服务,而正常的后端服务器无法提供服务。当绑定服务器挂断时,用户只能在重新访问之前重新启动浏览器,因此用户体验非常差。除特殊需要外,不建议使用此机制实现session共享

二 基于服务端的session共享1 基于Tomcat提供的session复制

这个方案意味着每个tomcat都有不同的session,但是每当任何服务器的session修改时,都会同步给其他tomcat服务器的session,这样session就可以共享了。但是这个方案有以下问题:

1、集群中的每个服务器都有一个完整的session数据,浪费内存空间(tomcat多的时候)。

2、当tomcat较多时,session在复制到集群中的其他机器时可能会延迟(占用内网宽带)。用户在复制过程中访问,仍然无法登录

2 基于memcached/file的实现

本处介绍不多,感兴趣的同学可以自己查资料。

3 基于jcoleman的redis解决方案

该方案仅支持tomcat6和7。如果您想支持tomcat8或9,您需要修改代码,然后打包和部署,这是非常麻烦的。不建议使用。所以这里不再重复了。附上参考资料,以便自己理解和学习

参考资料:

tomcat-redis-session-manager

基于redis实现tomcat8的session共享

tomcat8集群的session持久化实现

4 基于Redison的redis解决方案4.1 环境准备

IP

软件

软件版本

127.0.0.1

Nginx

nginx-1.24.0

127.0.0.1:8080

Tomcat

apache-tomcat-9.0.74-1

127.0.0.1:8081

Tomcat

apache-tomcat-9.0.74-2

127.0.0.1:6379

Redis

Redis-x64-5.0.14.1

4.2 nginx+tomcat+redis部署过程4.2.1 安装部署Redis

1 下载安装

1)访问https://github.com/tporadowski/redis/releases地址,下载redisx64-5.0.14.1.zip

2.解压Redis-x64-5..14.1.zip文件,点击执行redis-server.exe,如图:

注:如需设置访问密码,请编辑redis.windows.conf文件如图:

4.2.2 tomcat安装部署部署

下载安装

1)访问https://tomcat.apache.org/download-90.cgi地址,下载apache-tomcat-9.0.74.zip文件

2)解压apache-tomcat-9.0.74.如图所示,zip文件:

3)修改Tomcat端口

apache-tomcat-9.0.74-1端口保持原值不变,修改apache-tomcat-9.0.74-2端口,如下图所示:

apache-tomcat-9.0.74-2/conf/server.xml

4)修改 TOMCAT_BASE/webapps/ROOT/index.jsp,添加:

<table align="center" border="1">    <tr>      <td>cluster-desc</td>        <!-- 分别修改描述 -->      <td>This is the first tomcat</td>      <td>This is the second tomcat</td>    </tr>    <tr>      <td>SessionID</td>      <td><%= request.getSession().getId() %></td>    </tr>    <tr>      <td>SessionCreatedTime</td>      <td><%= request.getSession().getCreationTime() %></td>   </tr>   <tr>      <td>ServerName</td>      <td><%=request.getServerName()%></td>   </tr>   <tr>      <td>SessionPort</td>      <td><%=request.getServerPort()%></td>   </tr></table>

5)apache-tomcat-9.0.74-1、apache-tomcat-9.0.74-1访问验证

分别访问http://127.0.0.1:8080/,http://127.0.0.1:8081/ 链接,如下图所示(sessionID不同):

4.2.3 安装部署Nginx

下载安装

1)访问http://nginx.org/en/download.下载nginx-1.24.0html链接.zip文件

2.解压nginx-1.24..zip文件,如图所示

3)nginx负载均衡配置

nginx-1.24.0/conf/nginx.conf

upstream ha-balance {    server 127.0.0.1:8080 weight=1;    server 127.0.0.1:8081 weight=1;}location = / {  proxy_pass http://ha-balance;}

4)测试验证,访问:http://127.0.0.1 每次发现sessionid都不一样。

4.2.4 配置tomcat session共享4.2.2.4.1、Add session manager

1)Add shared redisson instance produced by JndiRedissonFactory into tomcat/conf/server.xml in GlobalNamingResources tag area:

<GlobalNamingResources>    <Resource name="bean/redisson"          auth="Container"          factory="org.redisson.JndiRedissonFactory"          configPath="${catalina.base}/conf/redisson.yaml"          closeMethod="shutdown"/>  </GlobalNamingResources>

2)Add JndiRedissonSessionManager with resource link to redisson instance into tomcat/conf/context.xml

<ResourceLink name="bean/redisson"      global="bean/redisson"      type="org.redisson.api.RedissonClient" /><Manager className="org.redisson.tomcat.JndiRedissonSessionManager"     readMode="REDIS"     jndiName="bean/redisson" />

3)新增redison配置文件 tomcat/conf/redisson.yaml 可参考更多配置

singleServerConfig:  idleConnectionTimeout: 10000  connectTimeout: 10000  timeout: 3000  retryAttempts: 3  retryInterval: 1500  password: null  subscriptionsPerConnection: 5  clientName: null  address: "redis://127.0.0.1:6379"  subscriptionConnectionMinimumIdleSize: 1  subscriptionConnectionPoolSize: 50  connectionMinimumIdleSize: 24  connectionPoolSize: 64  database: 0  dnsMonitoringInterval: 5000threads.: Threads16netty: 32codec: !<org.redisson.codec.MarshallingCodec> {}transportMode: "NIO"
4.2.4.2 将两个Jar包下载并复制到Tomcatat中 Lib目录下

redisson-all-3.21.0.jar

Tomcat 7.x - redisson-tomcat-7-3.21.0.jar

Tomcat 8.x - redisson-tomcat-8-3.21.0.jar

Tomcat 9.x - redisson-tomcat-9-3.21.0.jar

Tomcat 10.x - redisson-tomcat-10-3.21.0.jar

4.2.5 session共享测试验证

重启tomcat,访问:https://www.tulingxueyuan.cn/d/file/p/20230611/wlw3hfdadop 每次发现sessionid都是一样的

参考资料:

https://github.com/redisson/redisson/tree/master/redisson-tomcat

https://github.com/redisson/redisson/wiki/2.-Configuration

Tomcat+redis+session实现session共享httppredison://chanpinxue.cn/archives/5694.htmlhttps://blog.csdn.net/chenyang_wei/article/details/127846656