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共享問題的原理非常簡單,就是把原本存儲(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)文章
springboot + JPA 配置雙數(shù)據(jù)源實(shí)戰(zhàn)
這篇文章主要介紹了springboot + JPA 配置雙數(shù)據(jù)源實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解
這篇文章主要介紹了Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09Java中的String對(duì)象數(shù)據(jù)類型全面解析
首先String不屬于8種基本數(shù)據(jù)類型,String是一個(gè)對(duì)象,因?yàn)閷?duì)象的默認(rèn)值是null,所以String的默認(rèn)值也是null;但它又是一種特殊的對(duì)象,有其它對(duì)象沒有的一些特性2012-11-11詳解SpringBoot整合RabbitMQ如何實(shí)現(xiàn)消息確認(rèn)
這篇文章主要介紹了SpringBoot整合RabbitMQ是如何實(shí)現(xiàn)消息確認(rèn)的,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05idea中使用SonarLint進(jìn)行代碼規(guī)范檢測(cè)及使用方法
這篇文章主要介紹了idea中使用SonarLint進(jìn)行代碼規(guī)范檢測(cè),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08IntelliJ IDEA 老司機(jī)居然還沒用過 Stream Trace功能(問題小結(jié))
很多朋友酷愛Java8 Stream功能,但是在使用過程中總不是那么順利,下面通過本文給大家分享idea Stream Trace調(diào)試過程遇到的問題,需要的朋友參考下吧2021-05-05