APP下载

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

消息来源:baojiabao.com 作者: 发布时间:2026-05-18

报价宝综合消息SpringBoot一个依赖搞定session共享 没有比这更简单的方案了

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

在传统的单服务架构中,一般来说,只有一个服务器,那么不存在 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 实战

1.1 建立工程

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

建立成功之后,pom.xml 档案如下:

注意:

这里我使用的 Spring Boot 版本是 2.1.4 ,如果使用当前最新版 Spring Boot2.1.5 的话,除了上面这些依赖之外,需要额外新增 Spring Security 依赖(其他操作不受影响,仅仅只是多了一个依赖,当然也多了 Spring Security 的一些预设认证流程)。

1.2 配置 Redis

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

1.3 使用

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

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

接下来 ,专案打包:

打包之后,启动专案的两个例项:

然后先访问 localhost:8080/set 向 8080 这个服务的 Session 中储存一个变数,访问完成后,资料就已经自动同步到 Redis 中 了 :

然后,再呼叫 localhost:8081/get 界面,就可以获取到 8080 服务的 session 中的资料:

此时关于 session 共享的配置就已经全部完成了,session 共享的效果我们已经看到了,但是每次访问都是我自己手动切换服务例项,因此,接下来我们来引入 Nginx ,实现服务例项自动切换。

1.4 引入 Nginx

很简单,进入 Nginx 的安装目录的 conf 目录下(预设是在 /usr/local/nginx/conf),编辑 nginx.conf 档案:

在这段配置中:

upstream 表示配置上游服务器javaboy.org 表示服务器丛集的名字,这个可以随意取名字upstream 里边配置的是一个个的单独服务weight 表示服务的权重,意味者将有多少比例的请求从 Nginx 上转发到该服务上location 中的 proxy_pass 表示请求转发的地址, / 表示拦截到所有的请求,转发转发到刚刚配置好的服务丛集中proxy_redirect 表示设定当发生重定向请求时,nginx 自动修正响应头资料(预设是 Tomcat 返回重定向,此时重定向的地址是 Tomcat 的地址,我们需要将之修改使之成为 Nginx 的地址)。配置完成后,将本地的 Spring Boot 打包好的 jar 上传到 Linux ,然后在 Linux 上分别启动两个 Spring Boot 例项:

其中

nohup 表示当终端关闭时,Spring Boot 不要停止执行& 表示让 Spring Boot 在后台启动配置完成后,重启 Nginx:

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

如上,表示埠为 8081 的 SpringBoot 处理了这个 /set 请求,再访问 /get 请求:

可以看到, /get 请求是被埠为 8080 的服务所处理的。

2 总结

本文主要向大家介绍了 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。

2020-01-03 18:55:00

相关文章