SpringSession;基于Redis的SpringSession实现;实现session共享的三种方式

news2024/11/25 18:55:47

一,SpringSession简介

         是SpringCloud下管理session的框架,在微服务架构中,由于应用了分布式的思想,session无法做到内存中互通,需要一个框架来实现各个微服务中session数据共享,SpringSession解决了这个问题。在SpringSession框架中,可以无感的实现和操作session共享。

二、实现session共享的三种方式

1、修改Tomcat配置文件

可以通过修改配置文件实现session共享,现在已经不用这种方式了,有很多限制。

2、Nginx负载均衡策略

通过ip_hash的方式,让同一个ip的请求到相同的服务中,session自然没有失效。这种方式也不推荐,无法做到效率及硬件利用率最高的负载均衡。

upstream server{
​
ip_hash;
  server 192.168.1.101:28080 max_fails=1 fail_timeout=60s weight=1;
  server 192.168.1.101:28090 max_fails=1 fail_timeout=60s weight=2;
}
​
server {
  listen    80;
  server_name  192.168.1.115;
​
  location / {
    proxy_pass server
  }
}

3、redis统一存储

SpringBoot整合SpringSession,通过nacos进行配置管理,通过redis存储方式实现session共享

官网文档:Spring Session - Spring Boot

三,基于Redis的SpringSession实现

0、准备工作

【1.启动redis,nacos】

【2.准备两个项目应用,编写两份一样的代码】

【2.1添加依赖】

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.7.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
        <jwt.version>0.7.0</jwt.version>
        <fastjson.version>1.2.60</fastjson.version>
        <spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

【2.2修改项目控制器】

package org.jsoft.demo.controller;


import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

@RestController  
@RequestMapping("/user")
@Setter
public class UserController {
    
    @GetMapping //get方式进行提交
    public String test(HttpSession session){ //默认参数
        return session.getId();
    }

}

【2.3修改项目端口号】

#在application.yml文件里:
server:
  port: 100
  
------------------------
server:
  port: 200

【2.4创建启动类】

@SpringBootApplication
public class SpringBootMain {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootMain.class,args);
    }
}

【2.5启动,访问两个项目】

=====此时,两个项目的sessionID不一致。

1、本地服务添加依赖

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2、修改本地服务配置文件

spring:
  session:
    store-type: redis    //声明Session存储方式

3、添加application.properties文件

进行nacos注册(两个项目是同一个注册名字)

spring.application.name=sessiondemo

4、添加nacos - redis配置

spring:
  redis:
    host: 192.168.43.8
    port: 6379
    password: 123456

5、修改本地项目bootstrap.yml文件

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.43.8:8848
      config:
        server-addr: 192.168.43.8:8848
        file-extension: yaml
        namespace: d2a5ce42-8836-4dc4-89e0-9f8620b82327
        shared-configs:
          - data-id: dz13-redis.yaml
            group: DEFAULT_GROUP
    inetutils:
      preferred-networks: 192.168.56

6、开启SpringSession

7、子域名共享session

需要创建一个config目录,新建SessionConfig配置类,修改domain作用域

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;

/**
 * @author szsw
 * @date 2023/2/16 19:22:06
 */
@Configuration
public class SessionConfig {

    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("JSESSIONID");
        serializer.setCookiePath("/");
        serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
        return serializer;
    }

    @Bean
    public RedisSerializer<Object> redisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }

}

8、测试

重启一下两个服务,之后访问一下nacos。

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

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

相关文章

Unity 3D 游戏发布一口气讲完!(o-ωq)).oO 困

Unity 3D PC平台发布 PC 是最常见的游戏运行平台。 随着欧美游戏的崛起&#xff0c;PC 平台随之发生游戏登陆大潮。 在 PC 平台上发布游戏的步骤&#xff1a; 打开要发布的 Unity 3D 工程&#xff0c;执行 File → Build Settings 菜单命令。 在 Platform 列表框中选择 PC&a…

返回索引对象中各元素的数据类型 pandas.Index.dtype

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 返回索引对象中 各元素的数据类型 pandas.Index.dtype [太阳]选择题 根据题目代码&#xff0c;执行idx3.dtype的结果是&#xff1f; import pandas as pd idx1 pd.Index([1, 2, 3, 4, 5])…

C++网络编程之TCP协议

概述 TCP&#xff0c;即传输控制协议&#xff0c;英文全称为Transmission Control Protocol&#xff0c;是互联网协议套件中的核心协议之一。它工作在OSI七层模型的传输层&#xff0c;也工作在TCP/IP四层模型的传输层。TCP协议的主要目的是&#xff1a;在不可靠的网络环境中提供…

基础算法--枚举

枚举算法是一种简单而有效的算法&#xff0c;它通过枚举所有可能的情况来解决问题。它通常用于解决问题规模比较小的问题&#xff0c;因为它的时间复杂度很高&#xff0c;随着问题的规模增加&#xff0c;算法的效率会急剧下降。 枚举算法的基本思路是通过循环遍历所有可能的情…

(C语言贪吃蛇)13.实现贪吃蛇四方向的移动

目录 前言 原代码预览 解决方法⚠️ 运行效果 总结 前言 我们上节通过Linux线程实现了两个while(1)同时运行&#xff0c;这样就可以一边控制方向一遍刷新出贪吃蛇的身体节点了。本节我们就来实现贪吃蛇四方向的移动。 (此图片为最终效果) 原代码预览 我们之前的代码是通过…

6.模拟电子技术——共集电极,共基极,多极放大电路

