系列六、Springboot整合Spring Session

一、概述

        在互联网发展的起始阶段,一般使用的是单服务架构,由于只有一台服务器(Tomcat),所有的请求和响应都是基于这台服务器实现的,那么就不存在session共享的问题,但是在互联网发展的今天,基本上是分布式 + 微服务了,再使用传统的方案去处理session,显然是行不通的,先看一组简单的架构图:

        在上述的架构中,会出现一些单服务中不存在的问题,例如客户端发送一个请求,经Nginx转发后请求落到Tomcat1上了,然后在Tomcat1的session中保存了一份数据,下次又来一个请求,经过Nginx转发之后请求落到Tomcat2上了,那么这个时候对于第二个请求来说,想从session中拿数据显示是无法拿到的。针对这种情况,Springboot也提供了对应的解决方案,即:Spring Session。所谓Spring Session其实也不是啥新鲜玩意儿,其实就是一个HttpSession,通过引入 spring-session-data-redis 和 spring-boot-starter-data-redis,以后所有关于session的操作,Spring Session都将使用Spring中的代理过滤器,将所有的Session操作拦截下来,自动地将Session中的数据同步到Redis中去,或者从Redis中取出数据然后响应给客户端,这对客户端是无感的,存数据不会再具体的存储到某一台服务器了,而是存到一个公共的地方,取数据也从公共的地方去取,这样就解决了微服务+分布式架构下session共享的问题,架构图如下:

二、案例代码

2.1、环境搭建

2.1.1、项目概览

2.1.2、pom

<dependencies>
	<!-- springboot -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<scope>runtime</scope>
		<optional>true</optional>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-redis</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-redis</artifactId>
	</dependency>

	<!-- 工具 -->
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<optional>true</optional>
		<version>1.18.30</version>
	</dependency>
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-collections4</artifactId>
		<version>4.1</version>
	</dependency>
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-lang3</artifactId>
	</dependency>
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-pool2</artifactId>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>1.2.76</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba.fastjson2</groupId>
		<artifactId>fastjson2</artifactId>
		<version>2.0.37</version>
	</dependency>
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
	</dependency>
	<dependency>
		<groupId>com.google.guava</groupId>
		<artifactId>guava</artifactId>
		<version>20.0</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba.citrus</groupId>
		<artifactId>citrus-springext-all</artifactId>
		<version>3.2.4</version>
	</dependency>
	<dependency>
		<groupId>cn.hutool</groupId>
		<artifactId>hutool-all</artifactId>
		<version>5.7.22</version>
	</dependency>
</dependencies>

2.1.3、yml

spring:
  redis:
    host: 192.168.173.232
    port: 6379
    password: 123456
    database: 0

server:
  port: 8080

2.1.4、主启动

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/12/12 15:08
 * @Description:
 */
@SpringBootApplication
public class SpringbootSessionApplication {

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

}

2.1.5、MyRedisConfig

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/12/12 15:08
 * @Description:
 */
@Configuration
public class MyRedisConfig extends CachingConfigurerSupport {

    /**
     * 解决RedisTemplate、StringRedisTemplate中文乱码问题
     * @param connectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);

        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    /**
     * 解决Spring Session中文乱码
     * 思路:RedisHttpSessionConfiguration ===> createRedisTemplate ===>配置一个bean名为springSessionDefaultRedisSerializer的RedisSerializer
     * 参考:https://www.jianshu.com/p/dd1df913b1b2
     * @return
     */
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
        return serializer;
    }

}

2.2、测试

2.2.1、说明

        为了测试方便方便,我这边简易搞了一台Nginx+2个应用的模式来为大家演示Springboot整合Spring Session的大概流程,架构图如下:

        思路:通过Nginx转发,在Tomcat1中的session中存一个数据,然后从Tomcat2的session中看看能否拿到session中的数据,进而验证!

2.2.2、修改nginx.conf配置信息并启动

        如果对Nginx使用不熟悉的小伙伴,可以参考我之前写的 Nginx系列文章,这里就不再赘述啦!nginx.conf中增加内容如下:

# Spring Session共享
upstream sessionShareServer{
    server 127.0.0.1:8081 weight=1;
    server 127.0.0.1:8082 weight=1;
}
server {
    listen       8848;
    server_name  localhost;

    location / {
        proxy_pass    http://sessionShareServer;
        proxy_redirect default;
        
    }
}

