Tomcat进行请求的Session解决方式总体来说有三种,
(1)使用Nginx或者Apache反向代理工具进行用户请求的分机器,在Tomcat的Engine中的标签中加入jvmRoute属性,指定对应的负载到这个机器上就可以了,即称为有粘性的Session。
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
Nginx对应原理:nginx_upstream_jvm_route(nginx扩展,推荐使用)
nginx_upstream_jvm_route是一个nginx的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。
简单来说,它是基于cookie中的JSESSIONID来决定将请求发送给后端的哪个server,nginx_upstream_jvm_route会在用户第一次请求后端server时,将响应的server标识绑定到cookie中的JSESSIONID中,从而当用户发起下一次请求时,nginx会根据JSESSIONID来决定由哪个后端server来处理。
还可以使用ip_hash的方式来进行,但是,不推荐这样的方式,所以,总体来说,这个方式是可以进行负载的,也是解决Session问题。
通常,更推荐大家使用第三方的代理进行Session的分机器方式,这样在高可用方面可能稍微欠缺,但是,如果不是很大的项目情况,不会出现太大的问题。
配置方式:待后面进行实际亲测后贴出来
别人配置方式地址:http://www.linuxidc.com/Linux/2013-06/86446.htm (后面将验证改配置是否有效)
这里也讲了一些价值的东西:http://hanqunfeng.iteye.com/blog/1920994
(2)使用Tomcat自带的功能,进行服务间的Session复制,但是,Session复制可以使用两种方式,修改后全量的复制,还是修改后增量复制,对应的Tomcat的类,DeltaSession(增量)、ReplicatedSession(全量,暂时在Tomcat9源码中未找到),这里的配置还有待添加。即称为无粘性的Session。
配置方式:待后面进行实际亲测后贴出来
别人配置方式地址:http://www.cnblogs.com/hanxianlong/p/3456780.html (后面将验证改配置是否有效)
(3)将Tomcat的Session管理分离出来,进行统一管理,将Session放入到Redis或其他缓存中去。
这里需要去使用代码实现,也可以使用第三方插件实现,名称:tomcat-redis-session-manager 地址:https://github.com/jcoleman/tomcat-redis-session-manager