SpringBoot开发案例之分布式集群共享Session

前言

在分布式系统中,为了提升系统性能,通常会对单体项目进行拆分,分解成多个基于功能的微服务,如果有条件,可能还会对单个微服务进行水平扩展,保证服务高可用。
那么问题来了,如果使用传统管理 Session 的方式,我们会遇到什么样的问题?

案例

这里拿下单举例,用户小明在天猫上相中了一个的娃娃,觉得不错,果断购买,选尺寸,挑身高,然后确认选择,赶紧提交订单,然后就跳转到了登录页面!小明表示很郁闷,大写的问号?
  • 小明进入娃娃页面,此时请求通过代理服务发送到业务系统一。
  • 小明选尺寸,挑身高,此操作并没有对后端服务发送请求。
  • 小明提交订单,此时请求通过代理服务发送到业务系统二,然鹅,二系统此时并没有查询到小明的登录信息,就被无情的跳转到登录页了。

方案

SpringBoot开发案例之分布式集群共享Session
HttpSession 默认使用内存来管理 Session,通常服务端把用户信息存储到各自的 Jvm 内存中。所以小明下单的时候找不到登录信息,那么我么何不把用户信息集中存储!
为了测试效果,这里我们搭建一个演示案例,项目涉及 SpringBoot、spring-session、redis、nginx 等相关组件。
pom.xml引入依赖:
  1. <dependency>
  2. <groupId>org.springframework.session</groupId>
  3. <artifactId>spring-session-data-redis</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-data-redis</artifactId>
  8. </dependency>
配置 redis 参数,软件自行安装:
  1. ## redis
  2. #session存储类型
  3. spring.session.store-type=redis
  4. spring.redis.database=0
  5. spring.redis.host=127.0.0.1
  6. spring.redis.port=6379
  7. spring.redis.password=123456
  8. spring.redis.pool.max-active=8
  9. spring.redis.pool.max-wait=-1
  10. spring.redis.pool.max-idle=8
  11. spring.redis.pool.min-idle=0
  12. spring.redis.timeout=3000
简单的用户登录实现,省略部分代码:
  1. @RequestMapping(value="login",method=RequestMethod.POST)
  2. publicResult login(String username,String password,HttpServletRequest request,HttpServletResponse response) throwsException {
  3. SysUser user = userService.getUser(username);
  4. if(user==null) {
  5. returnResult.error("用户不存在");
  6. }else {
  7. if(user.getPassword().equals(password)) {
  8. request.getSession().setAttribute("user", user);
  9. returnResult.ok();
  10. }else {
  11. returnResult.error("密码错误");
  12. }
  13. }
  14. }
配置代理实现,基于 Nginx:
  1. server {
  2. listen 80;
  3. server_name blog.52itstyle.vip;
  4. location / {
  5. proxy_pass http://192.168.1.2:8080;
  6. }
  7. location /cart {
  8. proxy_pass http://192.168.1.3:8080$request_uri;
  9. }
  10. location /order {
  11. proxy_pass http://192.168.1.4:8080$request_uri;
  12. }
  13. }
配置成功后登录系统,在 redis 中查询用户信息:
  1. 127.0.0.1:6379> keys *
  2. 1) "spring:session:expirations:1562577660000"
  3. 2) "spring:session:sessions:1076c2bd-95b1-4f23-abd4-ab3780e32f6f"
  4. 3) "spring:session:sessions:expires:1076c2bd-95b1-4f23-abd4-ab3780e32f6f"

本站所有文章均来自互联网,如有侵权,请联系站长删除。极客文库 » SpringBoot开发案例之分布式集群共享Session
分享到:
赞(0)

评论抢沙发

评论前必须登录!