配置解释:

        upstream模块:

                upstream:表示配置上游服务器

                sessionShareServer:给上游服务器起一个名字(自定义)

                server 127.0.0.1:8081: 配置的是一个个单独服务的地址,待会儿我们会将本地jar包上传至Linux服务器,然后分别以8081和8082端口启动

                weight:权重,表示当请求过来时,如何分配请求

        server模块:

                listen 8848:监听的端口

                server_name:服务的名称

                location / :表示拦截所有以 http://192.168.173.232:8848/打头的请求

                proxy_pass:表示请求转发的地址,地址为上边的上游服务器

                proxy_redirect:表示设置当发生重定向请求时,nginx 自动修正响应头数据(默认是 Tomcat 返回重定向,此时重定向的地址是 Tomcat 的地址,我们需要将之修改使之成为 Nginx 的地址)        

2.2.3、编译 & 打包 & 将打包的jar包上传至 linux的/applications目录

2.2.4、启动服务

nohup java -jar springboot2x16-session-0.0.1-SNAPSHOT.jar --server.port=8081 &

nohup java -jar springboot2x16-session-0.0.1-SNAPSHOT.jar --server.port=8082 &

指令解释:

        nohup:表示当终端关闭时,Spring Boot应用不要停止运行;

        &:表示让Spring Boot应用在后台启动;

2.2.5、后台启动日志

        日志文件在/applications/nohup.out中,如果启动过程中报错的话,可以在这里查看原因。

2.2.6、set & get

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringData自定义操作

一、JPQL和SQL 查询 package com.kuang.repositories;import com.kuang.pojo.Customer; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingR…

Datawhale聪明办法学Python(task3变量与函数)

一、课程基本结构 课程开源地址&#xff1a;课程简介 - 聪明办法学 Python 第二版 章节结构&#xff1a; Chapter 0 安装 Installation Chapter 1 启航 Getting Started Chapter 2 数据类型和操作 Data Types and Operators Chapter 3 变量与函数 Variables and Functions Ch…

NE555芯片

首先看一下NE555芯片的实物图以及电路符号&#xff0c;如下图所示。 NE555是使用很广泛且很受欢迎的芯片之一。上到航空航天火箭&#xff0c;下到电子玩具都能看到它的身影。 下图是它的内部结构图&#xff0c;可以更快的去学习并且上手使用这个芯片。最上面是3个5k的电阻&am…

javaEE -17(13000字 CSS3 入门级教程)

一&#xff1a;CSS3 简介 CSS3 是 CSS2 的升级版本&#xff0c;它在 CSS2 的基础上&#xff0c;新增了很多强大的新功能&#xff0c;从而解决一些实际面临的问题&#xff0c;CSS3 在未来会按照模块化的方式去发展&#xff1a;https://www.w3.org/Style/CSS/current-work.html …

DS八大排序之冒泡排序和快速排序

前言 前两期我们已经对"插入排序"&#xff08;直接插入排序和希尔排序&#xff09; 和 "选择排序"&#xff08;直接选择排序和堆排序&#xff09;进行了详细的介绍~&#xff01;这一期我们再来详细介绍一组排序 &#xff1a;"交换排序"即耳熟能…

k8s-1.23版本安装

一、主机初始化 1、修改主机名 hostnamectl set-hostname master hostnamectl set-hostname node1 hostnamectl set-hostname node2 hostnamectl set-hostname node32、主机名解析 echo 192.168.1.200 master >> /etc/hosts echo 192.168.1.201 node1 >>…

普冉(PUYA)单片机开发笔记(10): I2C通信-配置从机

概述 I2C 常用在某些型号的传感器和 MCU 的连接&#xff0c;速率要求不高&#xff0c;距离很短&#xff0c;使用简便。 I2C的通信基础知识请参见《基础通信协议之 IIC详细讲解 - 知乎》。 PY32F003 可以复用出一个 I2C 接口&#xff08;PA3&#xff1a;SCL&#xff0c;PA2&a…

时序预测 | Python实现XGBoost电力需求预测

时序预测 | Python实现XGBoost电力需求预测 目录 时序预测 | Python实现XGBoost电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前最先进的行业预测进行比较…

