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

 更新时间:2019年07月16日 14:40:21   作者:小柒  
这篇文章主要介绍了SpringBoot开发案例 分布式集群共享Session详解,在分布式系统中,为了提升系统性能,通常会对单体项目进行拆分,分解成多个基于功能的微服务,可能还会对单个微服务进行水平扩展,保证服务高可用,需要的朋友可以参考下

前言

在分布式系统中,为了提升系统性能,通常会对单体项目进行拆分,分解成多个基于功能的微服务,如果有条件,可能还会对单个微服务进行水平扩展,保证服务高可用。

那么问题来了,如果使用传统管理 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"

小结

这样,小明就可以开心的买娃娃了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java、Javascript、Javaweb三者的区别及说明

    Java、Javascript、Javaweb三者的区别及说明

    这篇文章主要介绍了Java、Javascript、Javaweb三者的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • log4j2 项目日志组件的实例代码

    log4j2 项目日志组件的实例代码

    下面小编就为大家分享一篇log4j2 项目日志组件的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Java中的Lambda表达式详解

    Java中的Lambda表达式详解

    这篇文章主要介绍了Java中的Lambda表达式详解,Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构,需要的朋友可以参考下
    2024-01-01
  • Java多线程+锁机制实现简单模拟抢票的项目实践

    Java多线程+锁机制实现简单模拟抢票的项目实践

    锁是一种同步机制,用于控制对共享资源的访问,在线程获取到锁对象后,可以执行抢票操作,本文主要介绍了Java多线程+锁机制实现简单模拟抢票的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • BeanUtils.copyProperties()所有的空值不复制问题

    BeanUtils.copyProperties()所有的空值不复制问题

    这篇文章主要介绍了BeanUtils.copyProperties()所有的空值不复制问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Web容器启动过程中如何执行Java类

    Web容器启动过程中如何执行Java类

    这篇文章主要介绍了Web容器启动过程中如何执行Java类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java实现SHA1加密代码实例

    Java实现SHA1加密代码实例

    这篇文章给大家分享了Java实现SHA1加密的相关实例代码,有兴趣的朋友可以测试参考下。
    2018-07-07
  • Java中static变量能继承吗

    Java中static变量能继承吗

    这篇文章主要介绍了Java中static变量能继承,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 关于Gateway网关中配置跨域的三种方案

    关于Gateway网关中配置跨域的三种方案

    文章总结:介绍了三种处理跨域请求的方法:在Controller类上添加注解、通过配置类实现重写WebMvcConfigurer接口和在配置文件中统一设置,希望这些方法能帮助读者解决跨域问题
    2024-11-11
  • Java简单实现猜数字游戏附C语言版本

    Java简单实现猜数字游戏附C语言版本

    猜数字是兴起于英国的益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩。游戏规则为一方出数字,一方猜,今天我们来用Java和C语言分别把这个小游戏写出来练练手
    2021-11-11

最新评论