集群session共享机制

标签: 集群 session 共享 | 发表时间:2015-04-06 12:16 | 作者:lp895876294
出处:http://www.iteye.com

        现在集群中使用的Session共享机制有两种,分别是session复制和session粘性。

  • Session复制

       该种方式下,负载均衡器会根据各个node的状态,把每个request进行分发,使用这样的测试,必须在多个node之间复制用户的session,实时保持整个集群中用户的状态同步。其中jboss的实现原理是使用拦截器,根据用户的同步策略拦截request,做完同步处理后再交给server产生响应。

       优点:session不会被绑定到具体的node,只要有一个node存活,用户状态就不会丢失,集群能够正常工作。

       缺点:node之间通信频繁,响应速度有影响,高并发情况下性能下降比较厉害。

  • Session粘性

       该种方式下,当用户发出第一个request后,负载均衡器动态的把该用户分配至到某个节点,并记录该节点的jvm路由,以后该用户的所有的request都会绑定到这个jvm路由,用户只会和该server交互。

       优点:响应速度快,多个节点之间无需通信

       缺点:某个node死掉之后,它负责的所有用户都会丢失session。

改进:servlet容器在新建、更新或维护session时,向其它no de推送修改信息。这种方式在高并发情况下同样会影响效率。

       以上这两种方式都需要负载均衡器和Servlet容器的支持,在部署时需要单独配置负载均衡器和Servelt容器。 

  • 基于分布式缓存的session共享机制

       将会话Session统一存储在分布式缓存中,并使用Cookie保持客户端和服务端的联系,每一次会话开始就生成一个GUID作为SessionID,保存在客户端的Cookie中,在服务端通过SessionID向分布式缓存中获取session。

       实现思路:通过一个Filter过滤所有的request请求,在Filter创建request和session的代理,通过代理使用分布式缓存对session进行操作。这样实现对现有应用中对request对象的操作透明。 

  • 使用spring实现:

引入spring-session和redis依赖:

<dependency>
		    <groupId>org.springframework.session</groupId>
		    <artifactId>spring-session-data-redis</artifactId>
		</dependency>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
        </dependency>

 

 

1.创建redis连接工厂

public class RedisConfig {
	
	private String host = null ;
	
	private Integer port = null ;
	/**
	 * redis连接工厂
	 * @return
	 */
	@Bean
	public JedisConnectionFactory connectionFactory(Environment environment){
		//获取redis主机和port
		this.host = environment.getRequiredProperty("redis.host") ;
		//默认端口号为6379
		this.port = environment.getProperty("redis.port", Integer.class, 6379) ;
		
		JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory() ;
		jedisConnectionFactory.setHostName(host);
		jedisConnectionFactory.setPort(port);
		
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig() ;
		jedisPoolConfig.setMinIdle(1);
		jedisPoolConfig.setMaxTotal(10);
		//最长等待10s
		jedisPoolConfig.setMaxWaitMillis(10000);
		jedisPoolConfig.setTestOnBorrow(true);
		
		jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
		
		return jedisConnectionFactory ;
	}
	
	@Bean
	public StringRedisTemplate redisTemplate(RedisConnectionFactory connectionFactory){
		StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(connectionFactory) ;
		
		return stringRedisTemplate ;
	}

}

 2.引入RedisHttpSessionConfiguration.class。通过java-config引入或在xml中引入,因为要实现零XML配置,所以使用java-config引入。

/**
 *基于redis的session共享配置
 */
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=Constants.SESSION_TIMEOUT)
public class SessionRedisConfig {

}

 3.创建HttpSessionApplicationInitializer,继承AbstractHttpSessionApplicationInitializer,HttpSessionApplicationInitializer不需要重载或实现任何方法,这个类只是一个使用Redis存储Session的一个标示类。在Servlet容器初始化时,会通过编码的方式添加一个Filter,通过WebApplicationContext查找名为springSessionRepositoryFilter的Filter类对request、response和session进行包装。

 

AbstractHttpSessionApplicationInitializer实现了WebApplicationInitializer接口。在Servlet3.0规范中,会自动扫描配置的ServletContainerInitializer的实现类,在实现类中可以配置需要处理的类。如下是SpringServletContainerInitializer,在启动时会自动寻找所有的WebApplicationInitializer实现类。

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
	......
}

 关于Servlet3.0规范,参考附件Servlet3.1规范(最终版)。

 

