1、問題概述
不是所有的項目都是單機模式的,當一個項目服務的局域比較廣,用戶體量比較大,數據量較大的時候,我們都會將項目部署到多臺服務器上,這些個服務器都是分布在不同的區域,這樣實現了項目的負載和并發量,但同時也引發了一些問題。如我們將登錄信息放在session中,通過session中的用戶信息判斷用戶是否登錄的時候。如下圖:
從下圖可以看出,當用戶第一次攜帶正確的用戶名和密碼到達服務器1的時候,用戶信息會被存放在服務器1的內存中,當用戶再次發起請求的時候,這個時候可能訪問的是服務器2,這個時候服務器2無法獲取存放在服務器1中的用戶信息,從而引發報錯,提示用戶未登錄。
這個時候我們會有很多的解決方案,本案例講述使用spring-session+redis的解決方案。
Redis是基于內存的,數據的讀寫性能都非常的高。
如下圖:
5.2、Linux中安裝Redis過程
詳細博客:https://blog.csdn.net/tangshiyilang/article/details/129806747
5.3、創建工程并選擇如下包信息
主要包信息:spring-data-redis+spring session包
5.3、工程pom.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.txc</groupId><artifactId>distributed-session</artifactId><version>0.0.1-SNAPSHOT</version><name>distributed-session</name><description>distributed-session</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><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>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
5.4、配置連接Redis和springsession配置信息
store-type: redis:必須要添加這條信息,告訴程序session信息要存入到redis中。
server:port: 8081
spring:data:redis:database: 0host: 192.168.133.145port: 6379timeout: 5000password: 123456session:store-type: redistimeout: 3600redis:namespace: logininfo
5.5、創建UserController實現登錄和查看用戶信息
login:用戶用戶登錄,必須傳入username參數
getUserInfo:用于獲取當前用戶的登錄信息
@RestController
public class UserController {@RequestMapping("/login")public String login(@RequestParam String username,HttpSession session){System.out.println("==========login=============");session.setAttribute("username",username);return "登錄成功";}@RequestMapping("/getUserInfo")public String getUserInfo(HttpSession session){return "當前登錄用戶=>"+session.getAttribute("username");}
}
5.6、在啟動類通過注解開啟
核心注解:@EnableRedisHttpSession
@SpringBootApplication
@EnableRedisHttpSession
public class DistributedSessionApplication {public static void main(String[] args) {SpringApplication.run(DistributedSessionApplication.class, args);}
}
5.7、通過瀏覽器訪問login實現登錄
請求地址:http://localhost:8081/login?username=xiaochun
5.8、登錄之后查看redis中的session信息
sessionAttr:username:存放了用戶登錄的信息
creationTime:session:創建時間
maxInactiveInterval:最大的不活動時間
lastAccessedTime:最后的訪問時間
5.9、基于IDEA啟動兩個工程
我們基于idea創建兩個工程,模擬分布式環境,端口分別是8081和8082端口。
用戶模擬用戶第一次訪問進入服務器1,然后訪問服務器2的時候可以直接獲取訪問服務器1時候的用戶登錄信息。
5.9.1、在idea中選中edit configurations配置項目
5.9.2、選擇Modify options選項
5.9.3、在下拉框中選擇Add VM options
?
5.9.4、在輸入框中輸入端口信息
5.9.5、復制第一個啟動項并修改名稱和端口
5.9.6、分別啟動兩個工程
5.9.7、通過8081號端口訪問login登錄接口
5.9.8、通過8082號端口訪問getUserInfo接口
這個時候我們發現可以直接獲取到session中的信息,因為兩個工程都是使用redis中的存放的session信息。
5.10、清空session信息
sesssion.invalidate();
?
?