Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!

有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你就知道gblfy说的是对的了!

文章目录

    • 一、背景
    • 二、分析思路
    • 三、实战
      • 1. 创建工程
      • 2. pom.xml
      • 3. redis配置
      • 4. 使用
      • 5. 项目打包
      • 6. 启动项目的两个实例
      • 7. 浏览器验证
      • 8. redis变量查询
      • 9. 获取8080的服务
    • 二、Nginx加入
      • 2.0. nginx安装
      • 2.1. 修改配置文件
      • 2.2. 配置说明
      • 2.3. 上传项目jar到linux服务器
      • 2.3. 启动两个 Spring Boot 实例
    • 三、验证
      • 3.1. 启动Nginx
      • 3.2. 手动清除 Redis 上的数据
      • 3.3. 浏览器访问保存数据到session中
      • 3.4. 再访问 /get 请求
      • 3.5. 总结
      • 3.6. 本文源码地址

一、背景

在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 Session 共享问题,但是在分布式/集群项目中,Session 共享则是一个必须面对的问题,先看一个简单的架构图:
在这里插入图片描述
在这样的架构中,会出现一些单服务中不存在的问题,例如客户端发起一个请求,这个请求到达 Nginx 上之后,被 Nginx 转发到 Tomcat A 上,然后在 Tomcat A 上往 session 中保存了一份数据,下次又来一个请求,这个请求被转发到 Tomcat B 上,此时再去 Session 中获取数据,发现没有之前的数据。对于这一类问题的解决,思路很简单,就是将各个服务之间需要共享的数据,保存到一个公共的地方(主流方案就是 Redis)
在这里插入图片描述

二、分析思路

当所有 Tomcat 需要往 Session 中写数据时,都往 Redis 中写,当所有 Tomcat 需要读数据时,都从 Redis 中读。这样,不同的服务就可以使用相同的 Session 数据了。

这样的方案,可以由开发者手动实现,即手动往 Redis 中存储数据,手动从 Redis 中读取数据,相当于使用一些 Redis 客户端工具来实现这样的功能,毫无疑问,手动实现工作量还是蛮大的。

一个简化的方案就是使用 Spring Session 来实现这一功能,Spring Session 就是使用 Spring 中的代理过滤器,将所有的 Session 操作拦截下来,自动的将数据 同步到 Redis 中,或者自动的从 Redis 中读取数据。

对于开发者来说,所有关于 Session 同步的操作都是透明的,开发者使用 Spring Session,一旦配置完成后,具体的用法就像使用一个普通的 Session 一样。

三、实战

1. 创建工程

首先 创建一个 Spring Boot 工程,引入 Web、Spring Session 以及 Redis:

2. pom.xml

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

注意:
这里我使用的 Spring Boot 版本是2.2.2.RELEASE ,如果使用低版 2.1.4.RELEASE 的话,可以不添加 Spring Security 依赖

3. redis配置

spring:redis:host: 192.168.43.122port: 6379password:database: 0

这里的 Redis ,我虽然配置了四行,但是考虑到端口默认就是 6379 ,database 默认就是 0,所以真正要配置的,其实就是两行。

4. 使用

配置完成后 ,就可以使用 Spring Session 了,其实就是使用普通的 HttpSession ,其他的 Session 同步到 Redis 等操作,框架已经自动帮你完成了:

/*** @author gblfy* @Description https://www.gblfy.com* @Date 2019/12/8 15:45*/
@RestController
public class HelloController {@Value("${server.port}")Integer port;@GetMapping("/set")public String set(HttpSession session) {session.setAttribute("user", "gblfy");return String.valueOf(port);}@GetMapping("/get")public String get(HttpSession session) {return session.getAttribute("user") + ":" + port;}
}

考虑到一会 Spring Boot 将以集群的方式启动 ,为了获取每一个请求到底是哪一个 Spring Boot 提供的服务,需要在每次请求时返回当前服务的端口号,因此这里我注入了 server.port 。

5. 项目打包

在这里插入图片描述

6. 启动项目的两个实例

java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port=8081

7. 浏览器验证

