session理论以及解决分布式系统下的session共享问题

一、广义的session
二、可以理解为一种保存key-value的机制:
session机制中的关键点是如何去设置和获取key,另外一点是能够设置和保存正确的value。从key的方面看有两种:sessionId和token
1、sessionId很常见,客户端请求服务端的时候,服务端通过 set cookie就可以在http头里面这个sessionId设置key所对应的value值,而客户端的cookie会将这个保存,后续的请求里面会自动的带上
这里写图片描述这里写图片描述
2、另外一种是token,使用token需要手动的在http头里或者在url里设置token字段,服务器收请求之后在从哪个http头里或者url里面取出token进行验证当然安全方面要求严格的时候token会和签名一起使用。
当然无论是sessionId还是token他们都一定是全局为一的,一个用户对应一个标识,它的本质就是一个key,value就是用户信息,比如依赖sessionId的时候如果用户禁用了cookie,就会造成系统不断的要求登录。
三、分布式系统中的session问题:
这里写图片描述
前端用户的请求通过nginx到达tomcat,tomcat部署了我们的一个应用,这个时候session是保存在tomcat应用的内存里面的。这里写图片描述
当用户量增加的时可以增加tomcat数量,那么程序是怎么放到tomcat的呢,有三种方式:水平扩展、垂直扩展、水平加垂直扩展
1、水平扩展是用通过服务器之间的复制操作,也就是集群操作
2、 垂直扩展就是拆分服务,比如A服务器上有类目、订单、商品三个服务,可以把它给拆分出来,A1部署类目服务;A2部署订单服务;A3部署商品服务。配置完成后我们在配置nginx,根据访问不同的url**负载均衡**到不同的服务器上去,这种方式单台服务器压力就会减少。
但是无论我们水平扩展还是垂直扩展session问题都会出现,当一个请求过来访问了A1服务器,这时候A1持有了用户的session,接着用户做第二个请求到达A2,A2并没有用户的session信息,以为这个用户没有登录。对于水平扩展,可能会有IP哈希解决方案,它可以让每次从同一IP过来的请求都转发到后端同一台服务器上。但是这个也是有隐患的,对于同一个IP发送大量的请求导致服务器挂掉,那么这台机器所处理的所有IP都不能够进行访问了,对于垂直扩展更没有戏了!
真正通用的方案是我们应该建立一个专门的服务去保存session信息,而其他服务需要session信息的时候都去请求这个服务。这个服务通常就是用redis集群或者是主从复制做的,这样的话无论通过水平扩展还是垂直扩展都先去请求redis服务获取用户对应的信息,从而进行后续操作,登录的时候设置好了key保存好用户的信息等等的value,登出的时候让value失效就可以了!
这里写图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值