前言
在分布式系统中,为了提升系统性能,通常会对单体项目进行拆分,分解成多个基于功能的微服务,如果有条件,可能还会对单个微服务进行水平扩展,保证服务高可用。
那么问题来了,如果使用传统管理 Session 的方式,我们会遇到什么样的问题?
案例
这里拿下单举例,用户小明在天猫上相中了一个的娃娃,觉得不错,果断购买,选尺寸,挑身高,然后确认选择,赶紧提交订单,然后就跳转到了登录页面!小明表示很郁闷,大写的问号???
方案
HttpSession 默认使用内存来管理 Session,通常服务端把用户信息存储到各自的 Jvm 内存中。所以小明下单的时候找不到登录信息,那么我么何不把用户信息集中存储!?
为了测试效果,这里我们搭建一个演示案例,项目涉及 SpringBoot、spring-session、redis、nginx 等相关组件。
pom.xml引入依赖:
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
配置 redis 参数,软件自行安装:
## redis #session存储类型 spring.session.store-type=redis spring.redis.database=0 spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password=123456 spring.redis.pool.max-active=8 spring.redis.pool.max-wait=-1 spring.redis.pool.max-idle=8 spring.redis.pool.min-idle=0 spring.redis.timeout=3000
简单的用户登录实现,省略部分代码:
@RequestMapping(value="login",method=RequestMethod.POST) public Result login(String username,String password,HttpServletRequest request,HttpServletResponse response) throws Exception { SysUser user = userService.getUser(username); if(user==null) { return Result.error("用户不存在"); }else { if(user.getPassword().equals(password)) { request.getSession().setAttribute("user", user); return Result.ok(); }else { return Result.error("密码错误"); } } }
配置代理实现,基于 Nginx:
server { listen 80; server_name blog.52itstyle.vip; location / { proxy_pass http://192.168.1.2:8080; } location /cart { proxy_pass http://192.168.1.3:8080$request_uri; } location /order { proxy_pass http://192.168.1.4:8080$request_uri; } }
配置成功后登录系统,在 redis 中查询用户信息:
127.0.0.1:6379> keys * 1) "spring:session:expirations:1562577660000" 2) "spring:session:sessions:1076c2bd-95b1-4f23-abd4-ab3780e32f6f" 3) "spring:session:sessions:expires:1076c2bd-95b1-4f23-abd4-ab3780e32f6f"
小结
这样,小明就可以开心的买娃娃了!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍详解springboot中redis的使用和分布式session共享问题,包括了详解springboot中redis的使用和分布式session共享问题的使用技巧和注意事项,需要的朋友参考一下 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash、轮训、根据权重、随机等。不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,T
本文向大家介绍详解SpringBoot开发案例之整合Dubbo分布式服务,包括了详解SpringBoot开发案例之整合Dubbo分布式服务的使用技巧和注意事项,需要的朋友参考一下 前言 在 SpringBoot 很火热的时候,阿里巴巴的分布式框架 Dubbo 不知是处于什么考虑,在停更N年之后终于进行维护了。在之前的微服务中,使用的是当当维护的版本 Dubbox,整合方式也是使用的 xml 配置方
有人有一个如何使用infinispan目录提供程序配置节点集群以共享索引的工作示例吗?Infinispan上的所有留档(留档严重缺乏btw)意味着它应该像设置一些属性一样简单,但无论我如何尝试,我都无法让它工作。集群中的节点彼此找到很好,我可以在一个节点上进行操作并获取放在另一个节点上的对象。但是一旦我进行查询(使用索引),它就开始失败。 我的infinispan配置: 我没有找到一个包含共享索引
本文向大家介绍springboot 打包部署 共享依赖包(分布式开发集中式部署微服务),包括了springboot 打包部署 共享依赖包(分布式开发集中式部署微服务)的使用技巧和注意事项,需要的朋友参考一下 1、此文初衷 平常我们在进行微服务开发完毕后,单个微服务理应部署单个虚机上(docker也可),然后服务集中发布到服务注册中心上,但是有些小的项目,这样做未免太过繁杂增加了部署难度,这里主要讲
集群策略插件化 分布式集群策略采用插件的方式实现,通过SPI的形式发布,通过配置文件激活。 zookeeper分布式策略
问题内容: 我的任务是为可大规模扩展的分布式共享内存(DSM)应用程序构建原型。原型仅用作概念验证,但我想通过选择稍后在实际解决方案中使用的组件来最有效地利用我的时间。 该解决方案的目的是获取来自外部源的数据输入,将其搅动并使结果可用于许多前端。这些“前端”将仅从缓存中获取数据并提供服务,而无需额外的处理。该数据的前端命中量实际上可以是每秒数百万。 数据本身非常不稳定。它可以(并且确实)快速变化。