• 使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享


    一、工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案:

      1、使用数据库来存储Session

      2、使用Cookie来存储Session

      3、使用Redis来存储Sesssion

      4、使用Tomcat的session复制

      5、使用Memcached来存储Session

    二、本文中主要讲一下第3种方案,也就是使用Redis来存储Session,Github中已经有该开源组件(Tomcat-redis-session-manager),下面讲一下配置的步骤:

      1、环境准备

        Tomcat7 下载地址:http://tomcat.apache.org/download-70.cgi

        Tomcat-redis-session-manager 下载地址:http://pan.baidu.com/s/1bokMOVH

        本文使用的Nginx来做的Tomcat集群。

               Nginx安装参考:Linux Centos 6.5_x86安装Nginx

        Redis安装参考:转:Centos6.5_x86安装Redis

      2、配置tomcat配置文件context.xml

    复制代码
       <!-- host="192.168.159.129"       Redis地址 -->
    <!-- port="6379" Redis端口 -->
    <!-- password="123456" Redis密码 -->
    <!-- database="0" 存储Session的Redis库编号 -->
    <!-- maxInactiveInterval="60" Session失效的间隔(秒) -->

    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Valve </span><span style="color: #ff0000">className</span><span style="color: #0000ff">="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"</span> <span style="color: #0000ff">/&gt;</span>        </br>
    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Manager </span><span style="color: #ff0000">className</span><span style="color: #0000ff">="com.orangefunction.tomcat.redissessions.RedisSessionManager"</span><span style="color: #ff0000"> </br>
        host</span><span style="color: #0000ff">="192.168.159.129"</span><span style="color: #ff0000">     </br>  
        port</span><span style="color: #0000ff">="6379"</span><span style="color: #ff0000">           </br>      
        password</span><span style="color: #0000ff">="123456"</span><span style="color: #ff0000">           </br>
        database</span><span style="color: #0000ff">="0"</span><span style="color: #ff0000">  </br>               
        maxInactiveInterval</span><span style="color: #0000ff">="60"</span> <span style="color: #0000ff">/&gt;</span></pre>
    
    复制代码

      注:

      1)Manager节点中的className属性为必选项,其它均为可选项

      2)maxInactiveInterval设置不生效,暂时找不到原因,在部署中发现Session失效的间隔一直都是读取tomcat/conf/web.xml中的session-config节点中配置的session-timeout属性值,且都是以秒为单位,(这个地方maxInactiveInterval好像不起作用,和web.xml中配置的session-config优先级有关?)

      3、添加Tomcat-redis-session-manager的jar包到tomcat/lib目录下,需要的jar包如下:

        commons-pool2-2.2.jar
        jedis-2.5.2.jar
        tomcat-redis-session-manage-tomcat7.jar

    3、在nginx中配置负载均衡,配置文件为nginx.conf

    复制代码
      http {
       upstream myServer {
        server 192.168.1.2:8080;
      server 192.168.1.3:8080;
       }
      server {
        listen 80;
        server_name localhost;
        location / {
        proxy_pass http://myServer;
       }
    } }
    复制代码

      配置完后,访问localhost的请求都将被转发到192.168.1.2:8080以及192.168.1.3:8080中去,可以在Jsp页面中打印一下Session Id验证一下:

      Session Id : <%= request.getSession().getId() %>

       如果在同一个浏览器页面上不断刷新访问,SessionId的值不变化的话,说明配置正确,此时获取的是同一个Session对象。

       也可以通过redis客户端连接到Redis库中直接查看:查看会显示有 “56E2FAE376A47F1C0961D722326B8423” key的 session 数据,value为序列化数据。

      

      注:

      1)GitHub中该开源组件(Tomcat-redis-session-manager)的主页:https://github.com/jcoleman/tomcat-redis-session-manager

      2)该组件目前不支持Tomcat8,我用的是Tomcat 7.0.68版本

      3)在程序中将对象放到Redis里时,该对象必须实现java.io.Serializable接口,否则将报错,如果对象中有其它对象的引用,该引用对象也需实现java.io.Serializable接口,所以在使用request.getSession().setAttribute()方法时,一定要注意一下这一个细节。

      4)因为要把Tomcat-redis-session-manager的jar包放到Tomcat/lib中,对Tomcat的部署造成了侵入,可以使用Spring Session来替代,spring-session使用拦截器重新包装了request从而替换session实现

      5)因为所有集群的Tomcat中配置的Redis地址是一个,如果Redis崩溃了,那么Session就不可用了,所以需要部署Redis集群,实现故障自动切换,高可用的目标。

      keepalived+redis 高可用redis主从解决方案

    文章参考自:

        1.https://my.oschina.net/kolbe/blog/618167

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

        

  • 相关阅读:
    Java设计模式系列之策略模式
    设计模式系列之热身
    算术表达式系列之后缀表达式求值
    算术表达式系列之中缀表达式转后缀表达式
    Maven下使用Junit对Spring进行单元测试
    Windows命令行使用总结(持续更新)
    Eclipse中web项目部署至Tomcat步骤
    MyBatis保存完整日期的解决方法
    Redis(一)源码安装
    【集成学习】sklearn中xgboost模块中plot_importance函数(绘图--特征重要性)
  • 原文地址:https://www.cnblogs.com/jpfss/p/9181419.html
Copyright © 2020-2023  润新知