有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你就知道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

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

  1. SpringBoot一个依赖搞定Session共享,没有比这更简单的方案了!

    作者:江南一点雨 微信公众号:牧码小子(ID:a_javaboy) 上一篇:推荐10个你不得不关注的NB技术公众号 有的人可能会觉得题目有点夸张,其实不夸张,题目没有使用任何修辞手法!认真读完本文,你 ...

  2. Java盗刷_一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!

    责编:乐乐 链接:oschina.net/news/112586/kk-anti-reptile-released kk-anti-reptile 是适用于基于 spring-boot 开发的分布式系 ...

  3. 一个依赖搞定Spring Boot 配置文件脱敏

    经常会遇到这样一种情况:项目的配置文件中总有一些敏感信息,比如数据源的url.用户名.密码....这些信息一旦被暴露那么整个数据库都将会被泄漏,那么如何将这些配置隐藏呢? 今天介绍一种方案,让你在无感 ...

  4. 超详细的Spring Boot教程,搞定面试官!

    前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置 ...

  5. 一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!

    今日推荐 减少 try-catch ,这样做才叫优雅!让人上瘾的新一代开发神器,彻底告别Controller.Service.Dao等方法SpringBoot实现人脸识别功能相信我,使用 Stream ...

  6. 将你的前端应用打包成docker镜像并部署到服务器?仅需一个脚本搞定

    1.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...

  7. Spring boot——起步依赖

    一.起步依赖 1.是什么 本质上是一个Maven项目对象模型(Project Object Model, POM), 定义了对其他库的传递依赖,这些东西加在一起即支持某项功能. 比如: spring- ...

  8. Spring Boot 起步依赖

    参考书<Spring Boot实战> 1.Spring Boot起步依赖        Spring项目的依赖管理也很费力.需要决定项目要用哪些库,还要考虑库的版本和其他库的版本不会用冲突 ...

  9. python利器app怎么查文献-科研人必备:一个工具搞定文献查阅、数据分析、模型搭建...

    原标题:科研人必备:一个工具搞定文献查阅.数据分析.模型搭建 写论文有多难?这首诗形容得好: 进入学校先选题,踌躇满志万人敌:发现前辈都做过,满脸懵逼加惊奇. 终于找到大空白,我真是个小天才:左试右试 ...

最新文章

  1. linux特殊符号大全
  2. android表格布局最后一个组件,Android布局之TableLayout表格布局
  3. P4130,jzoj1214-[NOI2007]项链工厂【线段树】
  4. 网络(6)-TCP/IP对拥塞控制、滑动窗口如何实现可靠性?
  5. linux系统中存放用户账号信息的文件是,信息安全技术题库:Linux系统中,用户登录密码的hash是存放在()文件中的。...
  6. centos7 yum安装mysql后启动不起来问题
  7. OpenCV搜索文件夹中的图片并保存图片路径和信息
  8. javaswing个人记账系统 java swing mysql实现的个人记账系统源码(1012)
  9. Python——付费/版权歌曲下载
  10. 数学建模——相关系数(4)——斯皮尔曼相关系数(spearman)
  11. 无线Wi-fi中继设置
  12. 给英文文章加音标,建生词表
  13. 2021计算机专业考研科目,2021北京航空航天大学计算机考研科目
  14. sht20中写用户寄存器_哪位帮忙看看下,程序读取SHT20 的温度时就不行,无ACK反馈了...
  15. Linux之串口应用
  16. UNreal 创建一个简单的玻璃材质+金属材质+创建材质实例
  17. PCB板子焊接注意事项及小技巧
  18. VI设计中系统视觉基本要素优漫动游
  19. 融捷能源携手企企通,打造智能化、数字化采购平台
  20. 速腾聚创完成新一轮融资:华兴新经济基金领投 筹备上市

热门文章

  1. web通讯录之登录注册界面
  2. 数据结构实验之栈二:一般算术表达式转换成后缀式
  3. 直播回顾:准确性提升到 5 秒级,ssar 独创的 load5s 指标有多硬核?| 龙蜥技术
  4. 技术干货 | mPaaS 框架下如何使用 Crash SDK 对闪退进行分析?
  5. 海量结构化数据解决方案-表格存储场景解读
  6. 东方希望上云 告诉你数字化门槛儿到底有多高?
  7. 入门云数据库Redis,满足你的高读写性能场景需求
  8. 高性能服务器架构思路【不仅是思路】
  9. ESL:我们如何使用首云混合云产品实现提效降本
  10. 华为在中国建立其全球最大的网络安全透明中心