在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共享