前言
單機環境下我們session是存儲在應用服務的內存中,但是在分佈式環境 下,這種存儲在應用服務器內存的方案顯然不能實現session共享。本次我們將介紹SpringBoot+Redis實現分佈式環境下Session共享方案。
實現步驟
- 首先引入依賴
<!--redis的依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
spring-session-data-redis 依賴的作用是將session保存到redis的工具類。
2. 添加Session配置類
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = -1)
public class SessionConfig {}
maxInactiveIntervalInSeconds 屬性表示Session失效的時間,單位是毫秒,-1表示永不失效。
3. 配置redis
spring.redis.host=192.168.226.111
spring.redis.database=0
spring.redis.port=6379
測試步驟
將應用分別部署到兩臺服務上,然後通過nginx 實現負載均衡,如下,我將應用配置在了192.168.226.111和192.168.226.112服務器上,然後配置nginx 做轉發,配置如下:
upstream bootDemo {
server 192.168.226.111:8080;
server 192.168.226.112:8080;
}
server {
listen 80;
server_name shoptest.jss.com.cn;
location /spring-boot-session/ {
proxy_pass http://bootDemo/spring-boot-session/;
}
}
然後,調用登錄接口,接口請求的是192.168.226.112服務器,當前會話的sessionId是4cebb851-b9b2-488e-9569-9ace9298bb67存儲的用戶信息是{“password”:“123123”,“userName”:“ceshi”}
然後,我們我們通過 keys "*session*"
指令可以找到 當前存入的用戶如下圖所示:
相關key的說明如下:
//存儲 Session 數據,數據類型hash,可以使用type查看
Key:spring:session:sessions:4cebb851-b9b2-488e-9569-9ace9298bb67
//Redis TTL觸發Session 過期。(Redis 本身功能),數據類型:String
Key:spring:session:sessions:expires:4cebb851-b9b2-488e-9569-9ace9298bb67
//執行 TTL key ,可以查看剩餘生存時間
//定時Job程序觸發Session 過期。(spring-session 功能),數據類型:Set
Key:spring:session:expirations:133337740000
然後,我們請求獲取用戶信息接口,接口請求到了192.168.226.112服務器,可以獲取到登錄用戶信息。
源代碼地址:
https://github.com/XWxiaowei/spring-boot-session-demo