4 種分佈式session解決方案

做者:斷橋殘雪
連接: https://blog.csdn.net/qq_3562...

cookie和session的區別和聯繫

cookie是本地客戶端用來存儲少許數據信息的,保存在客戶端,用戶可以很容易的獲取,安全性不高,存儲的數據量小
session是服務器用來存儲部分數據信息,保存在服務器,用戶不容易獲取,安全性高,儲存的數據量相對大,存儲在服務器,會佔用一些服務器資源,可是對於它的優勢來講,這個缺點能夠忽略了html

session有什麼用

在一次客戶端和服務器爲之間的會話中,客戶端(瀏覽器)向服務器發送請求,首先cookie會自動攜帶上次請求存儲的數據(JSESSIONID)到服務器,服務器根據請求參數中的JSESSIONID到服務器中的session庫中查詢是否存在此JSESSIONID的信息,若是存在,那麼服務器就知道此用戶是誰,若是不存在,就會建立一個JSESSIONID,並在本次請求結束後將JSESSIONID返回給客戶端,同時將此JSESSIONID在客戶端cookie中進行保存前端

客戶端和服務器之間是經過http協議進行通訊,可是http協議是無狀態的,不一樣次請求會話是沒有任何關聯的,可是優勢是處理速度快java

session是一次瀏覽器和服務器的交互的會話,當瀏覽器關閉的時候,會話就結束了,可是會話session還在,默認session是還保留30分鐘的nginx

分佈式session一致性

客戶端發送一個請求,通過負載均衡後該請求會被分配到服務器中的其中一個,因爲不一樣服務器含有不一樣的web服務器(例如Tomcat),不一樣的web服務器中並不能發現以前web服務器保存的session信息,就會再次生成一個JSESSIONID,以前的狀態就會丟失web

方案一:客戶端存儲

直接將信息存儲在cookie中cookie是存儲在客戶端上的一小段數據,客戶端經過http協議和服務器進行cookie交互,一般用來存儲一些不敏感信息redis

缺點算法

  • 數據存儲在客戶端,存在安全隱患
  • cookie存儲大小、類型存在限制
  • 數據存儲在cookie中,若是一次請求cookie過大,會給網絡增長更大的開銷

方案二:session複製

session複製是小型企業應用使用較多的一種服務器集羣session管理機制,在真正的開發使用的並非不少,經過對web服務器(例如Tomcat)進行搭建集羣。spring

存在的問題數據庫

  • session同步的原理是在同一個局域網裏面經過發送廣播來異步同步session的,一旦服務器多了,併發上來了,session須要同步的數據量就大了,須要將其餘服務器上的session所有同步到本服務器上,會帶來必定的網路開銷,在用戶量特別大的時候,會出現內存不足的狀況

優勢:瀏覽器

  • 服務器之間的session信息都是同步的,任何一臺服務器宕機的時候不會影響另外服務器中session的狀態,配置相對簡單
  • Tomcat內部已經支持分佈式架構開發管理機制,能夠對tomcat修改配置來支持session複製,在集羣中的幾臺服務器之間同步session對象,使每臺服務器上都保存了全部用戶的session信息,這樣任何一臺本機宕機都不會致使session數據的丟失,而服務器使用session時,也只須要在本機獲取便可

如何配置:

在Tomcat安裝目錄下的config目錄中的server.xml文件中,將註釋打開,tomcat必須在同一個網關內,要否則收不到廣播,同步不了session

在web.xml中開啓session複製:<distributable/>

方案三:session綁定:

Nginx介紹:

Nginx是一款自由的、開源的、高性能的http服務器和反向代理服務器

Nginx能作什麼:

反向代理、負載均衡、http服務器(動靜代理)、正向代理

如何使用nginx進行session綁定

咱們利用nginx的反向代理和負載均衡,以前是客戶端會被分配到其中一臺服務器進行處理,具體分配到哪臺服務器進行處理還得看服務器的負載均衡算法(輪詢、隨機、ip-hash、權重等),可是咱們能夠基於nginx的ip-hash策略,能夠對客戶端和服務器進行綁定,同一個客戶端就只能訪問該服務器,不管客戶端發送多少次請求都被同一個服務器處理

在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;
    }
}

缺點:

  • 容易形成單點故障,若是有一臺服務器宕機,那麼該臺服務器上的session信息將會丟失
  • 前端不能有負載均衡,若是有,session綁定將會出問題

優勢:

  • 配置簡單

方案四:基於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數據庫索引(默認是0)
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
#默認密碼爲空
spring.redis.password=
#鏈接池最大鏈接數(負數表示沒有限制)
spring.redis.jedis.pool.max-active=1000
#鏈接池最大阻塞等待時間(負數表示沒有限制)
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

優勢:

  • 這是企業中使用的最多的一種方式
  • spring爲咱們封裝好了spring-session,直接引入依賴便可
  • 數據保存在redis中,無縫接入,不存在任何安全隱患
  • redis自身可作集羣,搭建主從,同時方便管理

缺點:

  • 多了一次網絡調用,web容器須要向redis訪問

總結

通常會將web容器所在的服務器和redis所在的服務器放在同一個機房,減小網絡開銷,走內網進行鏈接

推薦閱讀

學習資料分享

12 套 微服務、Spring Boot、Spring Cloud 核心技術資料,這是部分資料目錄:

  • Spring Security 認證與受權
  • Spring Boot 項目實戰(中小型互聯網公司後臺服務架構與運維架構)
  • Spring Boot 項目實戰(企業權限管理項目))
  • Spring Cloud 微服務架構項目實戰(分佈式事務解決方案)
  • ...

    公衆號後臺回覆arch028獲取資料::

相關文章
相關標籤/搜索