用Tomcat内置的Session复制方案实现Tomcat集群Session共享
实现过程
第1步
修改tomcat的server.xml文件,在 节点下,添加以下内容:
<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<ManagerclassName="org.apache.catalina.ha.session.DeltaManager"expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
<ChannelclassName="org.apache.catalina.tribes.group.GroupChannel">
<MembershipclassName="org.apache.catalina.tribes.membership.McastService"address="228.0.0.4"
port="45564"frequency="500" dropTime="3000" />
<!-- 这里如果启动出现异常,则可以尝试把address中的"auto"改为"localhost" -->
<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"address="auto" port="4000"
autoBind="100"selectorTimeout="5000" maxThreads="6" />
<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"watchDir="/tmp/war-listen/" watchEnabled="false" />
<ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
1234567891011121314151617181920
第2步
在项目的web.xml中添加如下节点:
<distributable/>
优缺点
优点
Java代码上不需要做任何修改
缺点
依赖应用服务器容器,这里是Tomcat,其他的容器是使用不了的;
适合小集群,不适合大集群,因为Session的复制是 all toall的,每个Tomcat都会存储其他的Session,会造成很大的资源浪费;
在高并发的情况下延迟较为严重且占用网络资源。