分布式session的4种解决方案

news2025/1/18 11:00:28

分布式session的4种解决方案

1、cookie和session
cookie和session都是用来跟踪用户身份信息的会话方式。
cookie存储的数据保存在本地客户端,用户获取容易,但安全性不高,存储数据小。
session存储的数据保存在服务器,用户不易获取,安全性较高,存储数据较大。
通常情况下,服务器将用户信息通过session的方式保存在服务器,然后将sessionId返回给客户端cookie,客户端进行下次请求时,就可在cookie中带上sessionId,服务器通过sessionId,就可以在服务器内存中找到对应的session对象,获取当前用户的信息。

流程可如下所示:
在这里插入图片描述
2、背景介绍
传统项目中,单服务器场景,服务器的session对象保存在本地内存,浏览器的每次请求都会打到该服务器上,所以,只要session没过期,一定能够获取到session对象。

但在多服务器场景,或微服务项目中,一个工程有多个实例。浏览器的多次请求,经过nginx反向代理后,有可能就会请求到不同的服务器上。场景如下所示:
在这里插入图片描述
3、解决方案
3.1、session复制
session同步,让集群下的服务器进行session同步,一种传统的服务器集群session管理机制,常用于服务器不多的集群环境。

集群下,进行session同步的服务器的session数据是相同的,任何一台服务器挂掉,都不会丢失用户的session数据。

但是,session同步是通过广播的方式来异步同步session,会通过网络进行数据传输。当服务器越来越多时,session同步会占用大量带宽,并且每台服务器需要存储的session数据也越来越大,占用大量服务器内存。

所以,session同步策略一般适用于集群服务器不多的场景。
3.2、客户端存储(不推荐)
直接将session数据存储到浏览器的cookie中,浏览器在发起请求时,通过cookie将session数据发送给客户端。因为cookie不安全,易获取,所以通常用来存储一些不敏感的信息。

但是,由于cookie不安全,且每次http请求,都会携带存储在cookie中的完整用户信息,会增大网络传输开销,并且cookie有存储大小限制。所以基本上不会使用这种方式。

3.3、Hash一致性
修改nginx的负载均衡配置,设置为ip-hash策略,将客户端与服务器进行绑定,让来自同一ip的请求,全都转发到同一台服务器。

此方案配置简单,但有一台服务器挂掉之后,该服务器上的session信息将全部丢失,与该服务器绑定的客户端,必须得重新登录。并且在进行水平扩展时,会重新对客户端ip进行hash操作,部分ip会被重新映射服务器。

# 配置负载均衡服务器组名称和地址
upstream web_server {
    ip_hash;
    server 192.168.12.36;
    server 192.168.12.37;
    server 192.168.12.38;
}
 
# nginx路由配置
server {
    listen       8080;
    server_name  localhost;
    location / {
        proxy_pass http://web_server;
    }
}

3.4、基于Redis的分布式session(推荐)
将集群下所有服务器的session都存储到redis集群中。

直接使用Spring封装的Spring Session,引入相关依赖,使用简单,session数据保存在redis中,无缝接入,无安全隐患;且Redis也可做主从集群架构,方便管理。唯一的缺点是,服务器需要与Redis做一次网络交互,多了点网络开销。
在这里插入图片描述

3.4.1、引入相关依赖
<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session</artifactId>
</dependency>
 
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
 
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3.4.2、Java 配置

@Configuration
@EnableRedisHttpSession 
public class Config {
	@Bean
	public LettuceConnectionFactory connectionFactory() {
		return new LettuceConnectionFactory(); 
	}
}

3.4.3、Redis配置

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/967390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu中安装clion并把clion添加到桌面快捷方式

Clion的安装&#xff1a; CLion是由大名鼎鼎的JetBrains公司出品的一款面向C和C的集成开发工具。下载地址。 下载后解压出来&#xff0c;然后进入到解压后的文件夹里面&#xff0c;执行 ./clion.sh 便可以运行软件&#xff1a; cd bin/ ./clion.sh 激活使用的话&…

亚马逊庭院类目或迎来显著增长;倩碧使用TikTok全新搜索广告功能

夏季即将结束&#xff0c;但Jungle Scout Cobalt数据显示&#xff0c;亚马逊的Patio, Lawn & Garden类目仍将迎来显著的季节性增木 除了夏季销售的飙升&#xff0c;Generators & Portable Power发电机和便携式电源子类别的销售一般会在初秋和假日季节会迎来大幅增长&a…

820. 单词的压缩编码

820. 单词的压缩编码 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;__820单词的压缩编码__存储后缀__820单词的压缩编码__字典前缀树 原题链接&#xff1a; 820. 单词的压缩编码 https://leetcode.cn/problems/short-encoding-of-word…

从Matrix-ResourceCanary看内存快照生成-ForkAnalyseProcessor(2)

不同于LeakCanary,在Matrix中,主要是通过Resource Canary来监控内存泄漏问题的,且监听的泄漏对象只支持Activity,官方说明如下: 结合分析LeakCanary的经验可知,要实现Activity内存泄漏监听,总体上应该要实现两大功能: Activity生命周期监控查找泄漏对象并得到GC Root P…

2023-9-3 分解质因数

题目链接&#xff1a;分解质因数 #include <iostream>using namespace std;void divide(int n) {for(int i 2; i < n / i; i ){if(n % i 0){int res 0;while(n % i 0){n / i;res ;}cout << i << << res << endl;}}if(n > 1) cout &l…

