溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot開發(fā)中分布式集群共享Session的示例分析

發(fā)布時間:2021-12-17 16:59:04 來源:億速云 閱讀:131 作者:柒染 欄目:編程語言

SpringBoot開發(fā)中分布式集群共享Session的示例分析,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

前言

在分布式系統(tǒng)中,為了提升系統(tǒng)性能,通常會對單體項目進(jìn)行拆分,分解成多個基于功能的微服務(wù),如果有條件,可能還會對單個微服務(wù)進(jìn)行水平擴(kuò)展,保證服務(wù)高可用。

那么問題來了,如果使用傳統(tǒng)管理 Session 的方式,我們會遇到什么樣的問題?

案例

這里拿下單舉例,用戶小明在天貓上相中了一個的娃娃,覺得不錯,果斷購買,選尺寸,挑身高,然后確認(rèn)選擇,趕緊提交訂單,然后就跳轉(zhuǎn)到了登錄頁面!小明表示很郁悶,大寫的問號???

小明進(jìn)入娃娃頁面,此時請求通過代理服務(wù)發(fā)送到業(yè)務(wù)系統(tǒng)一。  小明選尺寸,挑身高,此操作并沒有對后端服務(wù)發(fā)送請求。  小明提交訂單,此時請求通過代理服務(wù)發(fā)送到業(yè)務(wù)系統(tǒng)二,然鵝,二系統(tǒng)此時并沒有查詢到小明的登錄信息,就被無情的跳轉(zhuǎn)到登錄頁了。

方案

HttpSession 默認(rèn)使用內(nèi)存來管理 Session,通常服務(wù)端把用戶信息存儲到各自的 Jvm 內(nèi)存中。所以小明下單的時候找不到登錄信息,那么我么何不把用戶信息集中存儲!?

為了測試效果,這里我們搭建一個演示案例,項目涉及 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存儲類型spring.session.store-type=redisspring.redis.database=0spring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.password=123456spring.redis.pool.max-active=8spring.redis.pool.max-wait=-1spring.redis.pool.max-idle=8spring.redis.pool.min-idle=0spring.redis.timeout=3000

簡單的用戶登錄實現(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("密碼錯誤");

      }    }}

配置代理實現(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"

看完上述內(nèi)容,你們掌握SpringBoot開發(fā)中分布式集群共享Session的示例分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI