SpringBoot開發(fā)案例 分布式集群共享Session詳解
前言
在分布式系統(tǒng)中,為了提升系統(tǒng)性能,通常會(huì)對單體項(xiàng)目進(jìn)行拆分,分解成多個(gè)基于功能的微服務(wù),如果有條件,可能還會(huì)對單個(gè)微服務(wù)進(jìn)行水平擴(kuò)展,保證服務(wù)高可用。
那么問題來了,如果使用傳統(tǒng)管理 Session 的方式,我們會(huì)遇到什么樣的問題?
案例
這里拿下單舉例,用戶小明在天貓上相中了一個(gè)的娃娃,覺得不錯(cuò),果斷購買,選尺寸,挑身高,然后確認(rèn)選擇,趕緊提交訂單,然后就跳轉(zhuǎn)到了登錄頁面!小明表示很郁悶,大寫的問號(hào)???
- 小明進(jìn)入娃娃頁面,此時(shí)請求通過代理服務(wù)發(fā)送到業(yè)務(wù)系統(tǒng)一。
- 小明選尺寸,挑身高,此操作并沒有對后端服務(wù)發(fā)送請求。
- 小明提交訂單,此時(shí)請求通過代理服務(wù)發(fā)送到業(yè)務(wù)系統(tǒng)二,然鵝,二系統(tǒng)此時(shí)并沒有查詢到小明的登錄信息,就被無情的跳轉(zhuǎn)到登錄頁了。
方案
HttpSession 默認(rèn)使用內(nèi)存來管理 Session,通常服務(wù)端把用戶信息存儲(chǔ)到各自的 Jvm 內(nèi)存中。所以小明下單的時(shí)候找不到登錄信息,那么我么何不把用戶信息集中存儲(chǔ)!?
為了測試效果,這里我們搭建一個(gè)演示案例,項(xiàng)目涉及 SpringBoot、spring-session、redis、nginx 等相關(guān)組件。
pom.xml引入依賴:
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
配置 redis 參數(shù),軟件自行安裝:
## redis #session存儲(chǔ)類型 spring.session.store-type=redis spring.redis.database=0 spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password=123456 spring.redis.pool.max-active=8 spring.redis.pool.max-wait=-1 spring.redis.pool.max-idle=8 spring.redis.pool.min-idle=0 spring.redis.timeout=3000
簡單的用戶登錄實(shí)現(xiàn),省略部分代碼:
@RequestMapping(value="login",method=RequestMethod.POST) public Result login(String username,String password,HttpServletRequest request,HttpServletResponse response) throws Exception { SysUser user = userService.getUser(username); if(user==null) { return Result.error("用戶不存在"); }else { if(user.getPassword().equals(password)) { request.getSession().setAttribute("user", user); return Result.ok(); }else { return Result.error("密碼錯(cuò)誤"); } } }
配置代理實(shí)現(xiàn),基于 Nginx:
server { listen 80; server_name blog.52itstyle.vip; location / { proxy_pass http://192.168.1.2:8080; } location /cart { proxy_pass http://192.168.1.3:8080$request_uri; } location /order { proxy_pass http://192.168.1.4:8080$request_uri; } }
配置成功后登錄系統(tǒng),在 redis 中查詢用戶信息:
127.0.0.1:6379> keys * 1) "spring:session:expirations:1562577660000" 2) "spring:session:sessions:1076c2bd-95b1-4f23-abd4-ab3780e32f6f" 3) "spring:session:sessions:expires:1076c2bd-95b1-4f23-abd4-ab3780e32f6f"
小結(jié)
這樣,小明就可以開心的買娃娃了!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA 2019.2.2配置Maven3.6.2打開Maven項(xiàng)目出現(xiàn) Unable to import Maven
這篇文章主要介紹了IDEA 2019.2.2配置Maven3.6.2打開Maven項(xiàng)目出現(xiàn) Unable to import Maven project的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12springboot?正確的在異步線程中使用request的示例代碼
這篇文章主要介紹了springboot中如何正確的在異步線程中使用request,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07淺談SpringBoot集成Redis實(shí)現(xiàn)緩存處理(Spring AOP實(shí)現(xiàn))
這篇文章主要介紹了淺談SpringBoot集成Redis實(shí)現(xiàn)緩存處理(Spring AOP實(shí)現(xiàn)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12手把手教你實(shí)現(xiàn)Java第三方應(yīng)用登錄
本文主要介紹了手把手教你實(shí)現(xiàn)Java第三方應(yīng)用登錄,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08