javaee论坛

普通会员

225648

帖子

343

回复

357

积分

楼主
发表于 2019-11-03 06:55:52 | 查看: 731 | 回复: 2

关于Cookie和Session的功能与工作原理,在这里我就不再叙述了,大家想要了解可以看一下我的上一篇博客,讲的还是很细致的。

但是之前讲的Session是运行在一台服务器上的,所有的访问都会到达我们的唯一服务器上,这样我们可以根据客户端传来的sessionID,来获取session,或在对应Session不存在的情况下(session生命周期到了/用户第一次登录),创建一个新的Session;但是,如果我们在集群环境下,假设我们有两台服务器A,B,用户的请求会由Nginx服务器进行转发(别的方案也是同理),用户登录时,Nginx将请求转发至服务器A上,A创建了新的session,并将SessionID返回给客户端,用户在浏览其他页面时,客户端验证登录状态,Nginx将请求转发至服务器B,由于B上并没有对应客户端发来sessionId的session,所以会重新创建一个新的session,并且再将这个新的sessionID返回给客户端,这样,我们可以想象一下,用户每一次操作都有1/2的概率进行再次的登录,这样不仅对用户体验特别差,还会让服务器上的session激增,加大服务器的运行压力。

为了解决集群环境下的seesion共享问题,共有4种解决方案:

1.粘性session

粘性session是指Ngnix每次都将同一用户的所有请求转发至同一台服务器上,即将用户与服务器绑定。

2.服务器session复制

即每次session发生变化时,创建或者修改,就广播给所有集群中的服务器,使所有的服务器上的session相同。

3.session共享

缓存session,使用redis,memcached。

4.session持久化

将session存储至数据库中,像操作数据一样才做session。

其实,最简单的两种方案,就是方案一和方案三,都不需要对session进行任何操作,只需要将Nginx和Tomcat上的配置文件修改一下即可。由于我们做集群,访问量一定是比较大的了,对于第一种方案,如果某台服务器发生故障,此服务器上的所有用户的session都会丢失,所以今天我们采用第三种解决方案。

感谢开源项目tomcat-redis-session-manager,感谢项目的发起者jcoleman。

此方案最简单之处就在于我们无需修改项目,只需要修改Tomcat的context.xml配置文件即可,并且,redis服务器同样可以做分布式。

接下来,我们来讲解一下如何配置tomcat,首先,讲解一下注意事项,因为项目的原因,并没能用maven来管理依赖的包,而在我配置的时候,很正常的发生了包版本间的冲突,从redis中取出的序列化后的session无法转换为HttpSession,所以,大家做的时候一定要注意版本间的兼容问题。

把我使用的版本给大家做个参考吧,tomcat-redis-session-manager-1.1.jar,jedis-2.1.0.jar,commons-pool-1.6.jar

这三个包需放入tomcat的安装目录下的lib文件夹下,IDE自带的tomcat可以在配置中查看。

需注意的是,当redis的版本‘过高’时,需要依赖commons-pool2.jar,(具体版本不写)。

接下来,我们就讲一下最核心的配置,配置context.xml文件(文件路径workspace\.metadata\.me_tcat7\conf,此处仅是myeclipse编辑器的路径)

<ValveclassName="com.radiadesign.catalina.session.RedisSessionHandlerValve"/>       <ManagerclassName="com.radiadesign.catalina.session.RedisSessionManager"host="127.0.0.1"port="9313"database="0"maxInactiveInterval="60"/>这个里的class路径具体看tomcat-redis-session-manager里的路径。

可能你会遇到重启tomcat配置文件会被还原的问题,那么你还需要修改另一处的context.xml文件,workspace\Servers\MyEclipseTomcatv7.0-config文件夹中的,修改内容同上。接下来,给大家看一下配置完成后的结果:

图1为监听到的redis服务器的状态,可以看到我们将session序列化后以sessionID为key存入了redis中,图2可以看到是客户端header中的cookie信息(若有疑问可以查看我上一篇的博客),图三是我在redis客户端getkey为sessionID的记录,可以验证成功,我们配置是成功了的,因为使用的自己的电脑,配置有限,并没有开几个tomcat来测试,不过上述还是很有说服力的(线上已经测试过了)。

希望对你有帮助!


普通会员

0

帖子

306

回复

311

积分
沙发
发表于 2019-11-30 16:15:48

百因必有果你的报应就是我

普通会员

1

帖子

314

回复

326

积分
板凳
发表于 2023-09-15 08:39:07

楼主你知道的太多了

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017