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

    xiaoxiao2021-03-25  90

    背景:

          很多时候,生产环境,需要多个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版本)

    请求监听端口 Shutdown监听端口 AJP监听端口

    tomcat_1 8080 8005 8009

    tomcat_2 8090 8015 8019

    准备:

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

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

    Xml代码

    <span style="line-height: 1.5; font-size: 18px;"><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></span>

    tomcat_1,tomcat_2都要修改contenxt.xml

    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目录下,

    开始实验:

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

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

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

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

    Java代码

    ...  十月 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内容:

    Java代码

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

    getsession.jsp内容:

    Java代码

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

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

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

    D741CDC41F66331883AAB70DC6252046就是SESSIONID

    值为

    Java代码

    \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

    看下redis变化,get "D741CDC41F66331883AAB70DC6252046"

    再看看tomcat_2的getsession.jsp,页面上获取到了

    再看看redis的变化,又一次get "D741CDC41F66331883AAB70DC6252046"

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

    待解决的问题:

    Xml代码

    java.lang.IllegalStateException: Race condition encountered: attempted to load session[32405E7F668A227E154AC6FF5E4A4F6A] which has been created but not yet serialized.          at com.radiadesign.catalina.session.RedisSessionManager.loadSessionFromRedis(RedisSessionManager.java:389)          at com.radiadesign.catalina.session.RedisSessionManager.findSession(RedisSessionManager.java:315)          at org.apache.catalina.connector.Request.isRequestedSessionIdValid(Request.java:2460)          at org.apache.catalina.connector.CoyoteAdapter.parseSessionCookiesId(CoyoteAdapter.java:1067)          at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:754)          at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:418)          at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)          at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)          at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)          at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 

       见:https://github.com/janrain/tomcat-redis-session-manager/blob/master/README.markdown  Possible Issues

    参考:

    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

    转载请注明原文地址: https://ju.6miu.com/read-18087.html

    最新回复(0)