精华内容
下载资源
问答
  • 主要介绍了Tomcat实现session共享,其实就是session 会话复制的相关方法,需要的朋友可以参考下
  • 包含tomcat做seesion所需要的全部jar包,asm、javolution、kryo、memcached-session、minglog、msm-javolution-serializer等
  • 1、为什么会提出这个问题?使用Nginx+Tomcat进行负载均衡时,希望使用轮询方式进行负载。但是如果使用轮询方式的话,可能会访问不同的...2、方案1:使用Tomcat内置的Session复制方案具体配置如下:<!-- 第1步...

    1、为什么会提出这个问题?

    使用Nginx+Tomcat进行负载均衡时,希望使用轮询方式进行负载。但是如果使用轮询方式的话,可能会访问不同的Tomcat,此时如果不进行Session共享,则相当于是一个新的Session。 就比如现有系统都是需要认证登录的系统,如果没有Session共享,则会导致用户退出登录。

    2、方案1:使用Tomcat内置的Session复制方案

    具体配置如下:

    <!-- 第1步:修改server.xml,在Host节点下添加如下Cluster节点 -->
    <!-- 用于Session复制 -->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
        <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" />
        <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" 
                        port="45564" frequency="500" dropTime="3000" />
            <!-- 这里如果启动出现异常,则可以尝试把address中的"auto"改为"localhost" -->
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" 
                      autoBind="100" selectorTimeout="5000" maxThreads="6" />
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor" />
        </Channel>
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="" />
        <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" />
        <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" 
                  deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false" />
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
    </Cluster>
    
    <!-- 第2步:在web.xml中添加如下节点 -->
    <!-- 用于Session复制 -->
    <distributable/>

    最终在Tomcat日志里可能会打印出如下日志信息:

    29-Mar-2018 15:06:22.181 INFO [localhost-startStop-1] org.apache.catalina.ha.session.DeltaManager.getAllClusterSessions Manager [/ydzwV3], requesting session state from org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 233}:4010,{192, 168, 1, 233},4010, alive=572778, securePort=-1, UDP Port=-1, id={-56 73 0 62 -31 -122 65 -50 -108 49 -1 -12 -84 -32 -7 -77 }, payload={}, command={}, domain={}, ]. This operation will timeout if no session state has been received within 60 seconds.
    29-Mar-2018 15:06:22.282 INFO [localhost-startStop-1] org.apache.catalina.ha.session.DeltaManager.waitForSendAllSessions Manager [/ydzwV3]; session state send at 3/29/18 3:06 PM received in 107 ms.

    3、方案2:使用第三方(个人)基于Tomcat实现的Session管理

    这里github上的tomcat-redis-session-manager来实现。
    具体配置方法,在上述站点中有详细说明。在此不再赘述。
    注意:这种方式还不支持Tomcat8。尽管有人基于上述代码进行了修改,但不能保证可用性。

    4、方案3:使用Spring Session实现

    Spring Session提供了多种方式来存储Session信息,包括redis、mongo、gemfire、hazelcast、jdbc等。这里用redis来举例说明,首先进行依赖添加,然后进行配置即可。

    4、1 添加依赖(gradle)

    compile "org.springframework.session:spring-session-data-redis:1.3.2.RELEASE"

    注意:当引入上述依赖包时,还会引入如下依赖:

    org.apache.commons:commons-pool2:2.4.2
    org.springframework.data:spring-data-redis:1.7.10.RELEASE
    org.springframework.session:spring-session:1.3.2.RELEASE
    redis.clients:jedis:2.8.1

    项目中原来使用了Redis作为Spring Cache的实现,当时使用的spring-data-redis是1.4.2.RELEASE版本,现在使用1.7.10.RELEASE版本后,需要把cacheManager这个Bean做如下调整:

    <!-- 调整前 -->
    <bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"
        c:template-ref="redisTemplate"/>
    
    <!-- 调整后 -->
    <bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager" 
        c:redisOperations-ref="redisTemplate">
    </bean>

    4、2 进行Spring Session配置

    <!-- 
        第1步:在Spring配置文件中添加如下bean 
        以后在web.xml中配置session超时时间就无效了,如果需要指定session超时时间,则使用maxInactiveIntervalInSeconds来指定,默认是1800s=30min
    -->
    <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" 
          p:maxInactiveIntervalInSeconds="1800"/> 
    ???  这里怎么没有Redis连接配置  ??? 请看RedisHttpSessionConfiguration类中的如下代码:
    // 这里会自动注入connectionFactory,而项目中已经注入了jedisConnectionFactory
    @Bean
    public RedisTemplate<Object, Object> sessionRedisTemplate(
        RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        if (this.defaultRedisSerializer != null) {
            template.setDefaultSerializer(this.defaultRedisSerializer);
        }
        template.setConnectionFactory(connectionFactory);
        return template;
    }

    项目中注入的jedisConnectionFactory Bean如下:

    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
        p:host-name="${redis.hostname}"
        p:port="${redis.port}"
        p:database="${redis.database}"
        p:poolConfig-ref="redispoolconfig"
        p:use-pool="${redis.usepool}">
    </bean>

    所以,如果你项目中从来没有使用过Redis,也可以使用如下配置:

    <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
    <!-- 
        Jdeis连接工厂Bean 
        注意:这种方式没有使用连接池,生产环境下务必需要使用连接池 
    -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
        p:host-name="192.168.1.233" p:port="6379" p:database="15" p:usePool="false">
    </bean>

    下面进行过滤器的配置:

    <!-- 第2步:在web.xml中添加如下过滤器 注意:此过滤器必须放在其他过滤器之前-->
    <filter>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    至此,就配置完成啦!
    在Redis中查看效果: 如果运行成功的话,可以在Redis中查看到key为spring:session:sessions的信息,如下所示:


    5、方案对比

    针对上述3中方案,以下仅是个人见解。
    方案1:使用Tomcat内置的Session复制方案
    SimpleTcpCluster
    优点:内置
    缺点:只适合Tomcat小集群,不适合大集群,因为session复制是all to all的方式
    方案2:使用第三方(个人)基于Tomcat实现的Session管理
    tomcat-session-manager
    优点:已经实现对tomcat7的支持
    缺点:第三方支持,支持力度不够,尤其是不能提供对Tomcat8的支持
    方案3:使用Spring Session实现
    基于redis存储实现
    优点:不依赖于特定容器,官方支持
    缺点:未发现

    所以,我认为还是Spring Session来实现Session共享更加好用。

    参考

    参考1:N个Tomcat之间实现Session共享( https://blog.csdn.net/wlwlwlwl015/article/details/48160433
    参考2:使用nginx搭建集群tomcat8,redis实现session共享,文件共享问题(https://blog.csdn.net/hua1586981/article/details/78132710
    参考3:使用tomcat-redis-session-manager实现session共享(https://blog.csdn.net/javandroid/article/details/52959105
    参考4:Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享(https://blog.csdn.net/u012702547/article/details/72991283?utm_source=tuicool&utm_medium=referral
    参考5:基于Spring XML配置的Spring Session Redis(https://docs.spring.io/spring-session/docs/current/reference/html5/guides/xml-redis.html
    参考6:Spring Session Data Redis 配置中遇到的坑(https://blog.csdn.net/ankeway/article/details/72961346
    参考7:Clustering/Session Replication HOW-TO(https://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html
    展开全文
  • 此压缩包为tomcat8利用redis实现session共享所需要的jar包,包含(commons-pool2-2.6.0.jar、jedis-2.9.0.jar、tomcat-redis-session-manager.jar)直接将三个jar包复制Tomcat目录lib下面,在修改conf下context.xml...
  • tomcat配置session共享

    千次阅读 2019-08-31 09:26:04
    tomcat官网 打开 tomcat 官网: ...找到对应的 Clustering 配置(因为配置session共享,就是配置集群),如下图 即,配置tomcat7集群的文档地址: http://tomcat.apache.org/tomcat-7.0-doc/cluste...

    tomcat官网

    打开 tomcat 官网: http://tomcat.apache.org/ , 找到需要配置的tomcat版本的文档,这里以 tomcat7 为例,

    1-选择tomcat7文档

    找到对应的 Clustering 配置(因为配置session共享,就是配置集群),如下图
    2-tomcat官网7的文档首页-cluster

    即,配置tomcat7集群的文档地址: http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

    配置session共享

    1.阅读官方文档

    3-tomcat7配置cluster文档

    如上图官方的文档中所说,只需配置 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 节点即可

    2.修改server.xml配置

    但其实在 tomcatconf/server.xml 的配置文件中,已经有此项配置,只是被注释了,只需将注释 打开 即可,如下图

    4-tomcat的server.xml文件cluster的配置

    3.准备测试环境

    此时,准备一个 tomcat ,如上打开 conf/server.xmlCluster 的节点配置,再准备一个简单的 javaWeb应用(打印 sessionId,做验证配置是否成功),放到 tomcatwebapps 目录下

    打印 sessionIdjsp 如下

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>session replication</title>
    </head>
    <body>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        SessionID:<%=session.getId() %>
    </body>
    </html>
    

    因为是在本地做验证,所以,再将以上配置完成的 tomcat 再复制一份,然后修改 tomcat 的端口,这里我两个 tomcat 的应用端口是 80818082,如下图所示

    5-两个tomcat的端口配置图片

    tomcatwebapps 目录,如下

    6-两个tomcat的web应用

    4.测试失败

    修改完成配置之后,分别启动 tomcat,打开浏览器测试之后,如下

    7-浏览器测试sessionId不一致

    测试发现,两个 tomcatsessionId 并不一致?!

    另外,还发现了一个问题,就是 来回刷新 浏览器的 两个tomcat的应用 的index.jsp,浏览器显示的 两个 sessionId 在不断的变化 ,但是这个问题跟配置 session共享 无关,是 cookie的作用域 导致的,后续再单独写一篇笔记讲。

    5.查漏补缺

    此时我们再返回 tomcat 官网配置 Cluster 的文档处,继续阅读,找到其中的 Cluster Basics 标签那,如下图所示,

    8-tomcat配置session共享需要完成的步骤

    文档中,说要配置 session复制 必须完成以下几步:

    • session 的所有 attributes 必须实现 java.io.Serializable (√)
    • 在 server.xml 的配置文件中,把 Cluster 的注释打开 (√)
    • 如果有自定义的集群 Valve(tomcat过滤器),就需要在 server.xml 的 Cluster 节点下配置 ReplicationValve (x,没有,不用管)
    • 如果集群的 tomcat实例 在同一台机器上,需要确保的你的 Receiver.port 不要有冲突,然后还顺道赞美了他家的 tomcat ,在大部分场景下能够自动检测4000-4100范围内的可用端口来,解决此问题 (√,默认配置就已经支持了)
    • 需要在 web应用 的 web.xml 文件中,配置 <distributable/> 节点 (x,这个没有配)
    • 如果集群用到了 mod_jk,就要在 server.xml 的 Engine 节点配置 jvmRoute 的属性,如<Engine name="Catalina" jvmRoute="node01" > 并且 jvmRoute 属性值与 workers.properties 中的 worker name 匹配 (x,没配,不用管)
    • 集群的所有节点,系统时间要一致,并与 NTP service 同步 (√,同一台机器)
    • 将负载均衡服务器(apache、nginx等),配置为粘性会话模式 (x,暂时没有配负载均衡,不用管)

    所以,意思就是,conf/server.xml 中配置了 Cluster 节点外,还需要在 web应用web.xml 文件里面配置 <distributable/> 节点,如下图所示

    9-web应用的web.xml文件配置distributable节点

    6.重新测试

    配置完成之后,重新启动两个 tomcat,重新刷新浏览器的页面,此时如下图所示,sessionId 已经一致,即 session共享 配置成功。

    10-浏览器测试sessionId一致

    探究

    1.Cluster 节点的默认配置是什么?

    上文在官网中截取的,配置 Cluster 节点的图,如下所示,

    3-tomcat7配置cluster文档

    图中最后提到的,The following is the default cluster configuration 如下配置,

    		<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                     channelSendOptions="8">
    
              <Manager className="org.apache.catalina.ha.session.DeltaManager"
                       expireSessionsOnShutdown="false"
                       notifyListenersOnReplication="true"/>
    
              <Channel className="org.apache.catalina.tribes.group.GroupChannel">
                <Membership className="org.apache.catalina.tribes.membership.McastService"
                            address="228.0.0.4"
                            port="45564"
                            frequency="500"
                            dropTime="3000"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                          address="auto"
                          port="4000"
                          autoBind="100"
                          selectorTimeout="5000"
                          maxThreads="6"/>
    
                <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                  <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
                </Sender>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
              </Channel>
    
              <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                     filter=""/>
              <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
    
              <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                        tempDir="/tmp/war-temp/"
                        deployDir="/tmp/war-deploy/"
                        watchDir="/tmp/war-listen/"
                        watchEnabled="false"/>
    
              <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
              <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
            </Cluster>
    

    即配置 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 与上面这一大段的配置内容,效果是一样的,但是这样一来,细粒度越小,可以调整的内容也就越多

    在上面的这么多配置中,需要注意的是,address="228.0.0.4" 这个地址为 组播地址,属于 ip地址 中的 D类地址

    11-Cluster完整默认配置的组播地址

    这个地址可以改,但是只能改为另一个组播地址。如果随便填一个非组播地址,tomcat启动的时候会报一个 Not a multicast address 的错误,这个报错来自 javajava.net.MulticastSocket,如下所示,

    12-net包报不是一个组播地址的错误

    在配置了 Cluster 节点之后,tomcat启动的过程中,会调用 org.apache.catalina.tribes.membership.McastServicestart() 方法,然后在方法中验证 address 的值是否是一个组播地址D类地址,它的第1个字节的前四位固定为 1110,即 ipv4 的地址的下限为 224.0.0.1

    13-Inet4Address的isMulticastAddress方法

    2.tomcat之间如何进行session复制的通信?

    tomcat 文档的最后,有讲到这个问题:

    当配置了 Cluster 节点的 tomcat 启动的时候,会创建 Host 对象,并用一个集群对象与之关联。启动过程中,到了解析 Context (即 web应用)的时候,如果 web应用web.xml 配置了 <distributable/> 的节点,则 Cluster 的对象会创建一个 manager 去管理 session复制。之后,Cluster 的对象将启动一个 membership 的服务(多播)和一个 replication 的服务(tcp单播)。下图是关于上述描述的 tomcat源码

    14-tomcat源码cluster创建manager管理session复制

    Tomcat 之间的 session replication 通信是使用简单的 多播ping 建立的。每个 Tomcat实例 将定期发出 多播ping,在 ping消息 中,会包含 Tomcat实例IPTCP侦听端口 去进行 与其他实例的 session复制。如果 Tomcat实例 在给定的时间范围内没有收到此类ping,则该成员被视为已死。

    Tomcat实例 收到 组播ping,该成员就会被添加到集群中,在下一个复制请求时,发送实例将通过集群的成员列表侦听的 ip和端口 信息(单播)建立 TCP Socket连接,进行 session复制

    组播传输:在发送者和每一接收者之间实现点对点网络连接,如果一台发送者同时给多个接收者传输相同的数据,也只需要复制一份的相同数据包,它提高了数据的传输效率。

    在因特网中的IP组播也是用组播组的概念,每个组都有一个特别分配的地址,要给该组发送的计算机将使用这个地址作为分组的目标地址。在IPv4中,这些地址在D类地址空间中分配,而IPv6也有一部分地址空间保留给组播组。

    需要注意的是,主机组播时仅发送一份数据,只有数据在传送路径出现分岔时才将分组复制后继续转发。

    15-单播与组播的比较

    即,Tomcat 启动时,发送 组播ping 建立集群的成员列表。在下一个 session复制 的请求时,根据集群成员列表的各成员侦听的 ip和端口,逐一建立 socket连接 ,进行 session复制

    展开全文
  • nginx+tomcat8+memcached session共享所需jar包 直接放到tomcat/lib下即可
  • tomcat的session共享

    2020-06-19 18:44:55
    那么在多个tomcat中session需要共享。 配置tomcat的session共享可以有三种解决方案: 第一种是以负载均衡服务器本身提供的session共享策略,每种服务器的配置是不一样的,并且nginx本身是没有的。这里不做探究。 ...

    转自:https://blog.csdn.net/weixin_33940102/article/details/85973141

    可通过下面方法限制一个用户访问一个服务器之后就只在该服务器上操作

      请求负载过程中会话信息不能丢失。那么在多个tomcat中session需要共享。

    配置tomcat的session共享可以有三种解决方案:

    第一种是以负载均衡服务器本身提供的session共享策略,每种服务器的配置是不一样的,并且nginx本身是没有的。这里不做探究。

    第二种是利用web容器本身的session共享策略来配置共享。

      针对于weblogic这种方式还是靠谱的。但是针对于tomcat这种方式存在很大的缺陷,主要因为是依靠广播方式来实现的session复制,会浪费很多带宽导致整个网络反应缓慢。官网也建议这种方式最好不要超过4台tomcat,具体的内容可参考/webapps/docs/cluster-howto.html里面有详细的说明。下面是具体的配置过程。

      最简单的方法是将server.xml里的该行内容注释取消,如下:

      使用这样方法配置的集群会将session同步到所在网段上的所有配置了集群属性的实例上(此处讲所在网段可能不准确,是使用Membership 的address和port来区分的。tomcat集群的实例如果在Membership配置中有相同的address和port值的tomcat被分到同一个集群里边。他们的session是相互共享的,同一个session的集群被称为一个cluster。可以配置多个cluster,但是cluster和cluster之间的session是不共享的)。也就是说如果该广播地址下的所有Tomcat实例都会共享Session,那么假如有几个互不相关的集群,就可能造成Session复制浪费,所以为了避免浪费就需要对节点多做点设置了,如下:

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  
                    channelSendOptions="8">  
      
             <Manager className="org.apache.catalina.ha.session.DeltaManager"  
                      expireSessionsOnShutdown="false"  
                      notifyListenersOnReplication="true"/>  
      
             <Channel className="org.apache.catalina.tribes.group.GroupChannel">  
               <Membership className="org.apache.catalina.tribes.membership.McastService"  
                           address="228.0.0.4"  
                           port="45564"  
                           frequency="500"  
                           dropTime="3000"/>  
               <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
                         address="auto"  
                         port="4000"  
                         autoBind="100"  
                         selectorTimeout="5000"  
                         maxThreads="6"/>  
      
               <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  
               <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  
               </Sender>  
               <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  
               <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>  
             </Channel>  
      
             <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
                    filter=""/>  
             <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>  
      
             <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"  
                       tempDir="/tmp/war-temp/"  
                       deployDir="/tmp/war-deploy/"  
                       watchDir="/tmp/war-listen/"  
                       watchEnabled="false"/>  
      
             <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>  
             <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>  
           </Cluster>  

    <Cluster>中加了一个<Channel>,里面包了个<Membership>,要关注的是<Membership>的port属性和address属性,不同的集群设置不同的port值或address值,从而保证session在不同集群之间的隔离。

      另外要注意,Make sure your web.xml has the <distributable/> element 。项目中的web.xml文件需要在节点中增加<distributable/>节点。

          

    第三种是Tomcat集群+redis的Session共享配置方法。

     可参考http://www.cnblogs.com/zhrxidian/p/5491285.html,后期会测试并整理。

    展开全文
  • 此压缩包为tomcat7利用memcache实现session共享所需要的jar包打包,直接将所有jar包复制到系统相应的目录就可以了,亲测jar包齐全可以成功搭建
  • 通过memcache实现tomcat7的session共享,目前生产环境用的不多了,但自己某个小需求用到,版本冲突好几次,分享给大家,这3个包复制tomcat的 lib目录下 还有两个包需要 maven引入自己的项目中 <!-- memcache ...
  • Tomcat集群Session共享

    2020-08-26 15:19:36
    Tomcat集群解决Session共享的方案: 1. 基于Cookie+Redis+Filter解决方案实现过程优缺点踩坑 2. Tomcat内置的Session复制方案实现过程优缺点 3. 使用Session粘滞方案实现形式优缺点 4. 基于Session持久化方案 5. ...
  • 本实例基于nginx+tomcat+redis的集群实现,实现session的复制。压缩包内含两个tomcat+一个nginx服务器+64位windows版的redis+说明文档,下载即可运行,详细步骤可以参考文档,从此告别集群盲区
  • 一、前言,目前解决session共享方案有很多,包括使用redis、cookie、jvm_route、以及nginx的第三方插件等,但最好的方案我推荐使用reids,这里我就使用tomcat复制写一个。 二、在需要复制的主机上的tomcat的...

    一、前言,目前解决session共享方案有很多,包括使用redis、cookie、jvm_route、以及nginx的第三方插件等,但最好的方案我推荐使用reids,这里我就使用tomcat的复制写一个。

    二、在需要复制的主机上的tomcat的server.xml的配置文件中添加如下内容

    <!-- 用于Session复制 -->
    	<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 
    			 channelSendOptions="8">
    			 
    		<Manager className="org.apache.catalina.ha.session.DeltaManager" 
    				 expireSessionsOnShutdown="false" 
    				 notifyListenersOnReplication="true" />
    				 
    		<Channel className="org.apache.catalina.tribes.group.GroupChannel">
    			<Membership className="org.apache.catalina.tribes.membership.McastService" 
    						address="228.0.0.4" 
                            port="45564" 
    						frequency="500" 
    						dropTime="3000" />
    		
    			<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
    					  address="auto" 
    					  port="4000" 
                          autoBind="100" 
    					  selectorTimeout="5000" 
    					  maxThreads="6" />
    					  
    			<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
    				<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
    			</Sender>
    			<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
    			<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor" />
    		</Channel>
    		
    		<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" 
    		       filter="" />
    		<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" />
    		<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" 
    		          tempDir="/tmp/war-temp/" 
                      deployDir="/tmp/war-deploy/" 
    				  watchDir="/tmp/war-listen/" 
    				  watchEnabled="false" />
    		<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
    	</Cluster>

    三、最后在项目的web.xml中加入如下配置

    最后配置完成后保存退出后启动即可,看到如图所示则表示配置成功

    此方法说的比较简洁,但都是实测,如果有问题可以随时讨论。

    展开全文
  • Tomcat实现集群的Session会话共享   Tomcat有提供自己实现会话共享的方式,这里也是主要介绍Tomcat提供了的实现。Tomcat官方提供的实现主要是中间件层的改动,不需要对项目已有的代码改动。对于实现Session共享...
  • 作者:蕃薯耀链接:www.cnblogs.com/fanshuyao一、Session共享使用tomcat-cluster-redis-session-manager插件实现插件地址见:...
  • tomcat7session共享依赖

    2019-05-08 11:09:26
    tomcat 7 session共享 依赖包 以及操作步骤 1.将jar包复制tomcat lib 文件夹下 2.覆盖tomcat conf 目录下 context.xml文件 3.启动tomcat
  • nginx+tomcat:Session共享

    2019-02-27 21:44:32
    [root@server1 ~]# ls nginx-1.10.1.tar.gz test.jsp [root@server1 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/ ...[root@server1 ~]# scp test.jsp root@172.25.55.2:/usr/local/tomcat/webapps/...
  • Tomcat集群session共享方式

    千次阅读 2018-09-17 17:32:04
    第一种方式:nginx配置 ip_hash轮询机制实现,这个实现方式简单,但是有很大的局限性,同一...万一出现这种情况,session就会丢失,分配到的新tomcat并没有它在前一个tomcat里的session,所有,这并不是session共享...
  • Tomcat8.5 分布式session共享配置wind环境准备正文tomcat准备nginx准备 wind环境准备 1.jdk1.8 2.tomcat8.5.59,复制成两个以下用名:tomcat1、tomcat2 替代 3.nginx1.16 正文 tomcat准备 分别修改tomcat1、tomcat2...
  • CentOS7下Nginx+Tomcat负载均衡及Redis共享Session解决方案
  • tomcat集群session共享

    2019-09-12 11:34:08
    所以要实现tomcat集群的session的共享,从而实现高可用。 了解到的三种实现方式: 在nginx的upstream中加入ip_hash(这种不是session共享,个人理解是种取巧的方式,而且在一侧服务器宕机后,就会丢失登陆状态。...
  • 通过memcache实现tomcat7的session共享,目前生产环境用的不多了,但自己某个小需求用到,版本冲突好几次,分享给大家,说明需要把jar包复制tomcat下面的lib目录
  • tomcat服务器session共享

    2021-09-09 08:44:55
    tomcat服务器session共享 1.进入Tomcat官网:https://tomcat.apache.org/ 复制所有这块所有内容 2.将复制的内容分别粘贴到两个Tomcat的server.xml中 3.修改项目的web.xml,添加标签
  • nginx集群tomcat,session共享问题

    万次阅读 多人点赞 2018-08-03 16:40:55
    上一篇中,nginx实现了tomcat集群,但是其实集群还有很多问题,比如session共享问题。简单来说就是通过负载均衡之后,用户第一次请求的tomcat和第二次请求的tomcat基本不是同一个,但是你在第一次请求放在session中...
  • Tomcat集群Session共享的几个方案

    千次阅读 2019-02-16 10:12:45
    Tomcat集群Session共享的几个解决方案 问题由来 当我们的业务使用单个Tomcat不足以支持访问请求的时候,需要引入Tomcat集群。而每个Tomcat的Session是不互通的,如果用户的请求落入到不同的Tomcat中,用户需要频繁的...
  • nginx+tomcat负载均衡(含session共享

    千次阅读 2018-04-03 11:51:27
    0、基本信息Tomcat8.0.37、JDK1.7.0_79-b15、Nginx1.9.13、CentOS7.01、需要实现的效果需要实现的效果(单台服务器):1、使用Nginx实现负载均衡2、使用多个Tomcat作为应用服务器3、静态资源从Tomcat中分离Nginx端口...
  • 一、集群部署主要问题: ...二、使用tomcat-redis-session-manager实现session共享 1、从GitHub上获取tomcat-redis-session-manager源码https://github.com/jcoleman/tomcat-redis-session-mana...
  • b、放开几个tomcat配置文件server.xml中cluster集群的配置 c、分别启动tomcat 2)结果,集群无法连接上 No members active in cluster group. 3)工程配置和tomcat配置如附件 4)问题待解决,...
  • 模拟环境:linux安装docker,然后分别新建jax-tomcat1、jax-tomcat2、jax-redis容器,实现tomcat1和tomcat2可以共享session,既在jax-tomcat1程序里登陆之后,在jax-tomcat2里面实现免登录。并且准备一个charge.war的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,978
精华内容 12,791
关键字:

tomcat复制共享