asp.net session 如何知道是哪个浏览器客户端_微服务下的分布式session管理
前言
今天老顧帶著大家了解一下session會(huì)話在微服務(wù)架構(gòu)中采用的技術(shù)方案,以及 企業(yè)應(yīng)用中需要注意的問題。
session作用
我們知道在web應(yīng)用中,web服務(wù)器和瀏覽器之間是用http協(xié)議進(jìn)行通信的,而http協(xié)議是無狀態(tài)的,也就是每個(gè)請(qǐng)求都是獨(dú)立的。如:用戶看一條A新聞,不管是誰看到的都是一模一樣的新聞。也就是跟用戶是誰沒有任何關(guān)系。
但業(yè)務(wù)自身的發(fā)展,需要把不同的內(nèi)容展示給不同的用戶,即信息和用戶狀態(tài)關(guān)聯(lián)起來。如:歷史閱讀列表---列出用戶之前看的新聞。這個(gè)需求就是跟用戶相關(guān),每個(gè)用戶看到的歷史閱讀列表都是不一樣的。
Session的產(chǎn)生就是為了解決這個(gè)問題,把服務(wù)器和客戶端之間進(jìn)行狀態(tài)保持的解決方案。
session原理
瀏覽器在第一次訪問web服務(wù)器,服務(wù)器端會(huì)響應(yīng)一個(gè)sessionId,并且把這個(gè)sessionId傳輸給瀏覽器,并以cookie保存sessionId到瀏覽器本地。
以后的訪問會(huì)把這個(gè)cookie的sessionId以請(qǐng)求頭的方式傳給服務(wù)器,這樣服務(wù)器就可以拿著這個(gè)sessionId進(jìn)行查找,服務(wù)器中有沒有此sessionId對(duì)應(yīng)的用戶,這樣就能標(biāo)識(shí)出哪個(gè)用戶,如果有用戶相關(guān)的業(yè)務(wù),就是利用這個(gè)sessionId返回用戶相關(guān)的業(yè)務(wù)。
本質(zhì)就是瀏覽器客戶端本地保存了sessionId,服務(wù)器端保存了sessionId和用戶信息映射,這樣就實(shí)現(xiàn)了web應(yīng)用有狀態(tài)化。單體架構(gòu)
在早期的單體架構(gòu)中,也就是只有一臺(tái)web服務(wù)器,雖然在web應(yīng)用中也進(jìn)行的分層設(shè)計(jì),但其實(shí)本質(zhì)是在代碼邏輯級(jí)別,本身還是一個(gè)應(yīng)用而已(或者說就是一個(gè)war/jar包)。
這個(gè)時(shí)期的session都是保存在本地的web服務(wù)器內(nèi)存中,非常簡(jiǎn)單就能保持用戶狀態(tài)。
集群/分布式架構(gòu)
隨著業(yè)務(wù)的復(fù)雜度升高,和對(duì)應(yīng)用性能、高可用的需求,系統(tǒng)演變成了集群和分布式架構(gòu)。
集群架構(gòu)可以看服務(wù)器A和服務(wù)器B,部署同一個(gè)應(yīng)用A,就是為了提升性能和高可用目的;服務(wù)器C是部署了另一個(gè)應(yīng)用B,代表系統(tǒng)不是單一業(yè)務(wù),而是多個(gè)應(yīng)用集合的,即分布式架構(gòu)。這個(gè)架構(gòu)中,我們之前的session方案就會(huì)有問題,因?yàn)榉?wù)器端的session是存放在本地內(nèi)存中的。請(qǐng)看下面的流程
1、用戶A第一次訪問系統(tǒng),由負(fù)載均衡器映射到服務(wù)器A中2、會(huì)在服務(wù)器A的本地內(nèi)存中,存放著session
3、用戶A第二次訪問系統(tǒng),又被隨機(jī)分配到了服務(wù)器B中
4、但服務(wù)器B中是沒有存放用戶A的session的,所以此sessionId在服務(wù)器B中找不到對(duì)應(yīng)的session,就會(huì)以為用戶沒有登錄,就會(huì)引導(dǎo)用戶去登錄
5、這樣就導(dǎo)致session不一致的問題。
session復(fù)制
session復(fù)制方案是一個(gè)服務(wù)器端的方案,對(duì)客戶端是透明的,客戶端不需要改變什么。看架構(gòu)圖
這個(gè)方案本質(zhì)是利用了應(yīng)用服務(wù)器自身的特性,如:tomcat。修改一下tomcat的配置文件,就是讓應(yīng)用服務(wù)器之間進(jìn)行session復(fù)制,這樣就可以達(dá)到每個(gè)服務(wù)器都有一樣的session。
這個(gè)方案2-3個(gè)服務(wù)器還行,但服務(wù)器一旦多起來,就會(huì)有問題。1、session之間的復(fù)制就會(huì)占用很大的網(wǎng)絡(luò)帶寬2、session復(fù)制是有時(shí)間延遲的3、服務(wù)器的內(nèi)存是有限的,代表著session存放是有限的session粘性
這個(gè)方案就利用負(fù)載均衡器的特性,把同一個(gè)瀏覽器的同一個(gè)用戶都定向發(fā)送到同一個(gè)服務(wù)器上。看架構(gòu)圖
上圖的核心思路,用戶甲訪問系統(tǒng)被負(fù)載均衡器一直分配到服務(wù)器A上,這樣也就保證了用戶一直在同一個(gè)服務(wù)器中進(jìn)行查找session,保證了用戶session一致性。
不過此方案也存在一些問題:
1、服務(wù)器的內(nèi)存是有限的,代表著session存放是有限的2、這個(gè)方案適用集群架構(gòu),但不適用分布式架構(gòu)3、一旦服務(wù)器拓展數(shù)量,session就會(huì)出現(xiàn)混亂cookie方案
之前的方案都是在服務(wù)器端進(jìn)行改造的,cookie方案是客戶端的方案,就是把session信息保存到cookie中,即用戶信息保存到cookie中,這樣就不需要服務(wù)器保存session(用戶信息)了。每次請(qǐng)求時(shí),把此cookie傳給服務(wù)器端,這樣服務(wù)器端就知道是哪個(gè)用戶了。
此方案比較實(shí)現(xiàn)比較簡(jiǎn)單,而且還不占用服務(wù)器端的內(nèi)存資源。但是此方案的問題很大哦。
1、cookie在客戶端是有限的,存儲(chǔ)容量也是很小的2、安全是很有問題的,因?yàn)楸4嬖诒镜?#xff0c;很容易被人拿到
session外部存儲(chǔ)
之前的服務(wù)器端改造的方案,session都是存儲(chǔ)到本地內(nèi)存中的,導(dǎo)致一些問題。此外部存儲(chǔ)就是把思路進(jìn)行改變,讓session的存儲(chǔ)與應(yīng)用服務(wù)器隔離出來,看架構(gòu)圖
這個(gè)方案的核心就是把session的存儲(chǔ)的地方改造到一個(gè)獨(dú)立的媒介中,這樣就不需要和應(yīng)用服務(wù)器耦合了,客戶端傳入sessionId時(shí),用戶信息的映射關(guān)系直接到這個(gè)獨(dú)立媒介中去查找。
數(shù)據(jù)庫(kù)存儲(chǔ)
存儲(chǔ)媒介的選擇之一就是數(shù)據(jù)庫(kù),就是把session信息存儲(chǔ)到數(shù)據(jù)庫(kù)中。
好處就是session持久化到數(shù)據(jù)庫(kù)中,不會(huì)丟失。但性能比較差,因?yàn)閟ession的訪問是非常頻繁的,會(huì)對(duì)數(shù)據(jù)庫(kù)造成很大壓力,
Memcache存儲(chǔ)
此方案就是把session存儲(chǔ)到memcache中,Memcache-Tomcat-Session就是利用tomcat實(shí)現(xiàn)session的集中化管理的開源方案,修改tomcat配置就行了,使用擴(kuò)展的sessionManager替換tomcat默認(rèn)的Session管理器。
memcache性能比較高,但此方案和tomcat強(qiáng)耦合了,不適合其他的應(yīng)用服務(wù)器,如:jetty。而且memcache無持久化,一旦重啟,session就丟失了。
Redis存儲(chǔ)
redis存儲(chǔ)方案一般結(jié)合spring session方式,把session存儲(chǔ)到redis中。
這個(gè)方案是spring提供的一套Session管理方案,通過一個(gè)SessionFilter將所有請(qǐng)求攔截下來,對(duì)session進(jìn)行管理,此方案的好處就是不與應(yīng)用服務(wù)器耦合,可以部署到任何web應(yīng)用服務(wù)器中。redis也是高性能的緩存服務(wù)器,且可持久化。這個(gè)方案也是官方推薦的。
總結(jié)
到這里老顧已經(jīng)介紹了常用的session管理方案,最終推薦的是spring session方式進(jìn)行session管理,存儲(chǔ)在redis中。小伙伴們看到這里是不是感覺蠻好了,可以在企業(yè)中進(jìn)行應(yīng)用了?
如果企業(yè)小,項(xiàng)目不復(fù)雜,是可以應(yīng)用了。但如果系統(tǒng)很復(fù)雜,有很多業(yè)務(wù)系統(tǒng)都是有session的,那么如何對(duì)session從業(yè)務(wù)角度進(jìn)行管理呢?上面我們介紹cookie方案,小伙伴們有沒有考慮到JWT Token方案,jwt方案又會(huì)怎么樣?留下二個(gè)問題,請(qǐng)小伙伴們仔細(xì)思考下。請(qǐng)持續(xù)關(guān)注老顧的文章,謝謝!!!
總結(jié)
以上是生活随笔為你收集整理的asp.net session 如何知道是哪个浏览器客户端_微服务下的分布式session管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正在更新office_Windows 9
- 下一篇: c++编程例子_如何开始厉害的C语言编程