说明:

  • @EnableRedisHttpSession引入了RedisHttpSessionConfiguration.class,主要进行了如下配置:
    //获取EnableRedisHttpSession中maxInactiveIntervalInSeconds,即session检测的最大时间间隔
    public void setImportMetadata(AnnotationMetadata importMetadata){}
    //通过spring容器中的connectionFactory创建RedisTemplate
    public RedisTemplate<String,ExpiringSession> sessionRedisTemplate(RedisConnectionFactory connectionFactory) {}
    //创建对session操作的工厂
    public RedisOperationsSessionRepository sessionRepository(RedisTemplate<String, ExpiringSession> sessionRedisTemplate) {}
    //创建filter,真正包装request、response和session对象的类。其中httpSessionStrategy默认使用的是CookieHttpSessionStrategy,即将session ID存储在cookie中,每次请求时由Cookie中获取session id
    public <S extends ExpiringSession> SessionRepositoryFilter<? extends ExpiringSession> springSessionRepositoryFilter(SessionRepository<S> sessionRepository) {}
    
     

 





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [集群 session 共享] 推荐:

tomcat集群(共享session)

- - 研发管理 - ITeye博客
其实就是上述这样的一个架构,下面是原理. 1)  Apache装有一个模块,这个模块叫mod_jk. 2)  Apache通过80端口负责解析任何静态web内容. 3)  任何不能解析的内容,用表达式告诉mod_jk,让mod_jk派发给相关的app server去解释. 通过上述的文字描述我们可以得知:.

集群session共享机制

- - 企业架构 - ITeye博客
        现在集群中使用的Session共享机制有两种,分别是session复制和session粘性.        该种方式下,负载均衡器会根据各个node的状态,把每个request进行分发,使用这样的测试,必须在多个node之间复制用户的session,实时保持整个集群中用户的状态同步.

Nginx+Tomcat+Memcached共享session集群配置

- ENOCH - ITeye论坛最新讨论
2、memcached共享session. 3、tomcat集群配置(3台CentOS 6). (172.18.188.64): 操作系统CentOS 6; 安装nginx、memcached和tomcat 6. (172.18.188.76): 操作系统CentOS 6; 安装tomcat 6. (172.18.188.78): 操作系统CentOS 6; 安装tomcat 6.

Tomcat7集群共享Session 基于redis进行统一管理

- - 行业应用 - ITeye博客
      很多时候,生产环境,需要多个tomcat协作,那么session的统一管理是一个首先需要解决的问题. session的统一管理有很多解决方案,比如存储至数据库、memcache、redis. 那么我想给大家介绍的是将session存储至redis这个方案.        先要感谢开源项目 tomcat-redis-session-manager,感谢作者.

Apache负载均衡实战-session共享

- - 企业架构 - ITeye博客
              含Session共享. 下载Apache、tomcat.     2个或者多个tomcat. 将此文件添加到目录F:\Apache24\modules. 1 修改Apache conf目录下的httpd.conf. 2 新建mod_jk.conf文件. 在目录F:\Apache24\conf下添加文件,内容如下:.

spring boot + redis 实现session共享

- - 编程语言 - ITeye博客
这次带来的是spring boot + redis 实现session共享的教程. 在spring boot的文档中,告诉我们添加@EnableRedisHttpSession来开启spring session支持,配置如下:. 而@EnableRedisHttpSession这个注解是由spring-session-data-redis提供的,所以在pom.xml文件中添加: .

nginx+tomcat+redis完成session共享

- - 企业架构 - ITeye博客
本文记录nginx+redis+tomcat实现session共享的过程. nginx安装: http://blog.csdn.net/grhlove123/article/details/47834673. redis安装: http://blog.csdn.net/grhlove123/article/details/47783471.

[原]Redis共享Session原理及示例

- - moxiaomomo的专栏
Redis共享session的作用. 微服务自身可以保持无状态,应用实例数量的多少不会影响用户登录状态;. 可实现单点登录的踢出功能,如可以让上次异地登录的用户下线;. session在多个服务或服务器间共享,实现多站点单点登录(参考SSO服务). Redis缓存session原理简述. 其工作原理,可简单用图描述(假设服务A运行有有个多个实例):.

web应用集群Session保持(转)

- - 企业架构 - ITeye博客
关于使用 memcached 或redis 存储 session ,以及使用 terracotta 服务器共享. 建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单个对象比较大,而且数据类型丰富,. 不只是缓存 session,还可以做其他用途,一举几得啊. 1、使用 filter 方法存储.

Apache+Tomcat+Memcached共享Session的构架设计

- - CSDN博客架构设计推荐文章
一、       方案目标. 实现互动留言系统、后台发布系统的高可用性,有效解决高并发量对单台应用服务器的冲击,确保应用服务器单点故障不影响系统正常运行. 二、       部署架构. 采取Tomcat集群的部署方式,Apache通过proxy_module代理方式对用户的请求进行负载均衡,转发至tomcat集群中的某一实例进行处理,tomcat集群之间通过Memcached高性能缓存集群共享持久Session.