springboot中使用spring-session实现共享会话到redis

在集群环境中做session共享是必不可少的一步,你想想当用户的请求经过nginx转发到A机器进行登录,然后下一步的操作转发到了B机器,这个时候用户信息是存储在A机器上的web容器中,B机器就识别不了这个用户,这个时候就需要做session共享了。

传统session共享解决方案有:

1)使用tomcat自身的集群方式:session信息在不同tomcat的jvm中复制,无法做到大规模集群;

2)nginx根据ip hash方式:这种方式比较容易出现热点,和雪崩;

3)tomcat session manager 方法存储:这种方法服务器只能使用 tomcat ,但网上有针对 memcached 和 redis 实现,直接配置就行了。

4)使用 filter 方法存储:这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于 tomcat ,而且实现的原理比较简单容易控制。可以使用 memcached-session-filter,官方网址:http://code.google.com/p/memcached-session-filter/

今天我们介绍的spring-session也是基于filter的。

1、在springboot中配置spring-session:

1)在springboot的pom.xml中引入:

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

2)在application.properties中添加:

spring.session.store-type=redis
spring.redis.host=abc.redis
spring.redis.password=123
spring.redis.port=19822

指定redis的地址和端口。就这样就可以了,spring session就可以接管默认的session管理了,将session信息存储在redis中了。(spring-session除了redis还支持其他存储)

注:用户用到的登录实体类(例如:User)需要实现序列化接口,否则spring-session会报错

3)测试:

启动项目后,在控制台上可以看到springboot已经注册了一个springSessionRepositoryFilter的过滤器,这个filter就是用来做session的。


用户登录后,在redis中可以发现session相关信息。


4)使用nginx的upstream搭建负载均衡:

部署多台上述后端服务,使用nginx的upstream搭建一套负载均衡后,不同服务之间的session信息是可以共享的。


猜你喜欢

转载自blog.csdn.net/liuxiao723846/article/details/80709096
今日推荐