转载

Tomcat7集群共享Session 基于redis进行统一管理

背景:

很多时候,生产环境,需要多个tomcat协作,那么session的统一管理是一个首先需要解决的问题。session的统一管理有很多解决方案,比如存储至数据库、memcache、redis。那么我想给大家介绍的是将session存储至redis这个方案。

先要感谢开源项目 tomcat-redis-session-manager ,感谢作者

实验环境:

操作系统:windows 7 64位

Redis版本:Redis 2.8.2101(Redis安装方法这里不介绍了,请自行Google、Baidu)

Tomcat版本:tomcat7.0.64(2个tomcat实例,注意同一台机器上试的话,启动另一个tomcat实例的时候需要修改端口号,如果是不同机器上的tomcat,那就不用修改了)

JDK版本:jdk1.7.0_80(生产环境请使用servre版本)

Tomcat7集群共享Session 基于redis进行统一管理

请求监听端口 Shutdown监听端口 AJP监听端口
tomcat_1 8080 8005 8009
tomcat_2 8090 8015 8019

准备:

tomcat_1端口按照默认配置(不改server.xml)

tomcat_2端口改为下面的配置(修改server.xml)

<Server port="8015" shutdown="SHUTDOWN">   <Service name="Catalina">        <Connector port="8090" protocol="HTTP/1.1"                connectionTimeout="20000"                redirectPort="8443" /> ....     <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" /> ....     </Service> </Server>

tomcat_1,tomcat_2都要修改contenxt.xml

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />   <Manager className="com.radiadesign.catalina.session.RedisSessionManager"          host="localhost"           port="6379"           database="0"           maxInactiveInterval="60" />

下载所需jar包(为了方便大家,我在附件里上传了所有的jar包)

1)redis的java客户端

https://github.com/xetorthio/jedis

2) tomcat-redis-session-manager的jar包,我用的是自己编译的(作者只给了gradle,⊙﹏⊙b汗没有maven的,我把它改成了maven工程的),见附件,源码也给到大家。

3) apache-commons-pool2

http://commons.apache.org/proper/commons-pool/download_pool.cgi

将下载好的jar包,放到tomcat_1/lib及tomcat_2/lib目录下,

Tomcat7集群共享Session 基于redis进行统一管理

开始实验:

首先开启redis服务 redis-server.exe redis.windows.conf

Tomcat7集群共享Session 基于redis进行统一管理

开启redis命令行客户端以便监视redis的状态变化,redis-cli -p 6379  monitor(如果有密码则 redis-cli -p 6379 -a mypass monitor)

Tomcat7集群共享Session 基于redis进行统一管理

分别通过catalina.bat run 开启tomcat_1,tomcat_2

在命令行终端,看到了如下信息,表明redis的session manager初始化成功

... 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal 信息: Attached to RedisSessionHandlerValve 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager initializeSerializer 信息: Attempting to use serializer :com.radiadesign.catalina.session.JavaSerializer 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal 信息: Will expire sessions after 1800 seconds 十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deployment of web application directory E:/WorkFolder/Temp/Redis-Session/apache-tomcat1-8080/webapps/manag 十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deploying web application directory E:/WorkFolder/Temp/Redis-Session/apache-tomcat1-8080/webapps/ROOT 十月 15, 2015 4:52:39 下午 org.apache.catalina.startup.TldConfig execute 信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a co 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal 信息: Attached to RedisSessionHandlerValve 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager initializeSerializer 信息: Attempting to use serializer :com.radiadesign.catalina.session.JavaSerializer 十月 15, 2015 4:52:39 下午 com.radiadesign.catalina.session.RedisSessionManager startInternal 信息: Will expire sessions after 1800 seconds ...

然后我们分别在tomcat_1/webapp/ROOT,tomcat_2/webapp/ROOT下放setsession.jsp,getsession.jsp

setsession.jsp内容:

<%   session.setAttribute("name","jaychang");   session.setAttribute("id","1001"); %>

getsession.jsp内容:

<%=session.getAttribute("id")%> ID:<%=session.getAttribute("name")%> NAME:<%=session.getAttribute("id")%>

好了,至此,你应该也明白了,现在要干嘛了,那么重点来了,见证奇迹的时刻到了!

打开浏览器,输入 http://127.0.0.1:8080/setsession.jsp回车

Tomcat7集群共享Session 基于redis进行统一管理 D741CDC41F66331883AAB70DC6252046就是SESSIONID

值为

/xac/xed/x00/x05w/b/x00/x00/x01Pj/xc8/xf5/xb2sr/x00/x0ejava.lang.Long;/x8b/xe4/x90/xcc/x8f#/xdf/x02/x00/x01J/x00/x05valuexr/x00/x10java.lang.Number/x86/xac/x95/x1d/x0b/x94/xe0/x8b/x02/x00/x00xp/x00/x00/x01Pj/xc8/xf5/xb2sq/x00~/x00/x00/x00/x00/x01Pj/xc8/xf5/xb2sr/x00/x11java.lang.Integer/x12/xe2/xa0/xa4/xf7/x81/x878/x02/x00/x01I/x00/x05valuexq/x00~/x00/x01/x00/x00/a/bsr/x00/x11java.lang.Boolean/xcd r/x80/xd5/x9c/xfa/xee/x02/x00/x01Z/x00/x05valuexp/x01q/x00~/x00/asq/x00~/x00/x00/x00/x00/x01Pj/xc8/xf5/xb4t/x00 D741CDC41F66331883AAB70DC6252046sq/x00~/x00/x04/x00/x00/x00/x02t/x00/x04namet/x00/bjaychangt/x00/x02idt/x00/x041001

最后我们看到了...jaychang ...1001

好了,那我们再看看getsession.jsp,先看tomcat_1的getsession.jsp

Tomcat7集群共享Session 基于redis进行统一管理

看下redis变化,get "D741CDC41F66331883AAB70DC6252046"

Tomcat7集群共享Session 基于redis进行统一管理 再看看tomcat_2的getsession.jsp,页面上获取到了

Tomcat7集群共享Session 基于redis进行统一管理 再看看redis的变化,又一次get "D741CDC41F66331883AAB70DC6252046"

Tomcat7集群共享Session 基于redis进行统一管理

获取的sessionId是同一个,说明成功了

参考:

https://github.com/jcoleman/tomcat-redis-session-manager

https://support.pivotal.io/hc/en-us/articles/206085337-How-to-setup-Redis-Session-Manager-on-tcServer-Tomcat

http://www.cnblogs.com/lengfo/p/4260363.html

正文到此结束
Loading...