在 Web 應(yīng)用程序中丧叽,用戶會話管理對于管理用戶狀態(tài)非常重要缆巧。 在本文中蓖康,我們將了解在集群環(huán)境中我們一直遵循的管理用戶會話的方法是什么蓉坎,以及我們?nèi)绾问褂?Spring Session 以更簡單、更具可擴(kuò)展性的方式實(shí)現(xiàn)它唠粥。
通常在生產(chǎn)環(huán)境中疏魏,我們會有多個(gè)服務(wù)器節(jié)點(diǎn),在它們前面有一個(gè)負(fù)載均衡器厅贪,所有客戶端流量都將通過負(fù)載均衡器到達(dá)其中一個(gè)服務(wù)器節(jié)點(diǎn)蠢护。 因此雅宾,我們需要一些機(jī)制來使集群環(huán)境中的每個(gè)客戶端都可以使用用戶會話數(shù)據(jù)养涮。
傳統(tǒng)上,我們一直使用以下技術(shù)來管理會話:
- Single Node Server
- Multi-Node Server with Load Balancer and Sticky sessions
- Multi-Node Server with Load Balancer and Session Replication
- Multi-Node Server with Load Balancer and Session Data in a Persistent DataStore
讓我們簡要地看一下這些方法眉抬。
1. Single Node Server
如果您的應(yīng)用程序?qū)δ臉I(yè)務(wù)來說不是關(guān)鍵服務(wù)贯吓,不會有太多并發(fā)用戶并且可以接受一些停機(jī)時(shí)間,那么我們可以進(jìn)行單節(jié)點(diǎn)服務(wù)器部署蜀变,如下所示:
在此模型中悄谐,對于每個(gè)瀏覽器客戶端,在服務(wù)器上創(chuàng)建一個(gè)會話對象(在 Java 的情況下為 HttpSession)库北,并且 SESSION_ID 將設(shè)置為瀏覽器上的 cookie 以標(biāo)識會話對象爬舰。 但是對于大多數(shù)應(yīng)用程序來說,這種單服務(wù)器節(jié)點(diǎn)部署是不可接受的寒瓦,因?yàn)槿绻?wù)器出現(xiàn)故障情屹,服務(wù)將完全停止。
2. Multi-Node Server with Sticky Sessions
為了使我們的應(yīng)用程序具有高可用性并滿足更多用戶的需求杂腰,我們可以在負(fù)載均衡器后面設(shè)置多個(gè)服務(wù)器節(jié)點(diǎn)垃你。 在 Sticky Sessions 方法中,我們將負(fù)載均衡器配置為將來自同一客戶端的所有請求路由到同一節(jié)點(diǎn)喂很。
在此模型中惜颇,用戶會話將在任何一個(gè)服務(wù)器節(jié)點(diǎn)上創(chuàng)建,并且來自該客戶端的所有進(jìn)一步請求將被發(fā)送到同一節(jié)點(diǎn)少辣。 但這種方法的問題是凌摄,如果服務(wù)器節(jié)點(diǎn)出現(xiàn)故障,則該服務(wù)器上的所有用戶會話都將消失漓帅。
3. Multi-Node Server with Session Replication
在此模型中锨亏,用戶會話數(shù)據(jù)將在所有服務(wù)器節(jié)點(diǎn)上復(fù)制林说,以便任何請求都可以路由到任何服務(wù)器節(jié)點(diǎn)。 即使一個(gè)節(jié)點(diǎn)出現(xiàn)故障屯伞,客戶端請求也可以由另一個(gè)節(jié)點(diǎn)提供服務(wù)腿箩。
但是 Session Replication 需要更好的硬件支持,并且涉及一些特定于服務(wù)器的配置劣摇。
4. Multi-Node Server with Session Data in a Persistent DataStore
在此模型中珠移,用戶會話數(shù)據(jù)不會保存在服務(wù)器的內(nèi)存中,而是會持久保存到數(shù)據(jù)存儲中并將其與 SESSION_ID 相關(guān)聯(lián)末融。
該解決方案將獨(dú)立于服務(wù)器钧惧,但我們可能需要編寫自定義代碼,以便在用戶向他/她的會話中添加一些信息時(shí)透明地將會話數(shù)據(jù)存儲在持久性數(shù)據(jù)存儲中勾习。 這就是 Spring Session 發(fā)揮作用的地方浓瞪。
Spring Boot 使用 Session 管理登錄狀態(tài)和攔截請求
https://www.zhangbj.com/p/554.html
參考
https://www.sivalabs.in/session-management-using-spring-session-jdbc-datastore/