SpringBoot中的共享Session域詳解
Session
正常情況下,HttpSession是通過Servlet容器創(chuàng)建并進(jìn)行管理的,創(chuàng)建成功之后都是保存在內(nèi)存中。如果開發(fā)者需要對(duì)項(xiàng)目進(jìn)行橫向擴(kuò)展搭建集群,那么可以利用一些硬件或者軟件工具來做負(fù)載均衡。
此時(shí),來自同一用戶的HTTP請(qǐng)求就有可能被分發(fā)到不同的實(shí)例上去,如何保證各個(gè)實(shí)例之間Session的同步就成為一個(gè)必須解決的問題。
Spring Boot 提供了自動(dòng)化的Session 共享配置,它結(jié)合Redis可以非常方便地解決這個(gè)問題。
使用Redis解決Session共享問題的原理非常簡(jiǎn)單,就是把原本存儲(chǔ)在不同服務(wù)器上的Session拿出來放在一個(gè)獨(dú)立的服務(wù)器上,如圖所示

當(dāng)一個(gè)請(qǐng)求到達(dá)Nginx服務(wù)器后,首先進(jìn)行請(qǐng)求分發(fā),假設(shè)請(qǐng)求被real serverl 處理了,real server 1在處理請(qǐng)求時(shí),無論是存儲(chǔ)Session還是讀取Session,都去操作Session服務(wù)器而不是操作自身內(nèi)存中的Session,其他real server在處理請(qǐng)求時(shí)也是如此,這樣就可以實(shí)現(xiàn)Session共享了。
Session共享配置
Spring Boot中的Session共享配置非常容易,創(chuàng)建Spring Boot Web 項(xiàng)目,添加Redis和 Session依賴,代碼如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!--去除Lettuce-->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.6.0</version>
</dependency>
除了Redis依賴之外,這里還要提供spring-session-data-redis依賴,Spring Session可以做到透明化地替換掉應(yīng)用的Session容器。
項(xiàng)目創(chuàng)建成功后,在application.properties中進(jìn)行Redis基本連接信息配置,代碼如下:
spring.redis.database=0 spring.redis.host=120.55.61.170 spring.redis.port=6379 spring.redis.password=123@456 spring.redis.jedis.pool.max-active=8 spring.redis.jedis.pool.max-idle=8 spring.redis.jedis.pool.max-wait=-1ms spring.redis.jedis.pool.min-idle=0
然后創(chuàng)建一個(gè)Controller用來執(zhí)行測(cè)試操作,代碼如下:
@RestController
public class HelloController {
@Value("${server.port}")
String port;
@GetMapping("/save")
public String saveName(String name, HttpSession session) {
session.setAttribute("name", name);
return port;
}
@GetMapping("/get")
public String getName(HttpSession session) {
return port + ":" +session.getAttribute("name").toString();
}
}
這里提供了兩個(gè)方法,一個(gè) save接口用來向Session中存儲(chǔ)數(shù)據(jù),還有一個(gè)get接口用來從Session中獲取數(shù)據(jù),這里注入了項(xiàng)目啟動(dòng)的端口號(hào)server.port,主要是為了區(qū)分到底是哪個(gè)服務(wù)器提供的服務(wù)。
另外,雖然還是操作的HttpSession,但是實(shí)際上HttpSession容器已經(jīng)被透明替換,真正的Session 此時(shí)存儲(chǔ)在Redis服務(wù)器上。
項(xiàng)目創(chuàng)建完成后,將項(xiàng)目打成iar包上傳到CentOS 上。
然后執(zhí)行如下兩條命令啟動(dòng)項(xiàng)目:
nohup java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8001 & nohup java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8002 &
nohup表示不掛斷程序運(yùn)行,即當(dāng)終端窗口關(guān)閉后,程序依然在后臺(tái)運(yùn)行,最后的&表示讓程序在后臺(tái)運(yùn)行。
–server.port表示設(shè)置啟動(dòng)端口,一個(gè)為8080,另一個(gè)為8081。啟動(dòng)成功后,接下來就可以配置負(fù)載均衡器了。
到此這篇關(guān)于SpringBoot中的共享Session域詳解的文章就介紹到這了,更多相關(guān)SpringBoot共享Session域內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Security使用Lambda DSL配置流程詳解
Spring Security 5.2 對(duì) Lambda DSL 語法的增強(qiáng),允許使用lambda配置HttpSecurity、ServerHttpSecurity,重要提醒,之前的配置方法仍然有效。lambda的添加旨在提供更大的靈活性,但是用法是可選的。讓我們看一下HttpSecurity的lambda配置與以前的配置樣式相比2023-02-02
Java final 修飾符知識(shí)點(diǎn)總結(jié)(必看篇)
下面小編就為大家?guī)硪黄狫ava final 修飾符知識(shí)點(diǎn)總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
Java 使用keytool創(chuàng)建CA證書的操作
這篇文章主要介紹了Java 使用keytool創(chuàng)建CA證書的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01
JavaWeb實(shí)現(xiàn)用戶登錄與注冊(cè)功能(服務(wù)器)
這篇文章主要介紹了JavaWeb實(shí)現(xiàn)用戶登錄與注冊(cè)功能,服務(wù)器部分的關(guān)鍵代碼實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
舉例講解Java的Spring框架中AOP程序設(shè)計(jì)方式的使用
這篇文章主要介紹了Java的Spring框架中AOP程序設(shè)計(jì)方式的使用講解,文中舉的AOP下拋出異常的例子非常實(shí)用,需要的朋友可以參考下2016-04-04
Servlet輸出一個(gè)驗(yàn)證碼圖片的實(shí)現(xiàn)方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Servlet輸出一個(gè)驗(yàn)證碼圖片的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

