编程技术分享平台

网站首页 > 技术教程 正文

Springboot+Redis+Nginx实现Session在多个服务间共享

xnh888 2024-10-07 17:26:34 技术教程 16 ℃ 0 评论

前面讲解了阿里云Linux服务器上安装Nginx的方式(历史文章链接),本篇将结合Springboot(版本1.5.9.RELEASE)和Redis来实现session的共享。

首先我阿里云服务器上已经装过Redis,所以我Windows本地并没有装,Springboot服务直接连接的我云服务器上的Redis。关于在Linux上安装Redis以及通过外网访问等配置,后面有时间我会发表在本平台。

1、首先pom.文件中加入需要的依赖

因为我测试一些功能的需要,这里依赖有些冗余,大家可以视情况进行适当的删减,不进行删减也是可以的。

2、下面图是控制层的实现代码

主要是将Session的类名和id打印到控制台以及返回给页面,以便我们观察结果。

3、关于Springboot服务启动

注意这里启动Springboot服务时,根据pom.xml中是否加入spring-session-data-redis依赖有两种情况需要注意。

3.1、未加入spring-session-data-redis依赖

3.1.1、此时springboot的配置如下面图所示:

application.properties配置文件中指定以application-prod.properties文件中的配置为准,而application-prod.properties文件中配置如下面图所示:

3.1.2、此时Springboot服务可以正常启动,此时Session的类型为org.apache.catalina.session.StandardSessionFacade,如下面图所示:

而在配置好Redis相关配置后,Session也不会存入Redis中,通过Redis客户端也查不到session数据,如下面图所示:

注:spring session存入Redis时,默认是以spring:session:开头的Hash数据结构 。且即使此时放开#spring.session.store-type=Redis的注释,Session也不会存入Redis中,Session类型也依旧如上所示。

3.2、加入spring-session-data-redis依赖后

此时必须在springboot配置中有spring.session.store-type=Redis|JDBC|Hazelcast|none(四种方式,我们使用Redis方式),不然springboot服务会启动失败,如下图所示:

注:关于spring.session.store-type的四种属性

<1、Redis:Session数据存入Redis中,见本篇。

<2、JDBC:会话信息存入数据库中,Spring Session会自动创建spring_session和spring_session_attributes两张表,默认情况下spring_session表存放Session基本信息,如sessionId,最后一次访问时间,创建时间等,spring_session_attributes表存放我们存入session中的数据。attributes_name保存了Session的Key,attributes_bytes以字节形式保存Session的值。

<3、Hazelcast:Session存入Hazelcast中。Hazelcast是一个开源的、高度可扩展的数据分发和集群平台,提供了高效的、可扩展的分布式数据存储、数据缓存。稳定性很高,分布式应用可以使用Hazelcast进行存储数据、同步数据、发布订阅消息等。Hazelcast是基于Java开发的,其客户端有Java, C/C++, .NET以及REST。Hazelcast同时也支持memcache协议。它很好的支持了Hibernate,可以很容易的在当今流行的数据库系统中应用。

<4、None:禁用Spring Session功能。

3.2.1、此时Springboot的配置和3.1.1类似,只是放开了spring.session.store-type项并配置为了Redis。

3.1.2、启动Springboot服务,通过浏览器请求,如下面图所示:

此时我们可以看到,Session的类型已经变成了SessionRepositoryFilter$SessionRepositoryRequestWrapper$HttpSessionWrapper。此时去查询服务器中Redis中的数据,结果如下面图所示:

可以看到sessionid和我们刚刚请求的id一样。而spring:session:sessions:expires:4ab76511-58f7-43c8-bb40-24c2d2c879ab则表示此key会过期,当此key过期后,会自动清除对应的Session信息。默认是1800秒(30分钟),使用命令可以查看还剩余多少时间过期,如下面图所示:

通过HGETALL spring:session:sessions:4ab76511-58f7-43c8-bb40-24c2d2c879ab 命令获取存入的session信息,如下图所示:

其中:

<1、creationTime为创建时间;

<2、maxInactiveInterval为过期时间;

<3、lastAccessedTime为上次访问时间;

<4、以sessionAttr:为前缀的表示Session信息,如图中的sessionAttr:key即为我们控制层方法中设置的Session信息。

至此,我们已经成功的将Session放入云服务器的Redis中了,下面启动两个Springboot服务并利用Nginx来验证下Session在两个应用中的共享吧。(此处为了方便,我仅在本地Windows电脑上进行的操作,并未在云服务器上操作,但原理一样,只是多了把本地Springboot服务和Nginx配置文件上传云服务器,并通过域名访问而已)

4、我们先看下Nginx的配置信息,如下面图所示:

上面图中两个红框为主要的改动点,第一个红框中配置了需要映射的两个后台服务,第二个红框是路由方式。其实这也是我们主要关注的Nginx的两个模块,一个是http模块,一个是location模块。

<1、http模块可以嵌套多个server,并能配置代理、缓存等大多数功能和第三方模块,注意我们在upstream指令中注释掉的ip_hash,Nginx默认以轮询的方式为后台提供反向代理,而若我们将ip_hash放开,则表示固定的客户端总是反向代理到后台的某一个服务器,这种方式如果发生服务器宕机或重启等导致不可用时,Session会话信息会丢失。

<2、location模块主要是配置路由以及各种页面的处理情况,如上图所示location后面的“/”表示拦截所有的请求,所有客户端的请求都会传给http://testsession。

5、同时启动8080和8081两个服务

将Springboot服务打为jar,并在控制台启动,然后再次在控制台输入端口号为8081启动同一个的Springboot服务。如下面图所示:

8080端口服务:

8081端口服务:

6、启动Nginx并多次刷新页面

Nginx默认端口号为80,故url不用带端口号,如下面图所示:

7、观察CMD窗口的两个Springboot服务日志,如下面图所示:

从左右两个图中最上方红框可以看出,左边CMD窗口为8081服务,右边为8080服务,而两个图中均出现了相同id的Session。说明Session在两个服务间是共享的。此时如果8080或8081服务挂掉,是不会影响另一个服务继续使用的,且Session信息也不会丢失。

下面图为云服务器中Redis中的Session信息,可以看到Session的id和上图一样。

本篇完。

持续更新完善中......欢迎关注,共同学习

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表