session共享解决方案

session共享解决方案

1.缘起
session,相信做web开发的程序员们肯定都不陌生,先浅聊下session?
服务器为每一个用户创建一个会话上下文,保证同一个用户在多次发送请求到服务端时
都是在同一个上下文中。而这个session上下文则存储用户信息,以及用户状态数据,请求参
数数据等;以及用户登录信息登录状态等;保持用户的登录装态。
深究?
为毛线服务器端要给用户(同一个浏览器发送多次请求)创建一个session上下文呢?
原因很简单,因为HTTP协议是一个无状态的协议,短连接,所以用户登录后的状态则需要
服务器端来保持。服务器提供的保持用户状态以及用户数据的方式就是 session会话上下文
方式。

抛转?
综上解说基于单机的web服务而言,那么当我们用了负载均衡技术致使线上部署多台业务逻
辑服 务呢?多个服务之间的session怎么共享?OR分布式项目架构时 session怎么共享?

2.session共享架构方案
带着前面提出的问题给出相应的架构方案;
2.1 方案一 session同步
当多个应用进程 部署后,可以对这多个进程进行session同步操作,致使每个进程都拥有全
部的用户session。

优点:
简单,不用改原有代码;
缺点:
服务器数据冗余;
而且服务器数据大小有限制;
2.2 方案二 IPhash负载均衡
多个应用进程上一层使用 NGINX做反向代理,利用nginx 的负载均衡策略 --一致性IPhash算
法进行负载,这样就可以保证同一个用户的request 每次都会路由到相同服务器。从而做到
服务器session同步;

优点:
简单,不用写逻辑代码,项目不用做多余的逻辑处理;

缺点:
受限于 应用进程上层架构的nginx 的负载均衡算法;
当用户端重新创建会话后,原session中的数据会丢失;

2.3 真正的分布式session共享方案:

session共享,只要将session放在大家都可以用的公共内存就可以了,因此我们可以使用
Redis 或者mc 等公共内存中存储;

实现步骤:
登录时 将用户信息 存储在Redis中 ,并且将 Redis中的用户信息存储的KEY 并用户基
本信息 通过JWT生成一个token 返回给客户端;那么客户端每次访问直接通过token逆
向后得到用户的key 则可以根据key 获取用户信息,从而检测 用户登录状态,以及获取
用户的登录数据信息;

优点:
没有安全隐患;
可以水平扩展;
服务器端重启后用户的session信息不回丢失;

3.session共享架构方案总结
session共享方案:
3.1 通过session复制 让每个线上的进程都保持全部的登录用户session上下文

3.2 通过 NGINX 的负载均衡策略 一致性IPhash 策略让同一个IP用户每次都路由到同一个应
用服务器,从而达到session可用性;

3.3 通过服务器生成token方式,将token以及用户数据存储在redis 或者 mc 等共有内存中,
从而做到session的共享— 真正的分布式session共享解决方案;

你可能感兴趣的:(架构师之路,分布式,redis,java)