SpringCloud 学习-SpringSession介绍,使用,整合项目解决Session常规问题

SpringCloud 学习-SpringSession介绍,使用,整合项目解决Session常规问题

1. SpringCloud为什么要用SpringSession? HttpSession不行吗?

HttpSession的问题:

  • 不同服务,session不能共享的问题:不能跨不同域名之间共享session的数据,因为不同域名之间,cookie中的sessionID是不共享的.
  • 同一服务,复制在多台服务器,session不同步的问题:session的数据存在服务器中,而分布式微服务环境下,同一服务模块可能存在多台服务器,服务器之间的session也无法共享

1.1 session 不同步问题的解决方法

方法一:session复制 (适合小型系统)

​ 在同一个服务的不同服务器之间,同步session的数据.

  • 优点:
    • web-server(Tomcat) 原生支持,只需要修改配置文件
  • 缺点:
    • session同步需要数据传输,占用大量网络带宽,降低了服务器群的业务处理能力
    • 任意一台web-server保存的数据都是所有web-server的session总和,数据冗余
    • 大量分布式的集群情况下,由于所有的web-server都全量保存数据,所以此方法可取.
方法二:利用ip_hash一致性 (可使用)

​ 在nginx负载均衡时,利用ip地址的hash一致性,所有该用户的请求都控制的发往固定的服务器.

  • 优点:
    • 只需要修改nginx的配置,不需要修改应用代码
    • 负载均衡,只要hash属性的值分布式均衡的,多台web-server的负载也是均衡的
    • 可以支持web-server的水平拓展(不受内存限制,区别于session复制方法)
  • 缺点:
    • session还是存在web-server中,所有web-server重启可能导致部分session丢失,影响业务
方法三:统一存储(分布式微服务情况下推荐使用)

​ 无论哪一个web-server,session都不存在服务器中,而是统一存储在数据库或者redis类缓存中.

  • 优点:
    • 没有安全隐患
    • 可以水平扩展
    • session不会丢失
  • 缺点:
    • 增加了一次网络调用.
    • 需要修改应用代码,如果将所有的getSession方法替换为从redis查数据的方式,redis获取数据会比内存中慢很多

注意:以上的缺点,可以使用SpringSession完美解决


1.2 session不能跨域共享的问题

解决方法:子域之间共享JSESSIONID

​ 在存储session时,会将JSESSIONID保存在浏览器,并指定域名范围,因此在指定域名范围时,使用父域名,则该JSESSIONID在所有父子域名中生效.

注意:可以使用SrpingSession完成修改有效域名范围

2. SpringBoot 整合SpringSession

导入依赖:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.session</groupId>
      <artifactId>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值