分佈式集羣--Session 共享的實現

在web應用中,由於http的請求響應式,無狀態。要記錄用戶相關的狀態信息,比如電商網站的購物車,比如用戶是否登錄等,都需要使用session。我們知道session是由servlet容器創建和管理,存儲在服務器端,並且與客戶端瀏覽器相關(停止web應用,關閉瀏覽器session都會失效)。

  如果一個web應用,部署到一臺服務器(一個tomcat),那麼session使用起來相當的方便,沒有額外的擔心,直接由servlet容器創建和管理即可。然而今天,一個web應用面臨大量用戶,高併發的訪問(我們有十多億同胞,驕傲啊!)。那麼無論如何一個tomcat是難以提供服務的,就需要集羣方式部署大量的tomcat,共同提供服務。也就是我們耳熟能詳 的:集羣、分佈式、負載均衡。架構大概是這個樣子:

 

上述問題:使用了nginx 做了負載均衡和反向代理功能

但是客戶在tomcat2 登錄創建的session  ,通過nginx 反向代理 推送到了tomcat3服務上去了,這樣用戶就需要再次登錄,就出現了客戶端反覆登陸問題,怎麼解決呢?

同一個web應用,當以nginx+tomcat實現負載均衡集羣部署以後,nginx採取不同的負載均衡策略,比如:輪詢、ip_hash。那麼session的表現是完全不一樣的。

nginx 負載均衡策略:輪詢

 輪詢方式,客戶端的不同請求在經過nginx負載均衡後,有可能反向代理到tomcat1或者tomcat2,由於沒有實現session共享,導致session不可用

nginx 負載均衡策略:ip_hash

ip_hash 方式,將客戶端的ip地址經過hash處理後,反向代理綁定到後端同一臺tomcat服務器,(相當於同一個客戶端訪問,綁定到同一個tomcat上)因此Session可用,這種方式雖然實現了不同客戶端流量的均衡,但對同一個客戶端來說,存在單點故障,,如果後端某一個tomcat服務器出故障,那麼所有之前綁定的該tomcat的session都失效了

解決方法:通過spring-session將session存儲到redis上,實現session共享

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章