网站首页 > 技术教程 正文
关于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
- <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
- <Manager className="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\MyEclipse Tomcat v7.0-config文件夹中的,修改内容同上。
接下来,给大家看一下配置完成后的结果:
图1为监听到的redis服务器的状态,可以看到我们将session序列化后以sessionID为key存入了redis中,图2可以看到是客户端header中的cookie信息(若有疑问可以查看我上一篇的博客),图三是我在redis客户端get key为sessionID的记录,可以验证成功,我们配置是成功了的,因为使用的自己的电脑,配置有限,并没有开几个tomcat来测试,不过上述还是很有说服力的(线上已经测试过了)。
希望对你有帮助!
猜你喜欢
- 2024-10-13 PHP 分布式集群中session共享问题以及session有效期的设置
- 2024-10-13 spring-session的使用详解(spring sessionfactory)
- 2024-10-13 springboot集成springsession利用redis来实现session共享
- 2024-10-13 「SSO单点登录」分布式Session存在问题 spring-session的设计之妙
- 2024-10-13 【第一篇】Spring-Session实现Session共享入门教程
- 2024-10-13 如何实现集群中的 session 共享存储?什么是二进制协议?
- 2024-10-13 分布式环境session共享实战课程(分布式怎么实现session共享)
- 2024-10-13 SpringBoot一个依赖搞定session共享,没有比这更简单的方案了
- 2024-10-13 #高可用的并发解决方案nginx+keepalived(二)
- 2024-10-13 阿里十年架构师带你学分布式高性能架构Dubbo+Nginx+Session+RPC
你 发表评论:
欢迎- 最近发表
-
- Oracle 在其新的 Linux 内核中引入了热补丁功能
- CentOS 7.6下安装Oracle 11.2.0.4
- ORACLE体系 - 2(oracle体系讲解)
- ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务
- Hadoop自学系列集(二) ---- CentOS下安装JDK
- 如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 搭建Oracle数据库服务器(oracle服务器创建用户)
- OGG同步到Kafka(oggforbigdata到kafka)
- oracle是什么软件?(oracle是干什么用的)
- 脚本化修改Oracle用户的密码以及执行sql(增删改查等)
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)