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

一、广义的session
二、可以理解为一种保存key-value的机制:
session机制中的关键点是如何去设置和获取key,另外一点是能够设置和保存正确的value。从key的方面看有两种:sessionId和token
1、sessionId很常见,客户端请求服务端的时候,服务端通过 set cookie就可以在http头里面这个sessionId设置key所对应的value值,而客户端的cookie会将这个保存,后续的请求里面会自动的带上
session理论以及解决分布式系统下的session共享问题session理论以及解决分布式系统下的session共享问题
2、另外一种是token,使用token需要手动的在http头里或者在url里设置token字段,服务器收请求之后在从哪个http头里或者url里面取出token进行验证当然安全方面要求严格的时候token会和签名一起使用。
当然无论是sessionId还是token他们都一定是全局为一的,一个用户对应一个标识,它的本质就是一个key,value就是用户信息,比如依赖sessionId的时候如果用户禁用了cookie,就会造成系统不断的要求登录。
三、分布式系统中的session问题:
session理论以及解决分布式系统下的session共享问题
前端用户的请求通过nginx到达tomcat,tomcat部署了我们的一个应用,这个时候session是保存在tomcat应用的内存里面的。session理论以及解决分布式系统下的session共享问题
当用户量增加的时可以增加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失效就可以了!
session理论以及解决分布式系统下的session共享问题