分布式session
在传统的单体应用中,后台只需要根据session获取用户身份的和信息既可。在集群中也只需要将用户的请求通过一种hash算法均匀的映射到多台服务器(且每次都映射到同一台服务器)既可,。而在分布式的应用中如何处理session呢?
一个分布式的应用是由多个模块构成,模块可能不在一个服务器上,一个模块可能也部署了集群,如何保证集群+分布式应用上的session可用呢。
策略一:粘性session
粘性session就是将用户的请求绑定到一台服务器上。
实现过程:
- 负载均衡服务器将用户的请求通过哈希算法均匀的映射到服务器上。
- 以后每次该用户的请求都会被负载均衡服务器转发到这个服务器上。
- 这样用户的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共享。
- 在两个模块中都引入SpringSession依赖
1 | <dependency> |
- application.yml配置session用redis保存
1 | spring: session: |
- 启动类加
@EnableRedisHttpSession
注解
策略四:session持久化
创建一个数据库存储session。