據稱,Tomcat集群session同步方案有以下幾種方式:
1)使用tomcat自帶的cluster方式,多個tomcat間自動實時復制session信息,配置起來很簡單。但這個方案的效率比較低,在大並發下表現並不好。
2)利用nginx的基於訪問ip的hash路由策略,保證訪問的ip始終被路由到同一個tomcat上,這個配置更簡單。每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session(並不是共享session解決)的問題! 並且如果應用是某一個局域網大量用戶同時登錄,這樣負載均衡就沒什么作用了。
3)利用nginx插件實現tomcat集群和session同步,nginx-upstream-jvm-route是一個Nginx的擴展模塊,用來實現基於Cookie的Session Sticky的功能。但是遺憾的是,這個模塊的補丁在nginx1.4版本之后就沒有再更新了,所以nginx1.4之后版本跟該模塊就不兼容了!!
4)利用memcached實現(MSM工具)。memcached存儲session,並把多個tomcat的session集中管理,前端在利用nginx負載均衡和動靜態資源分離,在兼顧系統水平擴展的同時又能保證較高的性能。即通過MSM工具把Tomcat的Session序列化后保存到Memcached里面,從而實現Session共享.
5)利用redis實現。使用redis不僅僅可以將緩存的session持久化,還因為它支持的單個對象比較大,而且數據類型豐富,不只是緩存 session,還可以做其他用途,可以一舉幾得。Redis這種方式目前還不支持Tomcat8環境(現在網上插件不支持tomcat8,非要支持tomcat8,則需修改插件jar包的源代碼)!
6)利用filter方法實現。這種方法比較推薦,因為它的服務器使用范圍比較多,不僅限於tomcat ,而且實現的原理比較簡單容易控制。
7)利用terracotta服務器共享session。這種方式配置比較復雜。
下面實現的就是最簡單的第二種方式:
nginx.conf里配置如下:
http { include mime.types; default_type application/octet-stream; access_log logs/access.log; sendfile on; keepalive_timeout 65; upstream tomcat{ ip_hash; server localhost:8080; server localhost:8088; } server { listen 80; server_name localhost; client_max_body_size 1024m; location / { proxy_pass http://tomcat; proxy_set_header Host $host:$server_port; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } ... }
上面upstream里ip_hash;一句就是實現訪客固定訪問一個后端服務器的方式,確實簡單易行。
參考網頁:
1.https://www.cnblogs.com/kevingrace/p/6398672.html
2.https://www.cnblogs.com/xiandedanteng/p/12055609.html
--END-- 2019-12-27 09:20