微服務(wù)之間的數(shù)據(jù)共享之session
session域是存儲(chǔ)在服務(wù)器端的內(nèi)存中,但是現(xiàn)在使用微服務(wù),各個(gè)功能模塊之間拆分成不同的服務(wù),每個(gè)服務(wù)負(fù)責(zé)某種功能,每個(gè)服務(wù)都是一個(gè)進(jìn)程,所有每個(gè)服務(wù)中的內(nèi)存數(shù)據(jù)是不共享的,故存儲(chǔ)在每個(gè)服務(wù)中的session對(duì)象不可以被所有的微服務(wù)共享。
Session對(duì)象,就是客戶端瀏覽器與服務(wù)器之間建立的互動(dòng)信息狀態(tài)。每一個(gè)不同的用戶連接將得到不同的Session,也就是說(shuō)Session與用戶之間是一種一對(duì)一的關(guān)系。Session在用戶進(jìn)入網(wǎng)站時(shí)由服務(wù)器自動(dòng)產(chǎn)生,并在用戶正常離開站點(diǎn)時(shí)釋放.,現(xiàn)在項(xiàng)目是微服務(wù)項(xiàng)目,有多個(gè)服務(wù),每個(gè)服務(wù)之間的內(nèi)存是不共享的,所有session存儲(chǔ)在某個(gè)服務(wù)的內(nèi)存中其他服務(wù)是獲取不到的。
session對(duì)象:用戶訪問某個(gè)微服務(wù)的時(shí)候,創(chuàng)建了session對(duì)象,為這個(gè)對(duì)象生成一個(gè)唯一的jessionid,這個(gè)jessionid是存儲(chǔ)在cookie對(duì)象中,返回給瀏覽器端,以后客戶端每次給服務(wù)器發(fā)送請(qǐng)求的時(shí)候都會(huì)帶這個(gè)存儲(chǔ)jessionid的cookie。服務(wù)器端如果使用這個(gè)jessionid找到了對(duì)應(yīng)的session,那么就可以直接獲取session域中存儲(chǔ)的數(shù)據(jù),如果服務(wù)器端沒有找到這個(gè)jessionid對(duì)應(yīng)的session,那么服務(wù)器端會(huì)新創(chuàng)建一個(gè)session對(duì)象,給這個(gè)對(duì)象在行創(chuàng)建一個(gè)sessionid去存儲(chǔ)到cookie中返回給瀏覽器,這樣也就修改了jessionid導(dǎo)致即使他訪問原來(lái)的服務(wù),由于jessionid修改了也會(huì)找不到原來(lái)的session數(shù)據(jù)
.
示意圖:
所以把session存儲(chǔ)到內(nèi)存中這樣的方法不適應(yīng)于微服務(wù),解決方法:把session對(duì)象存儲(chǔ)到redis中,只要所以的服務(wù)綁定同一個(gè)redis就可以獲取到redis中的存儲(chǔ)的session數(shù)據(jù)。
實(shí)現(xiàn):導(dǎo)入依賴
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
配置redis
redis:
host: 192.168.127.128
port: 6379
lettuce:
pool:
max-active: 20 #最大連接數(shù),負(fù)值表示沒有限制,默認(rèn)8
max-wait: -1 #最大阻塞等待時(shí)間,負(fù)值表示沒限制,默認(rèn)-1
max-idle: 8 #最大空閑連接,默認(rèn)8
min-idle: 0 #最小空閑連接,默認(rèn)0
配置session域:
session:
store-type: redis
配置好上面后,項(xiàng)目中創(chuàng)建的session都存儲(chǔ)到redis中
demo:使用dateway網(wǎng)關(guān)配置了路由轉(zhuǎn)發(fā),使得訪問微服務(wù)的請(qǐng)求均衡的發(fā)到各個(gè)服務(wù)上,查看各個(gè)微服務(wù)是不是都可以獲取到session中的存儲(chǔ)數(shù)據(jù)。
github地址:git@github.com:zhangyang-yu/SessionProject.git
浙公網(wǎng)安備 33010602011771號(hào)