linux redis-cluster ipv6方式

配置文件&#xff0c;具体字段的含义&#xff0c;可以参考其他文档。 1.单个文件的配置信息 redis_36380.conf requirepass Paas_2024port 36380tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /data/paas/apps/aicache-redis/redis_36380.p…

MyBatis Plus 大数据量查询优化

大数据量操作的场景大致如下&#xff1a; 数据迁移 数据导出 批量处理数据 在实际工作中当指定查询数据过大时&#xff0c;我们一般使用分页查询的方式一页一页的将数据放到内存处理。但有些情况不需要分页的方式查询数据或分很大一页查询数据时&#xff0c;如果一下子将数…

阿里5年经验之谈 —— 浅谈自动化测试方法!

导读 在当今快节奏的软件开发环境中&#xff0c;高质量的代码交付至关重要。而针对经过多次迭代&#xff0c;主要功能趋向稳定的产品&#xff0c;大量传统的重复性手动测试方法已经无法满足高效、快速的需求。为了提高测试效率保证产品质量&#xff0c;本文通过产品实践应用&a…

LeetCode(66)二叉树的最大深度【二叉树】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 二叉树的最大深度 1.题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7]…

DS考研真题总结——客观题(1)

开始整理真题中的客观小题&#xff0c;至于和算法有关的大题统一最后整理~ 定义背诵&#xff1a;数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效…

C语言----文件操作(二)

在上一篇文章中我们简单介绍了在C语言中文件是什么以及文件的打开和关闭操作&#xff0c;在实际工作中&#xff0c;我们不仅仅是要打开和关闭文件&#xff0c;二是需要对文件进行增删改写。本文将详细介绍如果对文件进行安全读写。 一&#xff0c;以字符形式读写文件&#xff…

JVM学习之JVM概述

JVM的整体结构 Hotspot VM是目前市面上高性能虚拟机代表作之一 它采用解释器与即时编译器并存的架构 在今天&#xff0c;Java程序的运行性能已经达到了可以和C/C程序一较高下的地步 Java代码执行流程 具体图为 JVM架构模型 Java编译器输入的指令流基本上是一种基于 栈的指令…

关于负载和驱动能力的问题总结

这两天重新接触到了驱动能力这个说法&#xff0c;之前也听过&#xff0c;但是一直不理解是怎么回事儿&#xff0c;也就没有深究&#xff0c;现在想来&#xff0c;这里面还是有点门道的。 驱动能力&#xff0c;说的是什么呢&#xff1f;应该就是带载能力&#xff0c;而带载能力&…

Linux 中的网站服务管理

目录 1.安装服务 2.启动服务 3.停止服务 4.重启服务 5.开机自启 6.案例 1.安装服务 网址服务程序 yum insatll httpd -y 查看所有服务 systemctl list-unit-files 2.启动服务 systemctl start httpd 查看服务进程&#xff0c;确认是否启动 ps -ef|grep httpd 3.停止…

Windows Linux - 关于IP地址看这一篇就够了

目录 &#x1f959;1 IP地址简介 &#x1f959;2 IP地址分类 &#x1f96a;分类方式1 &#x1f96a;分类方式2 &#x1f96a;特殊的IP地址 - 本机IP地址 &#x1f959;3 域名&#xff1a;便捷的记录IP地址 &#x1f959;4 常用命令 &#x1f959;5 查看网络IP和网关 &…

内网穿透工具,如何保障安全远程访问?

内网穿透工具是一种常见的技术手段&#xff0c;用于在没有公网IP的情况下将本地局域网服务映射至外网。这种工具的使用极大地方便了开发人员和网络管理员&#xff0c;使得他们能够快速建立起本地服务与外部网络之间的通信渠道。然而&#xff0c;在享受高效快捷的同时&#xff0…

windows电脑半夜突然睡眠自动唤醒的问题查找与治理

遇见几次了&#xff0c;半夜起来上厕所&#xff0c;发现休眠的电脑居然自己开了&#xff0c;还得跑过去把电脑再休眠&#xff0c;很烦。昨天晚上居然自动唤醒两次&#xff0c;忍无可忍了&#xff0c;于是开始查找原因。 查询原因如下&#xff0c;解决方面也在后面。 固件 S3 计…