zoukankan      html  css  js  c++  java
  • Tomcat使用Memcached Session Manager管理Session

    Tomcat使用Memcached Session Manager管理Session

    废话不多说,直接进入主题。项目使用阿里云负载均衡+ECS服务器集群进行部署,Tomcat使用8.5版本。阿里云负载均衡提供会话保持功能,开启此功能后,同一IP地址的请求将转发到同一台后端ECS服务器处理,每台ECS中的Tomcat各自管理各自的Session,互不相关。

    但是此功能并不能满足实际需求,比如客户端从WIFI切换为4G网络后ip改变,请求有可能被转发到不同的ECS服务器上,导致登录失效。为此,我们需要统一管理所有ECS上的Tomcat中的Session,这里我们以阿里云的云数据库Memcache版(高速缓存)作为Session的载体,使用Memcached Session Manager进行统一的Session管理。

    一、阅读官方文档

    Memcached Session Manager官方配置文档地址(须FQ):
    https://code.google.com/archive/p/memcached-session-manager/wikis/SetupAndConfiguration.wiki

    结合文档和项目的实际情况,可以总结出以下信息:

    1. 需要为Tomcat添加Memcached Session Manager相关的jar包。不同的Tomcat版本所使用的包不同,Memcached Session Manager目前支持Tomcat6、7、8(包括8.5)。这些jar包均须放入Tomcat中。
    2. 可以根据需要,下载对象序列化工具相关的jar包。当然不下载也可以,Memcached Session Manager会默认使用java原生的序列化工具,对要存入和取出memcached的对象进行序列化和反序列化。但是根据网上的一些资料来看,java原生的序列化工具效率并不高,Memcached Session Manager推荐使用其他的序列化工具,比如我们接下来要使用的kryo。kryo相关的jar包可以放入Tomcat中,也可以放入项目中,但是为了统一管理,我们会把这些jar包放入Tomcat中。
    3. 配置Tomcat目录下的conf/context.xml文件,添加Manager。

    二、下载jar包

    这里我们使用Gradle下载相关jar包。使用Maven的,请自行查阅相关文档。

    build.gradle文件内容如下:

    apply plugin: 'java'
    
    repositories{
    	maven {
    		url "http://maven.aliyun.com/nexus/content/groups/public"
    	}
    	mavenCentral()
    }
    
    dependencies{
       compile group: 'de.javakaffee.msm', name: 'memcached-session-manager-tc8', version: '2.1.1' // 必须
       compile group: 'de.javakaffee.msm', name: 'msm-kryo-serializer', version: '2.1.1' // 非必须
    }
    
    task getJars(type: Copy) {
      from configurations.runtime
      into 'lib' // 获取到的jar包位置
    }
    

    安装Gradle,配置环境变量,cmd进入此文件所在目录,运行:gracle getJars。命令完成后,即可在lib目录下找到所有需要的jar包。为了便于区分和管理,重命名所有jar,名字前加均前缀“msm-”,再将所有这些jar包放入Tomcat/lib目录下。当然不改名或按其他规则改名也没有任何问题。

    动手能力强,并且对这方面比较有兴趣的同学,还可以尝试手工下载各个jar包。下载应以Memcached Session Manager和Memcached Session Manager Kryo Serializer为基础,配合Maven中央库http://mvnrepository.com,通过各自的Compile Dependencies列表递归查找并下载相应的jar包。


    三、配置Manager

    修改Tomcat/conf/context.xml(或项目/META-INF/context.xml),添加如下Manager

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
    		memcachedNodes="高速缓存ip:11211" 
    	username="用户名" 
    	password="密码" 
    	memcachedProtocol="binary" 
    	sticky="false" 
    	requestUriIgnorePattern=".*.(gif|jpg|jpeg|png|bmp|swf|js|css|html|htm|xml|json)$"
    	transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
    

    这些配置的说明,可以通过阅读de.javakaffee.web.msm.MemcachedBackupSessionManager类的源码了解。源码可以从Gradle本地库中获取,因为下载jar包是已经连源码包也一并下载了。Gradle本地库一般位于C:Users某用户.gradle目录中。这里对几个常用配置做些说明:

    1. memcachedNodes:memcached节点配置项。可以配置多个memcached,这里我们只配了一个。
    2. memcachedProtocol:默认为text,这里我们配置为binary,因为阿里云的memcached使用binary协议。
    3. sticky:true为sticky模式,false为non-sticky。当配置为sticky模式时,Tomcat以本地Session为主,memcached上的Session为备;配置为non-sticky模式Tomcat以memcached上的Session为主,本地的作为中转。细节可参考这篇文章:http://xylonwang.iteye.com/blog/1269704。这里我们使用non-sticky模式。
    4. requestUriIgnorePattern:当匹配该正则表达式的请求url到达时,不进行Session备份。
    5. transcoderFactoryClass:默认为JavaSerializationTranscoderFactory,这里我们配置为KryoTranscoderFactory,因为其效率比JavaSerializationTranscoderFactory高不少。
  • 相关阅读:
    Confluence 6 使用 WebDAV 客户端来对页面进行操作
    Confluence 6 的 WebDAV 客户端整合介绍
    Confluence 6 MySQL 3.x 字符集编码问题
    Confluence 6 € 欧元字符集不能正常显示
    Confluence 6 字符集编码的问题解决
    Confluence 6 数据库字符集编码和问题
    Confluence 6 配置字符集编码
    Confluence 6 邮件队列
    pyDay6
    c++第十六天
  • 原文地址:https://www.cnblogs.com/dfengwei/p/6486577.html
Copyright © 2011-2022 走看看