首页 > 其他分享 >分布式环境下,如何实现 Session共享

分布式环境下,如何实现 Session共享

时间:2024-07-22 10:50:45浏览次数:13  
标签:请求 Session 用户 Nginx sessionID session 服务器 共享 分布式

先了解一下为什么会出现这种session共享的解决方案?

随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会出现一个问题:

当用户进行一个session会话的时候,比如一个用户去登录项目,一般的大公司的项目都是有Nginx进行反向代理的,

这里简单列举一下Nginx常用的几种反向代理策略:

  1. 轮询策略,
  2. 权重比例策略,
  3. ip_hash策略,
  4. 还可以自定义的策略,

在Nginx的反向代理下,一般会把用户的请求分发到不同的服务器上,但是如果用户请求的请求是存放在该请求的服务器A上,那么该用户的sessionID就存储在该服务器上JVM的一个ConcurrentHashmap中,以sessionID为key。

但是如果此时用户请求的一个服务模块可能需要调用到服务器B,当用户发起请求的时候,此时的服务器B上并没有存储该用户的sessionID,所以就会再次让用户进行一个登陆操作。还有可能会导致用户本来就想完成一个下单操作,但是却还登陆了好几次的情况。

所以session共享方案在分布式环境和微服务系统下,显得尤其重要。

解决方案一:基于Nginx的ip_hash 负载均衡

其实就是对请求过来的ip地址对你的多少台可用的服务器进行取模,然后就会把你的请求通过Nginx的反向代理给分发到对应的服务器上。(这里会把可用的服务器放到一个数组中,如果取模得到的结果是几,就把请求分到服务器数组中的下标为几的服务器上)

具体实现:

需要你在Nginx.conf文件中进行对应的修改,根据自己的可用服务器

这种实现的优缺点:

 

 

 

 

解决方案二:基于Tomcat的session复制

这个解决方案其实就是当用户请求的时候,把产生的sessionID给复制到系统所有的服务器中,这样就能保证当用户请求的时候从服务器A可能调用到服务器B上的模块的时候,也能保证服务B也有该用户的sessionID,这样就不会再次让用户进行再次登录操作了。也就解决问题了。

具体代码中如何实现session复制呢?

 

 

 

 

使用session复制的优缺点:

 

 

 

 

解决方案三:使用Redis做缓存session的统一缓存

这种方案呢,其实就是把每次用户的请求的时候生成的sessionID给放到Redis的服务器上。然后在基于Redis的特性进行设置一个失效时间的机制,这样就能保证用户在我们设置的Redis中的session失效时间内,都不需要进行再次登录。

如何进行代码的实现:

 

 

 

 

使用Redis实现session共享的优缺点:

 

 

 

 

解决方案四:结合cookie

其实还可以把session放到cookie中去,因为每次用户请求的时候,都会把自己的cookie放到请求中,所以这样就能保证每次用户请求的时候都能保证用户在分布式环境下,也不会在进行二次登陆。

 

标签:请求,Session,用户,Nginx,sessionID,session,服务器,共享,分布式
From: https://www.cnblogs.com/ataoxz/p/18315623

相关文章

  • 共享充电桩小程序开发
    共享充电桩小程序的开发是一个综合性的项目,旨在解决电动汽车充电设施不足和分布不均的问题,提升用户充电的便捷性和效率。以下是共享充电桩小程序开发的主要方面:一、需求分析用户调研:深入了解目标用户群体的特征、充电习惯以及对充电服务的期待。功能规划:基于用户需求,规划小......
  • 封禁 NetBIOS Session Service 和 SMB 服务(特别是旧版本的SMB)可能是出于安全性考虑。
    封禁NetBIOSSessionService和SMB服务(特别是旧版本的SMB)可能是出于安全性考虑。这两种服务在过去的实现中存在一些安全漏洞和风险,特别是在现代网络环境中,这些风险可能会被利用来进行攻击或者未经授权的访问。下面是一些常见的安全考虑:中间人攻击:未加密的NetBIOS和旧版本......
  • 数据共享(浅拷贝)与数据独立(深拷贝)
    在FFmpeg中,数据共享和数据独立的区别在于浅拷贝和深拷贝的使用。让我们详细探讨这两个概念及其在FFmpeg内存模型中的实现。数据共享(浅拷贝)浅拷贝是指在拷贝对象时,只拷贝对象的引用,而不拷贝实际的数据内容。对于FFmpeg中的AVPacket来说,浅拷贝意味着两个Packet共享同一个数据缓冲......
  • 数据结构:栈的基本概念、顺序栈、共享栈以及链栈
    相关概念栈(Stack)是只允许在一端进行插入或删除操作的线性表。栈顶(Top):线性表允许插入删除的那一端。栈底(Bottom):固定的,不允许进行插入和删除的另一端。栈的基本操作InitStack(&S):初始化一个空栈S。StackEmpty(S):判断一个栈是否为空,若栈S为空则返回true,否则返回false。......
  • SwiftUI中全局EnvironmentObject的使用和注意事项,实现多界面共享数据
    SwiftUI的@EnvironmentObject是一个强大的工具,它允许你在多个视图之间共享数据(使用一个可观察对象)。当你有一个复杂的视图层次结构,并且需要在没有直接连接的视图之间共享相同的可观察对象时,它特别有用。创建ObservableObject协议类要使用环境对象,首先需要创建一个符合Obse......
  • Ubuntu环境与Windows环境共享文件服务搭建(Samba服务)
    问题在windows系统和ubuntu系统之间需要共享大体积的数据(上百GB),通过U盘或者移动硬盘拷贝耗时长,且需要至少拷贝两次,这还要这些移动存储设备的容量够大,在这种情况下,如果能够使两台设备之间直接通过网线(别的联通方式可能更麻烦,在大多数情况下设备上都有以太网口)直接进行数据的......
  • Spring Boot实现分布式验证码登录方案
     ​ 博客主页:   南来_北往......
  • Python应用程序跨子包共享的配置文件
    我正在构建一个应用程序来控制一些硬件。我在包中实现了不同类型的硬件:电机和测量设备。我的文件结构如下:name_of_my_app/__init__.pymain.pyconfig.iniCONFIG.pymotors/__init__.pyone_kind_of_motor.pymeasurement_devices/......
  • Elasticsearch集群管理在分布式环境中的应用
    ......
  • CuteHttpFileServer(文件共享工具) v3.1
    CuteHttpFileServer/chfs是一个免费的、HTTP协议的文件共享服务器,使用浏览器可以快速访问。与其他常用文件共享方式(如FTP,飞秋,网盘,自己建站)相比,具有使用简单,适用场景更多的优点,在个人使用以及共享给他人的场景中非常方便快捷。软件特色单个文件,核心功能无需其他文件跨平台运行,......