分布式环境session共享

作者 : 开心源码 本文共1863个字,预计阅读时间需要5分钟 发布时间: 2022-05-11 共72人阅读

关于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编辑器的路径)

[html] view plain copy

  1. <Valve className=”com.radiadesign.catalina.session.RedisSessionHandlerValve” />
  2. <Manager className=”com.radiadesign.catalina.session.RedisSessionManager”
  3. host=”127.0.0.1″
  4. port=”9313″
  5. database=”0″
  6. maxInactiveInterval=”60″/>

这个里的class路径具体看tomcat-redis-session-manager里的路径。

可可以你会遇到重启tomcat配置文件会被复原的问题,那么你还需要修改另一处的context.xml文件,workspace\Servers\MyEclipse Tomcat v7.0-config文件夹中的,修改内容同上。

接下来,给大家看一下配置完成后的结果:

分布式环境session共享

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 分布式环境session共享

发表回复