tomcat集群session共享

        才疏学浅且语无伦次,如有误人子弟,深表歉意

一台tomcat不够用时,要么换更好的机器,要么加机器做集群。

做集群就会涉及到负载均衡,比如nginx,会把到来的每个请求按一定的规则转发给后端tomcat,这就有一个逃避不了的问题需要解决,用户的session需要在不同的tomcat之间共享。

比较偷懒的办法,nginx的iphash,可以将来自同一ip的请求每次都转发到固定的tomcat上,但是这样做的坏处有两个:

1,客户端的ip可能会发生改变,然后请求被转发到另一台tomcat上,比如你用手机4G登陆一个app/网站 or anything,然后你来到一个有wifi的地方,二话不说连上wifi,然后你发现你得重新登陆一遍。。。

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里的,有兴趣看其源码的话,实现原理和上面提到的几个步骤基本上是一样的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值