分布式session

分布式session

在传统的单体应用中,后台只需要根据session获取用户身份的和信息既可。在集群中也只需要将用户的请求通过一种hash算法均匀的映射到多台服务器(且每次都映射到同一台服务器)既可,。而在分布式的应用中如何处理session呢?

一个分布式的应用是由多个模块构成,模块可能不在一个服务器上,一个模块可能也部署了集群,如何保证集群+分布式应用上的session可用呢。

策略一:粘性session

粘性session就是将用户的请求绑定到一台服务器上。

实现过程:

  1. 负载均衡服务器将用户的请求通过哈希算法均匀的映射到服务器上。
  2. 以后每次该用户的请求都会被负载均衡服务器转发到这个服务器上。
  3. 这样用户的session就会存储在一台服务器上。

策略二:session复制

session复制就是对session增删改之后会将session广播给其他模块以保证session同步。

策略三:session共享

通过redis、memcached共享session。

方案一:redis

对于session的分布式,就是模块之间的session共享,将session放入缓存就实现了session的共享。

可以通过redis实现:

1
redisTemplate.opsForValue().set("session", json);

其他模块读取缓存:

1
String json = redisTemplate.opsForValue().get("session");

方案二:SpringSession

Spring提供了SpringSession组件来解决模块之间的session共享。

  1. 在两个模块中都引入SpringSession依赖
1
2
3
4
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
  1. application.yml配置session用redis保存
1
2
spring:  session:
store-type: redis
  1. 启动类加@EnableRedisHttpSession注解

策略四:session持久化

创建一个数据库存储session。

评论