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