zoukankan      html  css  js  c++  java
  • 利用tomcat-redis-session-manager解决tomcat的分布式session问题

    [摘要:Redis+Tomcat完成session流程 1.客户端初次要求办事端 2.办事端发生session并set cookie相应给客户端 3.客户端再次要求办事端,会带上cookie 4.办事端依据cookie找到对应的session 完成思绪 若是我们]

    Redis+Tomcat实现session流程

    1.客户端首次请求服务端

    2.服务端产生session并set cookie响应给客户端

    3.客户端再次请求服务端,会带上cookie

    4.服务端根据cookie找到对应的session

    实现思路

    如果我们要编写程序实现这个方案,需要解决以下问题:

    1.session的安全性,即不容易被仿造。

    2.session的唯一性,如果用tomcat产生session的策略,多台tomcat会产生的session会存在重复的可能。

    3.session的有效期维护,session会有个有效期,用户在这个时间内不访问系统,session将会失效,如果

    用户一直访问,则要自动延长session有效期。

    4.在集群session服务器中,要考虑负载均衡,这也是需要编写客户端代码的,在分布式session缓存中,

    需要根据sessionId哈希分布,那么就和服务器个数进行了耦合,在添加和移除服务器的时候,将出现数

    据不一致的问题 。

    5.如何实现才能让应用程序改动最小,或者是不改动。

    我们可以选择自己写程序来实现以上功能,不过在这里我使用一个现成的框架,即tomcat-redis-session-manager

    有时间并感兴趣的朋友,可以在这个基础上自行实现一个,这样更适合自己的项目。

    服务器部署分布:

    ha主机 192.168.1.227:80

    ha备机 192.168.1.246:80

    keepalived 主机 192.168.1.227

    keepalived备机 192.168.1.246

    web1 http://192.168.1.226:8888/login

    web2 http://192.168.1.246:8888/login

    redis主 192.168.1.245 6380

    redis备

    安装redis

    主机和备机都安装redis

    wget http://download.redis.io/releases/redis-2.8.5.tar.gz

    解压:

    tar xzf redis-2.8.5.tar.gz

    cd redis-2.8.5

    make

    启动

    src/redis-server redis.conf --port 6380 &

    客户端登录

    src/redis-cli -p 6380

    备机配置复制:

    redis.conf文件中

    添加

    slaveof 192.168.1.245 6380

    Tomcat配置

    tomcat版本:7.0.61

    相关jar包:

    注意这里的jar包最好是按下面的版本,否则会出现jar包冲突的问题。

    tomcat-redis-session-manager-1.1.jar

    commons-pool-1.6.jar

    jedis-2.1.0.jar

    下载tomcat redis session manager

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

    下载 apache common pool

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

    下载版本:tomcat-redis-session-manager-1.1

    redis的jar包可以从maven中央仓库下载

    将以上3个jar包放入tomcat/lib目录中

    在tomcat context.xml中加入如下内容

    host: optional: defaults to "localhost" --> <!-- port: defaults to "6379" --> <!-- database: optional: defaults to "0" --> <!-- maxInactiveInterval: optional: defaults to "60" (in seconds) --><Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /> <ManagerclassName="com.radiadesign.catalina.session.RedisSessionManager" host="192.168.1.245"port="6380" database="0" maxInactiveInterval="60" />
     

    启动tomcat,浏览器请求tomcat

    http://192.168.1.226:8888/login/

      

    登录redis客户端,查看session

    session已经被保存到redis

    下面,我们进行一项测试

    测试流程:

    1.先访问虚拟ip1.99的应用,得到sessionId

    web服务器是226

    2.然后将对应的tomcat停掉

    3.刷新该应用,若sessionId未变,则表示redis保存session成功。

    我们发现web服务器变成了246,但是sessionId未发生变化

    该方案将session集中保存在了redis服务器,并做了主备容灾,从一定程度上提高了系统的高可用,由于

    redis是内存存储,访问效率较高,在性能上也是比较好的,但是本例中session不是分布式存储,因此当用户量

    非常大,并发访问量非常高的时候,session服务器会成为性能瓶颈。

  • 相关阅读:
    NSURLSession实现文件上传
    JS中如何判断null、undefined与NaN
    jquery
    url操作等
    设计模式
    javaScript类型转换
    jQuery.noop
    JavaScript严谨模式(Strict Mode)提升开发效率和质量
    Data URI
    e.target e.currenttarget
  • 原文地址:https://www.cnblogs.com/martin-roger/p/7595024.html
Copyright © 2011-2022 走看看