springboot集成springsession如何实现分布式session共享

 更新时间:2023年09月21日 09:15:30   作者:爱琴孩  
这篇文章主要介绍了springboot集成springsession如何实现分布式session共享问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

现在随着分布式,微服务架构的日益成熟,越来越多的企业将传统的单体服务改造成微服务或者分布式架构。

当然不是说单体服务现在是百无一用,只能说没有最好的,只要适合就好。

在分布式服务改造中,大家都遇到过一个问题,那就是分布式session管理。

之前的单体服务session是保存在容器的内存中的。

微服务架构中一个服务为了实现高可用都是至少3个点部署,这样就遇到一个问题,就是这个部署在不同服务器上的三个点如何实现共享session呢?

其实解决方案是很多的,原理也是差不多的。比如说我们现在项目就是将session保存在数据库中,这样三个点都去读取数据库来实现session共享。

还有的方案就是大家比较熟悉的将session存储在redis中,而且redis支持key设置过期时间,这个和用户会话的过期就不谋而合了。

只不过传统的集成方案需要我们手动的将session存储在redis中,然后再在redis中读取,这种方式操作起来可能比较重复繁琐。

所以spring已经在spring全家桶中提供了分布式session共享集成方案,就是标题中所说的springsession。

这里基于springboot来搭建个入门demo,以便大家快速了解springsession。

集成springsession之前

这里简单搭建了两个服务client1和cilent2,我们在这连个服务中提供两个接口,如下

/**
 * @author 蒋墨风
 * @title: SpringSessionController
 * @projectName client1
 * @description: 测试spring session功能
 * @date 2019/10/27 16:11
 */
@RequestMapping("/springSessionTest")
@RestController
public class SpringSessionController {
    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public Map<String, Object> firstResp (HttpServletRequest request){
        Map<String, Object> map = new HashMap<>();
        request.getSession().setAttribute("request Url", request.getRequestURL());
        map.put("request Url", request.getRequestURL());
        return map;
    }
    @RequestMapping(value = "/sessions", method = RequestMethod.GET)
    public Object sessions (HttpServletRequest request){
        Map<String, Object> map = new HashMap<>();
        map.put("sessionId", request.getSession().getId());
        map.put("message", request.getSession().getAttribute("request Url"));
        return map;
    }
}

client2中的接口和client1代码是一样的,这里就不重复粘贴了。

两个服务的端口分别是9002和9003。这里我们把两个服务启动成功之后,我们先访问client1的test接口,然后在访问client1中sessions接口来看下具体session打印。

client1中的sessions接口响应如下

{
"sessionId":"6C3E8502E1DFA9FB5595D8EEE848A900",
"message":"http://localhost:9002/springSessionTest/test"
}

接下来我们依次访问client2接口中的test接口和sessions接口,得到的响应如下

{
"sessionId":"B6DEB7D49CCA3AA239FA593555605C4B",
"message":"http://localhost:9003/springSessionTest/test"
}

可以看到两个session是相互独立的。

集成springsession之后

首先我们在两个服务中引入相关的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
 </dependency>

然后在配置文件中加上redis配置

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database=3
spring.redis.password=12345
spring.redis.timeout=5000

再在两个服务的启动类上加上@EnableRedisHttpSession注解,开启spring session功能,两个服务正常启动之后,重复上面操作,先访问client1的test和sessions接口,接口响应如下

{
"sessionId":"5fdd9b56-70ab-4722-81f6-8c4af721a1e6",
"message":"http://localhost:9002/springSessionTest/test"
}

接下来我们再访问client2服务中的test,sessions接口,接口响应如下

{
"sessionId":"5fdd9b56-70ab-4722-81f6-8c4af721a1e6",
"message":"http://localhost:9003/springSessionTest/test"
}

可以看到两个sessionId是一样的,所以client1和client2的共享session是实现了的,网上好多小伙伴说,你这种实现方式是两个服务部署在同一台机器上,如果把两个服务分别部署在两台机器上,上面的测试效果就不是这样了,如果遇到这种情况的小伙伴可能需要确认下自己测试的两台机器上的时间是不是一致,如果不是的话,就可能会导致上面的测试失败。

总结

上面只是简单的演示了下两个服务集成springsession之前和之后的效果,具体springsession的原理,后面结合springsession源码来和大家一起学习,这里springsession集成了redis,用redis做session存储,当然我们也可以使用其他的存储,不局限于redis。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 分别在Groovy和Java中创建并初始化映射的不同分析

    分别在Groovy和Java中创建并初始化映射的不同分析

    这篇文章主要为大家介绍了分别在Groovy和Java中创建并初始化映射的不同分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

    2022-03-03
  • Spring中Bean的生命周期使用解析

    Spring中Bean的生命周期使用解析

    这篇文章主要介绍了Spring中Bean的生命周期使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Spring中@Repository注解的作用和用法以及和@Mapper的区别详析

    Spring中@Repository注解的作用和用法以及和@Mapper的区别详析

    这篇文章主要给大家介绍了关于Spring中@Repository注解的作用和用法以及和@Mapper的区别的相关资料,注解的作用是标识一个类为数据访问对象,并由Spring框架进行实例化和管理,需要的朋友可以参考下
    2023-09-09
  • java制作仿微信录制小视频控件

    java制作仿微信录制小视频控件

    这篇文章主要介绍了java制作仿微信录制小视频控件的代码,录制小视频非常方便,有需要的小伙伴可以参考下。
    2015-04-04
  • Mybatis加载策略的实现方法

    Mybatis加载策略的实现方法

    Mybatis中一对一,一对多,多对多关系的配置及实现,可以实现对象的关联查询。实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的订单信息,这是就是我们常说的延时加载,本文给大家详细介绍实现方法,一起看看吧
    2022-02-02
  • Java匿名内部类导致内存泄露的原因与解决方案详解

    Java匿名内部类导致内存泄露的原因与解决方案详解

    这篇文章主要为大家详细介绍了Java因为匿名内部类导致内存泄露的原因以及其解决方案,文中的示例代码讲解详细,希望对大家有所帮助
    2022-11-11
  • Mybatis事务如何跟Spring结合(数据库事务特性和Spring事务管理源码)

    Mybatis事务如何跟Spring结合(数据库事务特性和Spring事务管理源码)

    MyBatis与Spring的事务结合主要是通过Spring的事务管理和MyBatis的数据库操作来实现的,在本文中,我们将从数据库事务特性和Spring事务管理源码两个角度来分析MyBatis事务如何与Spring结合到一起的原理,感兴趣的朋友一起看看吧
    2024-01-01
  • Java函数式接口Supplier接口实例详解

    Java函数式接口Supplier接口实例详解

    这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 一文带你学会规则引擎Drools的应用

    一文带你学会规则引擎Drools的应用

    Drools 就是一个开源的业务规则引擎,可以很容易地与 spring boot 应用程序集成,这篇文章就来和大家详细聊聊Drools的具体应用,需要的可以参考一下
    2023-03-03
  • java实现图片水平和垂直翻转效果

    java实现图片水平和垂直翻转效果

    这篇文章主要为大家详细介绍了java实现图片水平和垂直翻转效果,图片旋转的灵活运用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01

最新评论