1. 程式人生 > >springboot中使用spring-session實現共享會話到redis

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資訊是可以共享的。