簡單了解4種分布式session解決方案
cookie和session的區(qū)別和聯(lián)系
cookie是本地客戶端用來存儲(chǔ)少量數(shù)據(jù)信息的,保存在客戶端,用戶能夠很容易的獲取,安全性不高,存儲(chǔ)的數(shù)據(jù)量小
session是服務(wù)器用來存儲(chǔ)部分?jǐn)?shù)據(jù)信息,保存在服務(wù)器,用戶不容易獲取,安全性高,儲(chǔ)存的數(shù)據(jù)量相對(duì)大,存儲(chǔ)在服務(wù)器,會(huì)占用一些服務(wù)器資源,但是對(duì)于它的優(yōu)點(diǎn)來說,這個(gè)缺點(diǎn)可以忽略了
session有什么用
在一次客戶端和服務(wù)器為之間的會(huì)話中,客戶端(瀏覽器)向服務(wù)器發(fā)送請(qǐng)求,首先cookie會(huì)自動(dòng)攜帶上次請(qǐng)求存儲(chǔ)的數(shù)據(jù)(JSESSIONID)到服務(wù)器,服務(wù)器根據(jù)請(qǐng)求參數(shù)中的JSESSIONID到服務(wù)器中的session庫中查詢是否存在此JSESSIONID的信息,如果存在,那么服務(wù)器就知道此用戶是誰,如果不存在,就會(huì)創(chuàng)建一個(gè)JSESSIONID,并在本次請(qǐng)求結(jié)束后將JSESSIONID返回給客戶端,同時(shí)將此JSESSIONID在客戶端cookie中進(jìn)行保存
客戶端和服務(wù)器之間是通過http協(xié)議進(jìn)行通信,但是http協(xié)議是無狀態(tài)的,不同次請(qǐng)求會(huì)話是沒有任何關(guān)聯(lián)的,但是優(yōu)點(diǎn)是處理速度快
session是一次瀏覽器和服務(wù)器的交互的會(huì)話,當(dāng)瀏覽器關(guān)閉的時(shí)候,會(huì)話就結(jié)束了,但是會(huì)話session還在,默認(rèn)session是還保留30分鐘的
分布式session一致性
客戶端發(fā)送一個(gè)請(qǐng)求,經(jīng)過負(fù)載均衡后該請(qǐng)求會(huì)被分配到服務(wù)器中的其中一個(gè),由于不同服務(wù)器含有不同的web服務(wù)器(例如Tomcat),不同的web服務(wù)器中并不能發(fā)現(xiàn)之前web服務(wù)器保存的session信息,就會(huì)再次生成一個(gè)JSESSIONID,之前的狀態(tài)就會(huì)丟失
方案一:客戶端存儲(chǔ)
直接將信息存儲(chǔ)在cookie中cookie是存儲(chǔ)在客戶端上的一小段數(shù)據(jù),客戶端通過http協(xié)議和服務(wù)器進(jìn)行cookie交互,通常用來存儲(chǔ)一些不敏感信息
缺點(diǎn)
數(shù)據(jù)存儲(chǔ)在客戶端,存在安全隱患
cookie存儲(chǔ)大小、類型存在限制
數(shù)據(jù)存儲(chǔ)在cookie中,如果一次請(qǐng)求cookie過大,會(huì)給網(wǎng)絡(luò)增加更大的開銷
方案二:session復(fù)制
session復(fù)制是小型企業(yè)應(yīng)用使用較多的一種服務(wù)器集群session管理機(jī)制,在真正的開發(fā)使用的并不是很多,通過對(duì)web服務(wù)器(例如Tomcat)進(jìn)行搭建集群。
存在的問題
session同步的原理是在同一個(gè)局域網(wǎng)里面通過發(fā)送廣播來異步同步session的,一旦服務(wù)器多了,并發(fā)上來了,session需要同步的數(shù)據(jù)量就大了,需要將其他服務(wù)器上的session全部同步到本服務(wù)器上,會(huì)帶來一定的網(wǎng)路開銷,在用戶量特別大的時(shí)候,會(huì)出現(xiàn)內(nèi)存不足的情況
優(yōu)點(diǎn):
服務(wù)器之間的session信息都是同步的,任何一臺(tái)服務(wù)器宕機(jī)的時(shí)候不會(huì)影響另外服務(wù)器中session的狀態(tài),配置相對(duì)簡單
Tomcat內(nèi)部已經(jīng)支持分布式架構(gòu)開發(fā)管理機(jī)制,可以對(duì)tomcat修改配置來支持session復(fù)制,在集群中的幾臺(tái)服務(wù)器之間同步session對(duì)象,使每臺(tái)服務(wù)器上都保存了所有用戶的session信息,這樣任何一臺(tái)本機(jī)宕機(jī)都不會(huì)導(dǎo)致session數(shù)據(jù)的丟失,而服務(wù)器使用session時(shí),也只需要在本機(jī)獲取即可
如何配置:
在Tomcat安裝目錄下的config目錄中的server.xml文件中,將注釋打開,tomcat必須在同一個(gè)網(wǎng)關(guān)內(nèi),要不然收不到廣播,同步不了session
在web.xml中開啟session復(fù)制:<distributable/>
方案三:session綁定:
Nginx介紹:
Nginx是一款自由的、開源的、高性能的http服務(wù)器和反向代理服務(wù)器
Nginx能做什么:
反向代理、負(fù)載均衡、http服務(wù)器(動(dòng)靜代理)、正向代理
如何使用nginx進(jìn)行session綁定
我們利用nginx的反向代理和負(fù)載均衡,之前是客戶端會(huì)被分配到其中一臺(tái)服務(wù)器進(jìn)行處理,具體分配到哪臺(tái)服務(wù)器進(jìn)行處理還得看服務(wù)器的負(fù)載均衡算法(輪詢、隨機(jī)、ip-hash、權(quán)重等),但是我們可以基于nginx的ip-hash策略,可以對(duì)客戶端和服務(wù)器進(jìn)行綁定,同一個(gè)客戶端就只能訪問該服務(wù)器,無論客戶端發(fā)送多少次請(qǐng)求都被同一個(gè)服務(wù)器處理
在nginx安裝目錄下的conf目錄中的nginx.conf文件
upstream aaa { Ip_hash; server 39.105.59.4:8080; Server 39.105.59.4:8081; } server { listen 80; server_name www.wanyingjing.cn; #root /usr/local/nginx/html; #index index.html index.htm; location / { proxy_pass http:39.105.59.4; index index.html index.htm; } }
缺點(diǎn):
容易造成單點(diǎn)故障,如果有一臺(tái)服務(wù)器宕機(jī),那么該臺(tái)服務(wù)器上的session信息將會(huì)丟失
前端不能有負(fù)載均衡,如果有,session綁定將會(huì)出問題
優(yōu)點(diǎn):
配置簡單
方案四:基于redis存儲(chǔ)session方案
基于redis存儲(chǔ)session方案流程示意圖
引入pom依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-data-starter-redis</artifactId> </dependency>
配置redis
#redis數(shù)據(jù)庫索引(默認(rèn)是0)
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
#默認(rèn)密碼為空
spring.redis.password=
#連接池最大連接數(shù)(負(fù)數(shù)表示沒有限制)
spring.redis.jedis.pool.max-active=1000
#連接池最大阻塞等待時(shí)間(負(fù)數(shù)表示沒有限制)
spring.redis.jedis.pool.max-wait=-1ms
#連接池中的最大空閑連接
spring.redis.jedis.pool.max-idle=10
#連接池中的最小空閑連接
spring.redis.jedis.pool.min-idle=2
#連接超時(shí)時(shí)間(毫秒)
spring.redis.timeout=500ms
優(yōu)點(diǎn):
- 這是企業(yè)中使用的最多的一種方式
- spring為我們封裝好了spring-session,直接引入依賴即可
- 數(shù)據(jù)保存在redis中,無縫接入,不存在任何安全隱患
- redis自身可做集群,搭建主從,同時(shí)方便管理
缺點(diǎn):
多了一次網(wǎng)絡(luò)調(diào)用,web容器需要向redis訪問
總結(jié)
一般會(huì)將web容器所在的服務(wù)器和redis所在的服務(wù)器放在同一個(gè)機(jī)房,減少網(wǎng)絡(luò)開銷,走內(nèi)網(wǎng)進(jìn)行連接
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot開發(fā)案例 分布式集群共享Session詳解
- 如何使用Spring+redis實(shí)現(xiàn)對(duì)session的分布式管理
- PHP實(shí)現(xiàn)分布式memcache設(shè)置web集群session同步的方法
- spring boot整合redis實(shí)現(xiàn)shiro的分布式session共享的方法
- 淺談ASP.NET Core中間件實(shí)現(xiàn)分布式 Session
- 詳解springboot中redis的使用和分布式session共享問題
- 詳解基于Spring Boot/Spring Session/Redis的分布式Session共享解決方案
- ASP.NET通過分布式Session提升性能
相關(guān)文章
Java同步關(guān)鍵字synchronize底層實(shí)現(xiàn)原理解析
synchronized關(guān)鍵字對(duì)大家來說并不陌生,當(dāng)我們遇到并發(fā)情況時(shí),優(yōu)先會(huì)想到用synchronized關(guān)鍵字去解決,synchronized確實(shí)能夠幫助我們?nèi)ソ鉀Q并發(fā)的問題,接下來通過本文給大家分享java synchronize底層實(shí)現(xiàn)原理,感興趣的朋友一起看看吧2021-08-08Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問題
這篇文章主要介紹了Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Java多線程之ReentrantReadWriteLock源碼解析
這篇文章主要介紹了Java多線程之ReentrantReadWriteLock源碼解析,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05Spring?AOP實(shí)現(xiàn)多數(shù)據(jù)源動(dòng)態(tài)切換
本文主要介紹了Spring?AOP實(shí)現(xiàn)多數(shù)據(jù)源動(dòng)態(tài)切換,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03springcloud gateway如何實(shí)現(xiàn)路由和負(fù)載均衡
這篇文章主要介紹了springcloud gateway如何實(shí)現(xiàn)路由和負(fù)載均衡的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07tomcat報(bào)錯(cuò):Wrapper cannot find servlet class ...問題解決
這篇文章主要介紹了tomcat報(bào)錯(cuò):Wrapper cannot find servlet class ...問題解決的相關(guān)資料,需要的朋友可以參考下2016-11-11mybatis實(shí)現(xiàn)圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了mybatis實(shí)現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06java多態(tài)性中的Overload和Override區(qū)別詳解
這篇文章主要介紹了java多態(tài)性中的Overload和Override區(qū)別詳解,重寫(Overriding)是父類與子類之間多態(tài)性的一種表現(xiàn),而重載(Overloading)是一個(gè)類中多態(tài)性的一種表現(xiàn),需要的朋友可以參考下2023-07-07