分布式系统session

登录概念

登录其实就是验证用户的身份,验证通过之后再存储用户相关的信息和浏览状态

登录的方式
  1. 传统的管理系统会在数据库中插入超级管理人员的初始用户名和密码,后续再由超级管理员通过界面上添加普通管理员的账号和密码,再往后普通管理员在登录界面输入用户名和密码完成登录。
  2. 微信扫码授权登录,在这个功能中项目初始化的时候其实是在数据库中插入了有访问权限的用户openid,这样微信授权拉取了用户身份后,如果有权限的openid就放行,否则就拒绝,openid相当于密码,用户名不用输入,扫一扫二维码即可。
登出概念

登出本质就是使用户的浏览状态失效

做到这两个功能至关重要的依赖是session
session概念
  • 狭义的session:httpsession、J2EE接口

  • 广义的session:会话控制

http协议是无状态的,对于同一个url请求并没有上下文关系,当用户完成登录之后,需要有一个机制能够保存用户的信息和状态,再后续的请求中能验证用户的身份和检查用户信息,这个依赖就是会话控制。

session可以理解为一种保存key-value的机制

session机制中的关键点是如何设置和获取key,如何保存和获取正确的value

从key的方面看

会话有两种常规的方式

  1. sessionId
    客户端请求服务端的时候,服务的通过setcookie就可以再http头里面设置sessionId这个key和value值,而客户端的cookie会将这个保存住,后续的请求里面会自动的带上

  2. token
    使用token的时候,需要手动在http中head头里或者url里设置token这个字段,服务器收到请求之后再从head头里或者url里取出token进行验证。安全方面比较严格的话会配合签名一起使用。

  • 无论是sessionId还是token,它们都一定是全局唯一的,一个用户一个标识,它的本质就是一个key,这个key对应的用户信息就是value。无论是key还是value,一方没有保持住,就不可能分辨出这个用户身份,就获取不到这个用户的信息。
分布式系统下的session
微信客户端
nginx
浏览器客户端
tomcat1
tomcat2
tomcat3
redis主从复制

水平扩展:加多两台tomcat服务器,把tomcat1的程序复制到tomcat2和tomcat3服务器上,他们完全是一样的,这种做法就是集群。

水平扩展用Ip_hash方案有隐患,同一个用户访问一个服务器,访问量大的时候很多用户在访问同一个服务器,这个服务器支撑不了,解决不了session问题

垂直扩展:把程序功能做垂直拆分成服务A,服务B和服务C。 tomcat1上部署服务A,tomcat2上部署服务B,tomcat3上部署服务C,把程序的功能做垂直的拆分,之后配置nginx根据访问不同的url访问到不同的tomcat服务器上,这样单台服务器的压力就会减少。

需要专门的服务保存session信息,其他服务器需要session的时候都找它要,这个服务通常用redis集群主从复制去做。

<think>嗯,用户问的是分布式系统中如何实现Session共享的解决方案。我需要先回忆一下常见的几种方法,然后结合提供的引用内容来组织答案。 首先,用户提到的引用里有几种方案,比如Session粘性、客户端存储、共享文件系统、数据库集中存储,还有Redis集中管理。这些都需要一一解释清楚。特别是Redis的方案,引用5提到这是常用的,因为Redis内存数据库效率高,适合集群环境,所以可能需要重点强调这个。 然后,每个方案的原理、优缺点都需要说明。比如Session粘性是通过负载均衡保持同一用户的请求到同一服务器,但缺点是一旦服务器宕机,Session会丢失,引用1和3也提到了这一点。客户端存储可能不安全,引用3提到在小型系统中可能适用,但大型系统不行。 共享文件系统,比如NFS,引用2里提到PHP实践中用文件系统共享Session,但可能在高并发下性能有问题。数据库存储的话,可能性能不如Redis,所以现在常用的是Redis或者Memcached这样的内存数据库。 另外,引用4提到Spring Session配置Redis的方法,可能需要给出具体的步骤或者配置示例,这样用户更容易理解如何实现。 还要注意用户可能需要知道如何选择这些方案,比如根据系统规模、性能要求来决定。比如小型系统可能用粘性或者客户端存储,大型分布式系统则用Redis。 最后,生成相关问题的时候,要考虑用户可能的后续疑问,比如安全性、性能优化、具体框架的实现方式,或者不同方案的比较。这样可以帮助用户更深入地理解问题。</think>在分布式系统中实现Session共享的解决方案主要有以下5种方式,结合具体场景和引用内容分析如下: ### 一、Session粘性方式(Sticky Session) **原理**:通过负载均衡将同一用户的请求固定分配到同一服务器,使Session数据仅存储在单台服务器中[^1]。 **实现**:在Nginx配置中设置`ip_hash`或`cookie_hash`策略。 **缺点**:若服务器宕机,Session会丢失;扩展性差[^3]。 ### 二、客户端存储Session **原理**:将Session数据加密后存储在客户端的Cookie或LocalStorage中。 **代码示例**: ```javascript // 客户端存储加密后的Session localStorage.setItem('session', encrypt(sessionData)); ``` **缺点**:存在安全隐患,且数据大小受限制(Cookie通常≤4KB)。 ### 三、共享文件系统存储 **原理**:将Session数据保存到NFS(网络文件系统)中,多服务器共享同一存储路径[^2]。 **适用场景**:小型系统(3-5台服务器)且对性能要求不高时可用。 ### 四、数据库集中存储 **原理**:使用MySQL、PostgreSQL等数据库集中管理Session。 **缺点**:数据库读写性能瓶颈明显,高并发场景不适用(引用未明确提及,但可推理)。 ### 五、Redis集中管理(推荐方案) **原理**:利用Redis内存数据库实现高性能Session共享,支持集群和高可用[^5]。 **实现步骤**(以Spring Boot为例): 1. 添加依赖:`spring-session-data-redis` 2. 配置YAML: ```yaml spring: session: store-type: redis timeout: 30m redis: host: 192.168.1.100 port: 6379 ``` 3. 使用`@EnableRedisHttpSession`注解[^4] **优势对比**: | 方案 | 性能 | 扩展性 | 可靠性 | 实现复杂度 | |------------|-----|-----|-----|-------| | Session粘性 | 高 | 低 | 低 | 简单 | | Redis集中管理 | 极高 | 高 | 高 | 中等 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值