SpringBoot中的共享Session域詳解
Session
正常情況下,HttpSession是通過Servlet容器創(chuàng)建并進行管理的,創(chuàng)建成功之后都是保存在內(nèi)存中。如果開發(fā)者需要對項目進行橫向擴展搭建集群,那么可以利用一些硬件或者軟件工具來做負(fù)載均衡。
此時,來自同一用戶的HTTP請求就有可能被分發(fā)到不同的實例上去,如何保證各個實例之間Session的同步就成為一個必須解決的問題。
Spring Boot 提供了自動化的Session 共享配置,它結(jié)合Redis可以非常方便地解決這個問題。
使用Redis解決Session共享問題的原理非常簡單,就是把原本存儲在不同服務(wù)器上的Session拿出來放在一個獨立的服務(wù)器上,如圖所示
當(dāng)一個請求到達Nginx服務(wù)器后,首先進行請求分發(fā),假設(shè)請求被real serverl 處理了,real server 1在處理請求時,無論是存儲Session還是讀取Session,都去操作Session服務(wù)器而不是操作自身內(nèi)存中的Session,其他real server在處理請求時也是如此,這樣就可以實現(xiàn)Session共享了。
Session共享配置
Spring Boot中的Session共享配置非常容易,創(chuàng)建Spring Boot Web 項目,添加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容器。
項目創(chuàng)建成功后,在application.properties中進行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)建一個Controller用來執(zhí)行測試操作,代碼如下:
@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(); } }
這里提供了兩個方法,一個 save接口用來向Session中存儲數(shù)據(jù),還有一個get接口用來從Session中獲取數(shù)據(jù),這里注入了項目啟動的端口號server.port,主要是為了區(qū)分到底是哪個服務(wù)器提供的服務(wù)。
另外,雖然還是操作的HttpSession,但是實際上HttpSession容器已經(jīng)被透明替換,真正的Session 此時存儲在Redis服務(wù)器上。
項目創(chuàng)建完成后,將項目打成iar包上傳到CentOS 上。
然后執(zhí)行如下兩條命令啟動項目:
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表示不掛斷程序運行,即當(dāng)終端窗口關(guān)閉后,程序依然在后臺運行,最后的&表示讓程序在后臺運行。
–server.port表示設(shè)置啟動端口,一個為8080,另一個為8081。啟動成功后,接下來就可以配置負(fù)載均衡器了。
到此這篇關(guān)于SpringBoot中的共享Session域詳解的文章就介紹到這了,更多相關(guān)SpringBoot共享Session域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot + JPA 配置雙數(shù)據(jù)源實戰(zhàn)
這篇文章主要介紹了springboot + JPA 配置雙數(shù)據(jù)源實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解
這篇文章主要介紹了Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09Java中的String對象數(shù)據(jù)類型全面解析
首先String不屬于8種基本數(shù)據(jù)類型,String是一個對象,因為對象的默認(rèn)值是null,所以String的默認(rèn)值也是null;但它又是一種特殊的對象,有其它對象沒有的一些特性2012-11-11詳解SpringBoot整合RabbitMQ如何實現(xiàn)消息確認(rèn)
這篇文章主要介紹了SpringBoot整合RabbitMQ是如何實現(xiàn)消息確認(rèn)的,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05idea中使用SonarLint進行代碼規(guī)范檢測及使用方法
這篇文章主要介紹了idea中使用SonarLint進行代碼規(guī)范檢測,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08IntelliJ IDEA 老司機居然還沒用過 Stream Trace功能(問題小結(jié))
很多朋友酷愛Java8 Stream功能,但是在使用過程中總不是那么順利,下面通過本文給大家分享idea Stream Trace調(diào)試過程遇到的問題,需要的朋友參考下吧2021-05-05