springboot学习系列:应用集群化之后,session获取值可能会出现为空的情况之解决方案
问题场景
微服务环境下,将一个应用部署为集群式,然后应用内部根据session存取值,会出现问题。因为请求会随机发送到其中几台的机器。本篇博客主要是为了解决该问题。
问题环境
| 软件 | 版本 |
|---|---|
| springboot | 2.1.1.RELEASE |
| redis | 5 |
问题原因
因为是构建了应用集群,并通过nginx网关进行转发。在转发请求过程中,会随机分发到其中一台机器。如果是这样的话,就会导致,前一个获取验证码的请求是应用A,而登录验证的请求是应用B接收处理。这里的sessionId可能是一致的,但是就是获取不到值。
解决方案
如果是这样,就得考虑设置一个统一的session控制器。在这里,因为环境是使用了redis集群,所以博主是使用了spring-session-data-redis 依赖进行处理。大家可以根据项目实际情况进行控制。
1、引入依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2、配置redis
spring.redis.host=localhost # Redis server host.
spring.redis.password= # Login password of the redis server.
spring.redis.port=6379 # Redis server port.
3、配置spring-session
# Session store type.
spring.session.store-type=redis
# Session timeout. If a duration suffix is not specified, seconds is used.
server.servlet.session.timeout=
# Sessions flush mode.
spring.session.redis.flush-mode=on_save
# Namespace for keys used to store sessions.
spring.session.redis.namespace=spring:login:session
结果
在应用集群情况下,可以正常往session存取值。
总结
针对一种问题场景,可以有很多种解决方案。根据项目实际情况进行选择,才能最大程度利用好手头的资源。
引用
随缘求赞
如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以点击关注
可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!


浙公网安备 33010602011771号