`
lp895876294
  • 浏览: 284900 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

集群session共享机制

    博客分类:
  • JAVA
 
阅读更多

        现在集群中使用的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) {} 
  • Shiro由于是适用于B/S模式和非B/S模式的安全框架,为了兼容不同环境下Session,Shiro封装了自己的Session接口。在B/S模式下,经过Shiro过滤后,HttpServletRequest、HttpSession就会经过shiro的重新封装,但是封装的过程起始就是代理的过程,操作的具体类实际上还是发送请求的对象。所以,项目中如果集成了Spring-Session,在shiro中对Session的操作实际上还是对Spring封装Session的操作。 B/S模式下Shiro创建的DefaultWebSecurityManager在构造方法中实例化的SessionManager是ServletContainerSessionManager;org.apache.shiro.web.session.HttpServletSession是javax.servlet.http.HttpSession的代理。
public DefaultWebSecurityManager() {
        super();
        ((DefaultSubjectDAO) this.subjectDAO).setSessionStorageEvaluator(new DefaultWebSessionStorageEvaluator());
        this.sessionMode = HTTP_SESSION_MODE;
        setSubjectFactory(new DefaultWebSubjectFactory());
        setRememberMeManager(new CookieRememberMeManager());
        setSessionManager(new ServletContainerSessionManager());
    }
  •  shiro也提供了禁止其新创建Session的属性,即org.apache.shiro.subject.support.SESSION_CREATION_ENABLED,在shiro Filter执行之前通过其它Filter为request设置这个属性即可。参考如下:
@Service
public class DisableShiroSessionFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		//禁止shiro创建session
		request.setAttribute(DefaultSubjectContext.SESSION_CREATION_ENABLED, false);
		chain.doFilter(request, response);
	}
	@Override
	public void destroy() {
	}

}
 
参考地址:https://github.com/spring-projects/spring-session

 

分享到:
评论
1 楼 yin_bp 2017-06-24  
可以看看bboss session,支持集群session共享和不同域名之间的session共享(支持不同根域名和不同子域名两种情况下的session共享),还提供强大的可视化session管理(session数据查看、剔除session记录等)和监控统计功能哦:

https://www.oschina.net/p/bboss-session

相关推荐

    tomcat集群session共享

    综上所述,实现Tomcat集群session共享主要涉及Tomcat的session管理机制、Redis的集成以及相应的配置和优化。通过合理配置,可以确保在高并发环境下提供无缝的用户体验,同时提升系统的可扩展性和可靠性。

    tomcat8集群实现session共享,内含session共享包

    在这个场景中,我们关注的是如何在Tomcat集群环境中实现Session共享,以便提高应用程序的可扩展性和可用性。标题和描述提到的“session共享包”是解决这一问题的关键。 **什么是Session?** 在Web应用中,Session是...

    tomcat7+redis集群 session共享jar

    通过这种方式,"tomcat7+redis集群 session共享jar"可以帮助开发者解决在Tomcat7集群中Session共享的问题,提升系统的可扩展性和可用性。在大型网站和分布式应用中,这样的解决方案能够保证用户在不同服务器之间切换...

    tomcat8集群session共享(redis处理)

    "Tomcat8集群session共享(redis处理)"的主题正是针对这一问题,通过集成Redis作为分布式缓存来解决。下面我们将详细探讨这个过程。 首先,我们需要理解Session的概念。Session是在Web应用中用于跟踪用户状态的一...

    基于redis的集群session共享jar包

    为了解决这个问题,我们可以利用Redis来实现基于集群的session共享,这就是“基于redis的集群session共享jar包”所涉及的核心内容。 Redis是一个高性能的键值数据库,特别适合用来做缓存和数据共享。将session存储...

    tomcat集群session共享jar(三个)

    这里的“tomcat集群session共享jar(三个)”指的是实现Tomcat集群间session共享所需的一些关键组件或者库。虽然提供的文件名称列表中只有一个`tomcat-redis-session-manager`,但通常实现session共享可能会涉及多个...

    nginx tomcat memcached 集群 session共享

    这里我们讨论的主题是如何通过Nginx、Tomcat和Memcached来实现集群环境下的session共享。Nginx作为反向代理服务器,负责负载均衡,Tomcat作为应用服务器运行Java Web应用程序,而Memcached则作为分布式内存缓存系统...

    redis+tomcat集群配置session共享

    在分布式系统中,Session共享是一个重要的议题,尤其是在使用Redis与Tomcat构建的集群环境中。当用户在集群中的任一节点登录后,其Session信息需要在其他节点也能访问,以实现会话持久化,保证用户体验的一致性。本...

    tomcat8+redis集群 session共享jar

    我们将深入探讨涉及的三个关键组件:Tomcat 8、Redis集群以及session共享机制。 首先,让我们了解Tomcat 8。Tomcat是Apache软件基金会的一个开源项目,它是一个轻量级的Java Servlet容器,支持Servlet和JSP标准。...

    集群redis实现session共享jar包之tomcat8

    本篇文章将深入探讨在Tomcat 8中通过`集群redis`实现session共享的方法。 一、session共享的重要性 在Web应用中,session是服务器端用来存储用户状态的一种机制,比如用户的登录信息、购物车内容等。在单台服务器...

    分布式集群Session共享 简单多tomcat8+redis的session共享实现

    分布式集群中的Session共享是现代Web应用在扩展性和高可用性方面必须解决的关键问题。随着互联网应用的复杂性和用户量的增长,单个服务器往往无法满足需求,因此采用分布式部署的模式,比如多台Tomcat服务器组成的...

    Tomcat集群Session共享

    以下是几种常见的Tomcat集群Session共享方案,包括其实现过程、优缺点和可能遇到的问题。 1. **基于Cookie+Redis+Filter解决方案** - 实现过程:用户登录后,将Session ID与用户信息存入Redis,并在客户端设置一个...

    tomcat7集群实现session共享

    当我们谈论“Tomcat7集群实现session共享”时,我们关注的是如何在多个Tomcat实例之间有效地同步用户会话信息,以便在集群环境中提供高可用性和负载均衡。 首先,理解session共享的重要性。在Web应用中,session是...

    nginx+tomcat+redis服务器集群session共享

    在构建大型分布式应用时,服务器集群的session共享是至关重要的,因为这关乎到用户状态的一致性和用户体验。本文将深入探讨如何使用nginx、tomcat和redis来实现这一目标。 首先,我们来理解这三个组件的基本角色: ...

    tomcat7 集群通过redis共享session 所需jar包

    2. **Session共享**:Session是Web应用程序中用来跟踪用户状态的一种机制。在单个服务器上,Session数据存储在服务器内存中。但在集群中,每个服务器都有自己的内存空间,如果不进行特殊处理,不同服务器无法访问...

    Nginx+Tomcat7+Memcached集群Session共享

    Nginx+Tomcat7+Memcached集群Session共享 完整例子 主要是利用memcached-session-manager(下面简称msm)开源tomcat插件改变tomcat原始的session存储机制,将session的存储放到分布式缓存memcache中,从而实现对...

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    这通常涉及到服务器集群的部署,其中Session共享是一个核心问题。本篇文章将探讨如何利用Redis、Tomcat和Nginx来实现Session共享,以便在分布式环境中保持用户状态的一致性。 首先,让我们了解一下Session的概念。...

    Tomcat8(Tomcat9)+redis实现Session共享(支持Redis集群)

    本教程将详细介绍如何利用Tomcat 8或9以及Redis实现Session共享,支持Redis集群,以提高系统的可伸缩性和数据一致性。 首先,我们需要理解Session的概念。Session是服务器端用于存储用户状态的一种机制,通常在用户...

    PHP实现多服务器session共享之memcache共享.rar

    在网站开发过程中,尤其是涉及到大型分布式系统时,session共享成为一个重要的技术挑战。"PHP实现多服务器session共享之memcache共享"的主题着重于如何在多台服务器之间有效地存储和同步用户的session数据,以确保...

Global site tag (gtag.js) - Google Analytics