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