Tomcat集群通过redis实现session共享
Tomcat集群通過redis實現session共享
最近在XXX項目上做了tomcat集群的session共享,閑來無事鄙人將整個踩坑的過程粗糙的記錄下來,給同學們分享一波,整個過程無硬編碼,爽歪歪!
為什么要持久化session(共享session)呢?因為在客戶端每個用戶的Session對象存在Servlet容器中,如果Tomcat服務器重啟或者宕機的話,那么該session就會丟失,而客戶端的操作會由于session丟失而造成數據丟失;如果當前用戶訪問量巨大,每個用戶的Session里存放大量數據的話,那么就很占用服務器大量的內存,進而致使服務器性能受到影響。數據庫持久化session,分為物理數據庫和內存數據庫。物理數據庫備份session,由于其性能原因,不推薦;內存數據庫可以使用redis和memcached來存儲session。
實現的效果:當客戶端訪問Nginx服務器時,Nginx負載均衡會自動將請求轉發到Tomcat1節點或Tomcat2節點服務器,以減輕Tomcat壓力,從而達到Tomcat集群化部署,為了使各Tomcat之間共享同一個Session,將采用Redis緩存服務來集中管理Session存儲。Nginx實現負載均衡,并使用Redis實現session共享。
步驟:
1.添加以下6個依賴:
坑:注意jar包的版本,如果版本對應不上會導致應用程序啟不起來,這兒我就是由于版本沒對應上花了很長時間排查問題,吐血!細節都被大佬封裝進去了有興趣的同學可以look一look源碼。
2.需要添加session的配置文件和過濾器,具體如下:
web.xml需要添加一個過濾器,用于將session存入redis
在spring配置文件夾里面新建一個xml文件:applicationContext-session.xml 該xml主要是redis連接方式的配置以及redis存儲session,xml內容如下:
redis單機配置:
redis 集群配置:
注意:如果redis是集群環境,則這塊必須配成集群方式,否則應用程序無法啟動。
session配置:
注意:domainName必須配成網站的域名,不能配域名的ip或者負載的ip,否則拿不到session導致無法登錄。
3.在應用程序的applicationContext.xml引入applicationContext-session.xml
注意:session中不要存儲不可序列化的對象,序列化的類各個應用要一致,例如A應用在session中存儲了個com.hanweb.User,B應用需要用同樣類路徑的User(com.hanweb.User)來獲取,否則失敗。
4.因為我們是服務器集群,多服務器跨服務器共享session,要在tomcat里面配置redis(tomcat/conf/context.xml),并且引入相關jar包,具體如下:
首先引入對應的jar包:
然后修改tomcat/conf/context.xml文件:
注意:tomcat-redis-session-manager 是開源的,所以在引入className引入類名的時候最好將所下的jar包反編譯看下類路徑、名稱是否跟你引入的一致,否則啟動tomcat的時候會報類找不到的錯誤。
over!集群間的session共享就是如此簡單。當然,如果想知其所以然,需要翻閱源碼,當然我也只是大概看了一下,看不下去了!
預知后事如何,且聽下回分解,散會!
總結
以上是生活随笔為你收集整理的Tomcat集群通过redis实现session共享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nextcloud显示内部服务器,Nex
- 下一篇: Fota升级