分布式Session

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 分布式Session


1、Session原理

服务器为了表示是哪个用户,在用户第一次登陆成功后将用户信息保存在session中,并且命令浏览器保存一个jsessionid = value的cookie,并且该浏览器每次访问想访问的服务的功能的时候都带着cookie,但是浏览器关闭后就会清楚cookie,下次访问的时候没有jsessionid就会再去重复步骤。

2、 分布式Session要解决的问题

在分布式情况下一般会使用一般的Session会造成两个问题:

  • 同一服务下,Session要复制多份,这样才能保证每个服务有相同的Session
  • 不同服务下,Session是有作用域的。
    解决方法:
  • session复制
  • cookie本地化
  • hash一致性:根据ip进行hash取余,将ip负载均衡到不同的服务器
  • 统一存储,将所有Session都统一放在redis中,进行统一管理,缺点:增加了网络成本 优点:保证了数据安全

3、 整合SpringSession解决分布式Session问题

引入依赖

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

加入配置

session:
  store-type: redis
  timeout: 30m

主启动类

@EnableRedisHttpSession
@Configuration
public class GulimallSessionConfig {
    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        //放大作用域
        cookieSerializer.setDomainName("gulimall.com");
        cookieSerializer.setCookieName("GULISESSION");
        return cookieSerializer;
    }
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
}

4、核心原理

  • 建立一个认证服务器,当其他服务需要登陆操作的时候就带着登陆后需要重定向的地址转发到认证服务器上进行登陆,登陆成功后设置一个uuid或者由ip、用户id等等随机生成的token,将token保存到cookie中,并将这个token和对应的用户信息以key-value的形式保存到redis中,并带着token重定向到指定url。
  • 需要登陆的服务器拿到认证中心返回来的token,将这个token也保存到cookie中,并向redis查询出对应的用户信息保存到自己的session或cookie中完成登陆。
  • 因为浏览器每次发送请求都会带着cookie去发送,因此在用户登陆成功后每次请求都带着token,所以可以通过服务器端建立一个filter来判断是哪个用户发送的请求。
  • 当其他未登录的模块需要登陆的时候,也转发请求带着回调地址发送给认证中心,如果认证中心cookie中有其他已登录模块存留的cookie那么认证中心就将这个token返回给该模块,该模块拿到后再根据token找redis拿用户数据,将token和数据存到自己的cookie或者session中,完成登陆。
  • 这样就实现了多个微服务之间的单点登陆的操作。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
存储 缓存 负载均衡
分布式系统Session一致性问题
分布式系统Session一致性问题
84 0
|
7月前
|
负载均衡 算法 NoSQL
聊聊分布式应用中负载均衡技术和Session一致性
聊聊分布式应用中负载均衡技术和Session一致性
81 0
|
负载均衡 算法 NoSQL
分布式系列教程(15) - 解决分布式Session一致性问题
分布式系列教程(15) - 解决分布式Session一致性问题
153 0
|
存储 缓存 NoSQL
Shiro 解决分布式 Session
在分布式系统中,会话管理是一个重要的问题。Shiro框架提供了一种解决方案,通过其会话管理组件来处理分布式会话。本文演示通过RedisSessionManager解决分布式会话问题。
107 0
|
存储 NoSQL Java
Spring Session分布式会话管理
Spring Session分布式会话管理
100 0
|
6月前
|
NoSQL Java 应用服务中间件
大厂面试必备:如何轻松实现分布式Session管理?
这篇文章介绍三种分布式Session的实现方案:基于JWT的Token、基于Tomcat的Redis和基于Spring的Redis。JWT方案通过生成Token存储用户信息,实现无状态、可扩展的会话管理,但可能增加请求负载且数据安全性较低。Tomcat与Redis结合,通过配置Tomcat和Redis,实现Session集中管理和高性能存储,但配置相对复杂。Spring整合Redis适用于SpringBoot和SpringCloud项目,集成方便,扩展性强,但同样依赖外部Redis服务。每种方法有其优缺点,适用场景不同。作者小米是一个技术爱好者,欢迎关注其微信公众号“软件求生”获取更多技术内容
263 4
|
2月前
|
存储 缓存 NoSQL
分布式架构下 Session 共享的方案
【10月更文挑战第15天】在实际应用中,需要根据具体的业务需求、系统架构和性能要求等因素,选择合适的 Session 共享方案。同时,还需要不断地进行优化和调整,以确保系统的稳定性和可靠性。
|
3月前
|
存储 NoSQL Java
使用springSession完成分布式session
本文介绍了如何使用 `spring-session` 实现分布式 Session 管理,并提供了将 Session 存储在 Redis 中的具体配置示例。通过配置相关依赖及 Spring 的配置文件,可以轻松实现 Session 的分布式存储。示例中详细展示了所需的 Maven 依赖、Spring 配置及过滤器配置,并给出了启动项目后在 Redis 中查看 Session 数据的方法。
|
4月前
|
存储 NoSQL Java
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这篇文章是关于Java面试中的分布式架构问题的笔记,包括分布式架构下的Session共享方案、RPC和RMI的理解、分布式ID生成方案、分布式锁解决方案以及分布式事务解决方案。
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
|
6月前
|
存储 缓存 算法
分布式Session共享解决方案
分布式Session共享解决方案
66 0