写在前面 这个是第六次的笔记&#xff0c;祝大家学习愉快 笔记部分 1.共集电极放大电路 首先&#xff0c;我们再复习一遍组态判断&#xff1a;基极进&#xff0c;发射极出&#xff0c;说明是共集电极放大电路。可能读者已经知道一些结论&#xff0c;先抛开这些&#xff0c;我…

Kubernetes-环境篇-02-ubuntu开发环境搭建

1、ubuntu基础环境 # 更新apt软件源 sudo apt update# 安装git sudo apt install git# 安装python3 sudo apt install -y python3 python3-pip# 安装vim sudo apt install vim2、安装go 2.1 下载go安装包 wget https://golang.google.cn/dl/go1.23.2.linux-amd64.tar.gz2.2 …

第十二届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(第一套)

一.题目分析 &#xff08;1&#xff09;.题目 &#xff08;2&#xff09;.题目分析 1.串口功能分析 a.串口接收车辆出入信息&#xff1a;通过查询车库的车判断车辆是进入/出去 b.串口输出计费信息&#xff1a;输出编号&#xff0c;时长和费用 c.计算停车时长是难点&#x…

深度学习-----------------机器翻译与数据集

目录 机器翻译与数据集下载和预处理数据集预处理步骤词元化词汇表该部分总代码 固定长度阶段或填充该部分总代码 转换成小批量数据集用于训练训练模型总代码 机器翻译与数据集 import os import torch from d2l import torch as d2l下载和预处理数据集 #save d2l.DATA_HUB[fr…

被字节恶心到了

字节 日常逛 xhs 看到一篇吐槽贴&#xff0c;表示被公司恶心到了&#xff1a; 这位网友表示&#xff0c;最近是公司举办了 Q2 和 H1 的优秀员工表彰&#xff0c;自己的 1&#xff08;直属领导&#xff09;评上了&#xff0c;但仔细一看&#xff0c;1 获奖的所有产出都是自己的&…

sql注入第7关(学习记录)

看到这里好像和前面的不一样了&#xff0c;多了个use outfile 先输入个符号&#xff0c;看报错&#xff0c;还是得看别人的教程&#xff0c;通过查找&#xff0c;好像要通过图片来进行注入&#xff0c;ok呀&#xff0c;又是新的方式&#xff0c; 首先我们需要知道他的闭合方式…

uniapp+Android智慧居家养老服务平台 0fjae微信小程序

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 老年人 登…

算法 | 鹈鹕算法POA-Transformer-LSTM多变量回归预测

&#x1f525; 内容介绍 近年来&#xff0c;随着大数据时代的到来和计算能力的飞速提升&#xff0c;对复杂系统进行精确预测的需求日益增长。多变量时间序列预测作为一项关键技术&#xff0c;广泛应用于金融、能源、交通等诸多领域。传统的预测方法&#xff0c;例如ARIMA和多元…

Prometheus Metrics和PromQL的使用

Metrics 官方解释是 Metrics are numerical measurements in layperson terms. (通俗地讲&#xff0c;Metrics就是数字测量) Prometheus fundamentally stores all data as time series &#xff08;Prometheus把所有数据都存储为时间序列&#xff09; Every time series is u…

《PMI-PBA认证与商业分析实战精析》第6章 跟踪与监督

第6章 跟踪与监督 本章主要内容包括&#xff1a; 跟踪 关系与依赖性 批准需求 基线化已批准需求 使用跟踪矩阵来监督需求 需求生命周期 管理需求变更 本章涵盖的考试重点&#xff1a; 跟踪与监督的六项活动 跟踪与监督六项活动的可交付成果及活动间的关系 跟踪的定义…

指南:Linux常用的操作命令!!!

引言: 操作系统是软件的一类。 主要作用是协助用户调度硬件工作&#xff0c;充当用户和计算机硬件之间的桥梁。 尽管图形化是大多数人使用计算机的第一选择&#xff0c;但是在Linux操作系统上多数都是使用的&#xff1a;命令行在开发中&#xff0c;使用命令行形式&#xff0c…

【有啥问啥】联邦学习(Federated Learning, FL):保护隐私的分布式机器学习

联邦学习&#xff08;Federated Learning, FL&#xff09;&#xff1a;保护隐私的分布式机器学习 联邦学习&#xff08;Federated Learning, FL&#xff09;作为一种前沿的分布式机器学习技术&#xff0c;正逐步成为解决数据隐私保护与模型性能提升之间矛盾的关键方案。以下是…

HTTP Cookie与Session

目录 一. 引入Cookie 1.1 定义 1.2 工作原理 1.3 分类 二. 认识Cookie 三. 测试Cookie 五. 引入Session 六. 测试Session 这篇博客&#xff0c;我们来看看Cookie与Session&#xff0c;内容干货满满。 一. 引入Cookie 1.1 定义 HTTP Cookie&…

幂等性及技术解决方案

目录 定义幂等性 为什么需要幂等性幂等性设计注意事项幂等性的范围分布式锁解决幂等性 设计 延伸阅读 定义幂等性 简单地说&#xff0c;我们可以多次执行幂等运算而不改变结果或者使用相同的输入参数中被调用多次&#xff0c;则不具有额外效果的操作&#xff0c;也就是多次执…

使用pytdx获取历史股票行情

使用pytdx获取历史股票行情 先看效果pytdx基础获取历史股票行情将历史数据存入数据库 先看效果 获取从2010年01月01日-2024年09月30日的股票数据 pytdx基础 https://blog.csdn.net/firexiaHouse/article/details/142687052?spm1001.2014.3001.5501 获取历史股票行情 def …