先访问 localhost:8080/set 向 8080 这个服务的 Session 中保存一个变量,访问完成后,数据就已经自动同步到 Redis 中 了 :
在这里插入图片描述

8. redis变量查询

在这里插入图片描述

9. 获取8080的服务

再调用 localhost:8081/get 接口,就可以获取到 8080 服务的 session 中的数据:
在这里插入图片描述
此时关于 session 共享的配置就已经全部完成了,session 共享的效果我们已经看到了,但是每次访问都是我自己手动切换服务实例,因此,接下来我们来引入 Nginx ,实现服务实例自动切换。

二、Nginx加入

2.0. nginx安装

https://gblfy.blog.csdn.net/article/details/103447161

2.1. 修改配置文件

很简单,进入 Nginx 的安装目录的 conf 目录下(默认是在 /usr/local/nginx/conf),编辑 nginx.conf 文件:
在这里插入图片描述

upstream gblfy.cn{server 127.0.0.1:8080 weight=1;server 127.0.0.1:8081 weight=2;}server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {proxy_pass http://gblfy.cn;proxy_redirect default;#root   html;#index  index.html index.htm;}

2.2. 配置说明

标签说明
upstream表示配置上游服务器,做负载用
gblfy.cn表示服务器集群的名字,这个可以随意取名字
upstream里边配置的是一个个的单独服务,相当于一个tomcat
weight表示服务的权重,意味者将有多少比例的请求从 Nginx 上转发到该服务上
location 中的 proxy_pass表示请求转发的地址
/表示拦截到所有的请求,转发转发到刚刚配置好的服务集群中
proxy_redirect表示设置当发生重定向请求时,nginx 自动修正响应头数据(默认是 Tomcat 返回重定向,此时重定向的地址是 Tomcat 的地址,我们需要将之修改使之成为 Nginx 的地址

2.3. 上传项目jar到linux服务器

配置完成后,将本地的 Spring Boot 打包好的 jar 上传到 Linux

2.3. 启动两个 Spring Boot 实例

然后在 Linux 上分别启动两个 Spring Boot 实例:

nohup java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port=8080 &
nohup java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port=8081 &
标签说明
nohup表示当终端关闭时,Spring Boot 不要停止运行
&表示让 Spring Boot 在后台启动

注意:如果加入了spring-boot-starter-security依赖,建议使用下面启动,因为启动时会生成spring-boot-starter-security登录密码,等会需要用。

java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar springboot2-session-share-0.0.1-SNAPSHOT.jar --server.port=8081

在这里插入图片描述
在这里插入图片描述
用户名默认:user

三、验证

预判:Nginx 启动成功后,我们首先手动清除 Redis 上的数据,然后访问 192.168.66.128/set 表示向 session中保存数据,这个请求首先会到达 Nginx 上,再由 Nginx 转发给某一个 SpringBoot 实例

3.1. 启动Nginx

cd /usr/local/nginx/sbin/./nginx

在这里插入图片描述

3.2. 手动清除 Redis 上的数据

在这里插入图片描述

3.3. 浏览器访问保存数据到session中

在这里插入图片描述
如上,表示端口为 8081 的 SpringBoot 处理了这个 /set 请求

3.4. 再访问 /get 请求

在这里插入图片描述
可以看到, /get 请求是被端口为 8080 的服务所处理的

3.5. 总结

本文主要向大家介绍了 Spring Session 的使用,另外也涉及到一些 Nginx 的使用 ,虽然本文较长,但是实际上 Spring Session 的配置没啥。

我们写了一些代码,也做了一些配置,但是全都和 Spring Session 无关,配置是配置 Redis,代码就是普通的 HttpSession,和 Spring Session 没有任何关系!

唯一和 Spring Session 相关的,可能就是我在一开始引入了 Spring Session 的依赖吧!

如果大家没有在 SSM 架构中用过 Spring Session ,可能不太好理解我们在 Spring Boot 中使用 Spring Session 有多么方便,因为在 SSM 架构中,Spring Session 的使用要配置三个地方 ,一个是 web.xml 配置代理过滤器,然后在 Spring 容器中配置 Redis,最后再配置 Spring Session,步骤还是有些繁琐的,而 Spring Boot 中直接帮我们省去了这些繁琐的步骤!不用再去配置 Spring Session。


好了 ,本文就说到这里,有问题欢迎留言讨论 ,本文相关案例我已经上传到 码云 ,大家可以自行下载。

3.6. 本文源码地址

https://gitee.com/gb_90/SpringBoot2_Practical_Column

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

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

相关文章

孩子学计算机最佳年龄,孩子学编程最佳年龄是几岁

孩子学编程最佳年龄是几岁2021-01-18 16:58:11文/董玉莹孩子学习编程的最好是几岁&#xff1f;本文整理了相关内容&#xff0c;欢迎阅读。孩子学习编程的最好是几岁6-18岁&#xff01;从国内外的典型案例来看6-18岁是孩子学习“编程”的最佳时机&#xff0c;这个阶段的孩子左右…

python画两条曲线_python – 在Matplotlib中绘制两个图之间的线

在许多情况下,来自其他答案的解决方案是次优的(因为只有在计算点之后没有对图进行任何更改时它们才有效). 更好的解决方案是使用专门设计的ConnectionPatch&#xff1a; import matplotlib.pyplot as plt from matplotlib.patches import ConnectionPatch import numpy as np f…

5G基站功耗,到底有多大?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 小枣君来源 | 鲜枣课堂前不久&#xff0c;从某运营商流出的一张图&#xff0c;在小枣君的朋友圈里被广泛传播。就是这张&#xff08;点击可看放大观看&#xff09;&#xff1a;图中显示的&#xff0c;是该运营商在广州、深圳…

“前端+应用”两大监控利器商业化首发 ARMS领跑APM市场

摘要&#xff1a; 日前&#xff0c;阿里巴巴中间件&#xff08;Aliware&#xff09;旗下产品业务实时监控服务ARMS正式商用。首发商用的ARMS目前涵盖应用监控和前端监控两大功能。由此&#xff0c;ARMS的商业化正式填补了阿里云在APM(Application Performance Management)领域空…

Spring Boot2 整合 Shiro ,两种方式全总结!

前言:在 Spring Boot 中做权限管理&#xff0c;一般来说&#xff0c;主流的方案是 Spring Security &#xff0c;但是&#xff0c;仅仅从技术角度来说&#xff0c;也可以使用 Shiro。 文章目录一、Spring Security 和 Shiro 的比较二、原生的整合2.1. 创建一个 Spring Boot 项目…

html5 coverflow,使用FancyCoverFlow实现3D无限循环切换视图

FancyCoverFlow重写了gallery实现了画廊特效。这里记录下具体的使用方法&#xff1a;1 在布局文件中添加控件android:id"id/fancy_cover"android:layout_width"match_parent"android:layout_height"wrap_content"android:layout_marginTop"…

5G精华问答 | 5G关键技术解读

5G的概念虽然很早就已经提出&#xff0c;但是对于大多数用户来说&#xff0c;真正听到并且对5G有了初步的了解还是在今年。今天就让我们来看看关于5G的精华问答吧。1Q&#xff1a;5G标准是怎么来的&#xff0c;由谁制定的&#xff1f;A&#xff1a;5G是由“第三代合作伙伴计划组…

关于python的保留字_Python中的保留字

原博文 2020-01-29 20:03 − Python 包含的保留字可以执行如下命令进行查看&#xff1a; →import keyword →keyword.kwlist [False, None, True, and, as, assert, break, class, continue, d...01000 相关推荐 2019-09-28 21:13 − Python python是一种跨平台的计算机程序设…

Spring Boot2 整合 Ehcache

用惯了 Redis &#xff0c;很多人已经忘记了还有另一个缓存方案 Ehcache &#xff0c;是的&#xff0c;在 Redis 一统江湖的时代&#xff0c;Ehcache 渐渐有点没落了&#xff0c;不过&#xff0c;我们还是有必要了解下 Ehcache &#xff0c;在有的场景下&#xff0c;我们还是会…

传奇谢幕,回顾霍金76载传奇人生

摘要&#xff1a; 根据外媒报道&#xff0c;著名物理学家斯蒂芬威廉霍金&#xff08;Stephen William Hawking&#xff09;去世&#xff0c;享年76岁&#xff0c;霍金的家人已经确认了这一消息。 原文地址&#xff1a;http://click.aliyun.com/m/43771/ “在爱因斯坦生日这天&a…

数据中台与苏秦挂六国相印

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 一一来源 | 边缘计算社区阅读本文前先思考一个问题&#xff1a;数据中台如何创造更多价值&#xff1f;1梁宁看中台——什么是数据中台梁宁老师是阿里巴巴的湖畔大学产品模块学术主任、百度集团顾问。有人问梁宁&#xff0c;中…

python中函数定义_Python中函数的定义与使用

原博文 2020-02-27 16:46 − 一、函数基本定义 定义函数的目的是为了让一段代码可以被重复使用 函数定义的语法&#xff1a; def 函数名([参数&#xff0c;参数.....]): 函数主体代码(多行代码) [return [返回值]]注&#xff1a;函数中的函数体都通过缩进来定义 实例一&#xf…

非计算机专业教学改革,非计算机专业算法分析与设计教学改革论文

非计算机专业算法分析与设计教学改革论文【摘要】算法分析与设计不仅是计算机专业的核心课程&#xff0c;同时也是与计算机有关的非计算机专业的专业课。本人针对非计算机专业学生在学习过程中存在的若干问题&#xff0c;就教学内容、教学手段和考核方式等方面提出了改革措施。…

阿里SaaS性能测试平台PTS最佳实践

摘要&#xff1a; PTS&#xff08;Performance Testing Service&#xff09;是web化的卓越的SaaS性能测试平台&#xff0c;具备强大的分布式压测能力&#xff0c;可方便的模拟海量用户的真实业务场景。PTS铂金版在功能上强调页面可视化编排&#xff0c;目前也在快速迭代中&…

go 根据输入类型执行对应的方法_安全很重要:Go项目的安全评估技术

在今年夏天我们对Kubernetes的评估成功之后&#xff0c;我们收到了大量Go项目的安全评估需求。为此&#xff0c;我们将在其他编译语言中使用过的安全评估技术和策略调整适配到多个Go项目中。我们从了解语言的设计开始&#xff0c;识别出开发人员可能无法完全理解语言语义特性的…

云化要求下,数据库架构如何演进?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者简介&#xff1a;王涛SequoiaDB联合创始人&CTO如今&#xff0c;大型企业如金融企业和银行等&#xff0c;在下一代的微服务架构转型要求下&#xff0c;需要基础软件和数据平台能够实现原生的云化&#xff0c;以满足微服务架构…

看阿里云如何为直播用户营造临场沉浸感?

摘要&#xff1a; 2016年可以说是VR元年&#xff0c;从Facebook的Oculus&#xff0c;HTC的Vive到Sony的PS VR&#xff0c;层出不穷的VR设备和VR内容让用户逐步开始体验到了虚拟现实的魅力。VR视频和VR直播俨然已经成为了展览会议、活动赛事的标配&#xff0c;甚至向婚庆、新闻、…

html计时器组件,vue 计时器组件的实现代码

整理文档&#xff0c;搜刮出一个vue 计时器组件的代码&#xff0c;稍微整理精简一下做下分享。:sendSync"sendSync":autoStart"autoStart":defaultVal"defaultVal">{{countString}}export default {data() {return {isStart: false,globalTim…

苹果遭集体诉讼;华为或年底推出鸿蒙系统中低端智能手机;Facebook雇人记录用户语音通话以改善AI技术……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

map语法获取index_复习Elasticsearch的基础语法(一)

之前实践过的Elasticsearch到现在基本上的语法我都回忆不起来了&#xff0c;所以准备写篇文章帮助自己复习一下&#xff0c;没有什么技术含量的分享&#xff0c;但是也分享给想初步了解的朋友们。就不介绍Elasticsearch了&#xff0c;直接进入正文(手动分割线0.0)-------------…