ZDH-权限模块

本次介绍基于ZDH v5.1.2版本 目录 项目源码 预览地址 安装包下载地址 ZDH权限模块 ZDH权限模块-重要名词划分 ZDH权限模块-菜单管理 ZDH权限模块-角色管理 ZDH权限模块-用户配置 ZDH权限模块-权限申请 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽…

SWAT-MODFLOW地表水与地下水耦合

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

Java:Springboot和React中枚举值(数据字典)的使用

目录 1、开发中的需求2、实现效果3、后端代码4、前端代码5、接口数据6、完整代码7、参考文章 1、开发中的需求 开发和使用过程中&#xff0c;通常会涉及四个角色&#xff1a;数据库管理员、后端开发人员、前端开发人员、浏览者 数据库使用int类型的数值进行存储&#xff08;e…

PMD代码检查:属性应该在类的最顶部声明(FieldDeclarationsShouldBeAtStartOfClass)

https://docs.pmd-code.org/pmd-doc-6.55.0/pmd_rules_java_codestyle.html#fielddeclarationsshouldbeatstartofclass 属性的声明应该在类的最顶部&#xff0c;即在方法声明、构造器、初始化、内部类的前面。默认允许枚举声明、匿名类的声明放在属性的前面。 将下面语句放在…

Linux服务——nginx重写功能与反向代理

目录 一、nginx重写功能 if指令 return指令 set指令 break指令 rewrite指令 防盗链 二、反向代理 反向代理参数 反向代理——缓存功能 反向代理——ip穿透 反向代理——动静分离 反向代理——负载均衡 一、nginx重写功能 Nginx服务器利用 ngx_http_rewrite_module…

选择 Guava EventBus 还是 Spring Framework ApplicationEvent

文章首发地址 Spring Framework ApplicationEvent Spring Framework 的 ApplicationEvent 是 Spring 框架提供的一种事件机制&#xff0c;用于实现发布和订阅事件的功能。它基于观察者模式&#xff0c;允许应用程序内的组件之间进行松耦合的通信。 下面是关于 Spring Frame…

Linux开源防病毒引擎ClamAV

ClamAV官方地址&#xff1a;https://www.clamav.net 它支持Linux、BSD、windows、Mac OS X等系统。 在CentOS 8&#xff08;Tencent OS 3.1&#xff09;安装非常便利&#xff0c;可以使用yum。 yum install clamav 安装成功&#xff0c;就可以使用它进行病毒扫描检查了。 c…

设计模式系列-创建者模式

一、上篇回顾 上篇我们主要讲述了抽象工厂模式和工厂模式。并且分析了该模式的应用场景和一些优缺点&#xff0c;并且给出了一些实现的思路和方案,我们现在来回顾一下&#xff1a; 抽象工厂模式&#xff1a;一个工厂负责所有类型对象的创建&#xff0c;支持无缝的新增新的类型对…

2.5 关系查询优化

这段话主要讨论了关系模型在数据库领域中的查询优化问题。以下是对这段文字的简要解释&#xff1a; 1. **关系模型的优缺点**&#xff1a;虽然关系模型有许多优点&#xff0c;但它也有一些缺点&#xff0c;最主要的缺点是查询效率。如果没有适当的优化&#xff0c;查询的速度可…

git在linux情况下设置git 命令高亮

只需要执行下面这个命令&#xff0c;这样就可以在查看git status明亮的时候高亮显示。 git config --global color.status auto未设置前 谁知之后

【leetcode 力扣刷题】字符串匹配之经典的KMP!!!

字符串子串匹配相关 28. 找出字符串中第一个匹配项的下标暴力求解KMP 459. 重复的子字符串暴力求解在SS中找S 以下是能用KMP求解的算法题&#xff0c;KMP是用于字符串匹配的经典算法【至今没学懂………啊啊啊】 28. 找出字符串中第一个匹配项的下标 题目链接&#xff1a;28. 找…

Vue学习(三)

一、列表渲染 v-for指令 用于展示列表数据 语法<li v-for"(item, index) in items" :key"index"></li>key可以是index,最好是遍历对象的唯一标识 可遍历&#xff1a;数组、对象 <!DOCTYPE html> <html lang"en">&l…

探究Vue3中的Composition API:优化组件逻辑的新利器

一、toRef函数 在 Vue 3.0 中&#xff0c;引入了一种新的响应式 API,即 toRef。toRef 函数可以将一个普通值转换为响应式引用类型&#xff0c;这样就可以在模板中直接使用这个响应式引用类型的属性&#xff0c;并且当该属性发生变化时&#xff0c;视图会自动更新。 <templat…

【C++代码】用栈实现队列,用队列实现栈--代码随想录

队列是先进先出&#xff0c;栈是先进后出。卡哥给了关于C方向关于栈和队列的4个问题&#xff1a; C中stack 是容器么&#xff1f; 使用的stack是属于哪个版本的STL&#xff1f; 使用的STL中stack是如何实现的&#xff1f; stack 提供迭代器来遍历stack空间么&#xff1f; …

测试开发【Mock平台】09开发:项目管理(五)搜索、删除和Table优化

【Mock平台】为系列测试开发教程&#xff0c;从0到1编码带你一步步使用Spring Boot 和 Antd React框架完成搭建一个测试工具平台&#xff0c;希望作为一个实战项目对各位的测试开发学习之路有帮助&#xff0c;大奇一个专注测试技术干货原创与分享的家伙。 Mock平台系统项目基本…