配置 tomcat
tomcat 的配置需要两件事:您需要在您的$CATALINA_HOME/lib/和WEB-INF/lib/目录中放入一些 jar,并且您必须在相关<Context>元素中(例如在META-INF/context.xml应用程序文件内部)配置 memcached 会话管理器。
将 memcached-session-manager jar 添加到 tomcat
无论选择哪种序列化策略,您始终都需要memcached-session-manager-{version}.jar(用于 tomcat6)、memcached-session-manager-tc7-{version}.jar(用于 tomcat8)或memcached-session-manager-tc9-${version}.jar(用于 tomcat9)。
如果你正在使用 memcached,你还需要spymemcached-${version}.jar。已测试至 v2.12.3。
如果你使用的是couchbase,你还需要这些jar: couchbase-client-1.4.0.jar jettison-1.3.jar、 commons-codec-1.5.jar、 httpcore-4.3.jar、 httpcore-nio-4.3.jar、 netty-3.5.5.Final.jar。
如果您使用 Redis,则需要jedis-3.0.0.jar。
请下载适当的 jar 并放入$CATALINA_HOME/lib/。
向您的 Web 应用添加自定义序列化程序(可选)
如果您想使用 Java 的内置序列化,则无需执行任何其他操作。如果您想使用自定义序列化策略(例如,由于性能更好),则必须将其与您的 Web 应用程序一起部署,以便它们在 中可用WEB-INF/lib/。
由于 msm 在 maven central(groupId 下)中可用,因此de.javakaffee.msm您可以使用构建系统的依赖管理将其拉入。使用 maven,您可以为 kryo-serializer 使用以下依赖定义:
<dependency>
<groupId>de.javakaffee.msm</groupId>
<artifactId>msm-kryo-serializer</artifactId>
<version>1.9.7</version>
<scope>runtime</scope>
</dependency>
对于 javolution ,artifactId 是msm-javolution-serializer,对于 xstream msm-xstream-serializer,对于 flexjson ,它是msm-flexjson-serializer。
如果你没有使用基于 maven 存储库的依赖项管理,那么这些是不同序列化器所需的 jar:
- kryo 序列化器:msm-kryo 序列化器、kryo 序列化器-0.34+、kryo-3.x、minlog、reflectasm、asm-5.x、objenesis-2.x
- javolution-序列化器:msm-javolution-序列化器,javolution-5.4.3.1
- xstream 序列化器:msm-xstream 序列化器、xstream、xmlpull、xpp3_min
- flexjson-序列化器:msm-flexjson-序列化器,flexjson
配置 memcached-session-manager 为 <Context>管理器
更新<Context>元素(在META-INF/context.xml或您选择的上下文定义中,请检查相关的tomcat 文档)以使其包含Managermemcached-session-manager 的配置,如下例所示。
以下示例展示了使用 memcached 服务器的粘性会话和非粘性会话以及使用 membase 的非粘性会话的配置。使用 memcached 服务器的示例假设有两个 memcached 正在运行,一个在 host1 上,另一个在 host2 上。所有示例配置都假设您想要使用基于 kryo 的序列化。
粘性会话 + kryo 示例
以下示例显示了第一个 tomcat 的配置,假设它在 host1 上运行,同时运行 memcached“n1”。该属性failoverNodes="n1"告诉 msm 最好将会话存储在 memcached“n2”中,并且只有在没有其他 memcached 节点(这里只有 n2)可用时才将会话存储在“n1”(在同一主机/机器上运行)(即使 host1 完全关闭,会话仍然在 memcached“n2”中可用,并且可以由 host2 上的 tomcat 提供服务)。对于第二个 tomcat(在 host2 上),您只需将故障转移节点更改为“n2”,以便它优先使用 memcached“n1”。其他所有内容都应保持不变。
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
非粘性会话 + kryo 示例
以下示例显示了非粘性会话的配置。在这种情况下,不需要failoverNodes,因为会话由所有 tomcat 循环提供服务,并且它们不绑定到单个 tomcat。对于非粘性会话,配置(针对两个/所有 tomcat)将如下所示:
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
非粘性会话 + kryo + Redis 示例
以下示例显示了使用 URL 为“redis.example.com”的 Redis 服务器存储非粘性会话的配置。此处的配置(针对两个/所有 tomcat)如下所示:
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="redis://redis.example.com"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
配置支持将 userinfo 作为受密码保护的 Redis 节点的 URI 的一部分。格式为“redis://: password@redis.example.com :portnumber”。如果未指定 portnumber,则使用默认端口 6379。Redis 的内置支持目前不允许连接到多个 Redis 节点,也不支持 failoverNodes 属性。但是,使用 Redis,可以通过构建 Redis 集群直接在 Redis 中实现自动故障转移。例如,Amazon ElastiCache for Redis 实现了故障转移模式,该模式不断将所有数据从主节点复制到一个或多个从属节点,然后,如果主节点发生故障,则将另一个节点提升为主节点,并在此过程中更改主节点的 DNS 条目以指向新的主节点。MSM 通过在连接断开时自动重新连接到 Redis 服务器来支持此模式,可能会获取新的 DNS 设置并因此连接到新的主节点。将来可能会添加对 Redis Sentinel 或 Redis Cluster 的支持。
使用 Couchbase + kryo 的非粘性会话示例
要连接到 membase bucket“bucket1”,配置如下:
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="http://host1.yourdomain.com:8091/pools"
username="bucket1"
password="topsecret"
memcachedProtocol="binary"
sticky="false"
sessionBackupAsync="false"
requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
多个上下文共享同一个会话 ID 的示例
如果您正在运行多个共享相同会话 ID 的 Web 应用程序/上下文(例如通过设置sessionCookiePath="/"- 或emptySessionPath="true"在 tomcat 6 中),则必须告诉 memcached 会话管理器在将会话存储在 memcached 中时向会话 ID 添加前缀。为此,您可以使用storageKeyPrefix此示例所示的属性(另请参阅下面更详细的属性描述):
<Context sessionCookiePath="/">
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
failoverNodes="n1"
storageKeyPrefix="context"
requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
以下部分提供了所有配置属性的更多详细信息。
在元素中配置 msm 后Context/Manager,您可以启动应用程序,会话将按照配置存储在 memcached 节点或 membase 中。现在您应该使用模拟 tomcat 故障、memcached 节点重新启动等进行一些测试。- 玩得开心!:-)
示例
tomcat加入jar包
D:\apache-tomcat-8.5.40\lib
asm-9.7.jar
flexjson-3.3.jar
jedis-3.0.0.jar
memcached-session-manager-tc8-2.3.2.jarmemcached-session-manager-2.3.2jar
项目 maven依赖
<dependency>
<groupId>de.javakaffee.msm</groupId>
<artifactId>msm-kryo-serializer</artifactId>
<version>1.9.7</version>
<scope>runtime</scope>
</dependency>
配置 memcached-session-manager 为 管理器
D:\apache-tomcat-8.5.40\conf\context.xml
<Context>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="redis://:123456@127.0.0.1:6379"
sticky="true"
sessionBackupAsync="false"
lockingMode="auto"
sessionBackupTimeout="5000"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>