tomcat集群session共享

2021-07-25 11:13:15 字數 1344 閱讀 9543

才疏學淺且語無倫次,如有誤人子弟,深表歉意

一台tomcat不夠用時,要麼換更好的機器,要麼加機器做集群。

做集群就會涉及到負載均衡,比如nginx,會把到來的每個請求按一定的規則**給後端tomcat,這就有乙個逃避不了的問題需要解決,使用者的session需要在不同的tomcat之間共享。

比較偷懶的辦法,nginx的iphash,可以將來自同一ip的請求每次都**到固定的tomcat上,但是這樣做的壞處有兩個:

2,比如湊巧,所有的ip經過iphash的演算法後,都被**到同一臺tomat上了,結果你的機器一台忙死,一台閒死。

然後怎麼做到session共享呢?那先得了解session是什麼東西。

我們用session的時候,大多是這樣的:

request.getsession.setattribute("string", object)
是不是很像乙個map,其實簡單來說,可以把session當做乙個map,那我們用的時候,怎麼找到每條session對應的map然後訪問物件呢,你開啟瀏覽器的除錯模式,會發現每次請求cookie裡面會有乙個jssessionid的東西,這個是你第一次request.getsession時tomcat新增到cookie中的,這個sessionid對應了session的map,我們每次訪問物件時,都是根據sessionid找到map,然後訪問。

那這樣,我們其實可以不用session,或者說我們自己「造」session,然後存到集群中的tomcat都可以訪問到的公共的地方,比如redis,這樣就可以做到session共享了。

大致步驟如下:

1,當request第一次到來時,伺服器端為之生成乙個唯一標識的key,比如uuid,然後新建乙個map,存放我們需要的東西,比如map.put("username",userobject)

2,把這個key和map存到redis中:

jedis.hset(key, "username", userobject)
3,要設定session超時時間怎麼辦?向下面這樣,時間到了,key(session)自動消失。

jedis.expire(key,timeout)
4,把1中生成的key新增到request的cookie中,client每次請求時都會帶上這個cookie,這樣,就能根據cookie中的key找到redis中存的map,也就是我們自己造的session了。

5,集群中的每個tomcat需要用到session時,都去操作redis中的同乙個map就可以了。

git上有個開源的專案,就是把tomcat的session共享到redis裡的,有興趣看其原始碼的話,實現原理和上面提到的幾個步驟基本上是一樣的。

tomcat集群session共享

tomcat集群配置其實很簡單,在tomcat自帶的文件中有詳細的說明 docs cluster howto.html 只不過是英語的,對我這樣的人來說很難懂 下面根據說下怎麼配置吧 第一步 準備工作 準備幾份tomcat程式,比如分別叫tomcat1 tomcat2 如果各tomcat程式放在不同...

Tomcat集群的session共享

第一種是以負載均衡伺服器本身提供的session共享策略,每種服務 器的配置是不一樣的並且nginx本身是沒有的。第二種是利用web容器本身的 session 共享策略來配置共享。針對於 weblogic 這種方式還是靠普的。但是針對於 tomcat 這種方式存在很大的缺陷,主要因為是依靠廣播方式來...

session 集群方案

背景 假設某個 是由多台伺服器提供服務,nginx採用輪詢機制做負載均衡,那麼同乙個ip訪問該 時,請求就可能會被分配到不同的伺服器上,如果session沒有實現共享,就會出現重複登陸授權的情況。session 集群主要有兩個方案 session 複製和session共享 session 複製 是指...