企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 分布式session实现方案 * **Session复制** 在支持Session复制的Web服务器上,通过修改Web服务器的配置,可以实现将Session同步到其它Web服务器上,达到每个Web服务器上都保存一致的Session。 优点:代码上不需要做支持和修改。 缺点:需要依赖支持的Web服务器,一旦更换成不支持的Web服务器就不能使用了,在数据量很大的情况下不仅占用网络资源,而且会导致延迟。 适用场景:只适用于Web服务器比较少且Session数据量少的情况。 可用方案:开源方案tomcat-redis-session-manager,暂不支持Tomcat8 * **Session粘滞** 将用户的每次请求都通过某种方法强制分发到某一个Web服务器上,只要这个Web服务器上存储了对应Session数据,就可以实现会话跟踪。 优点:使用简单,没有额外开销。 缺点:一旦某个Web服务器重启或宕机,相对应的Session数据将会丢失,而且需要依赖负载均衡机制。 适用场景:对稳定性要求不是很高的业务情景 * **Session集中管理** 在单独的服务器或服务器集群上使用缓存技术,如Redis存储Session数据,集中管理所有的Session,所有的Web服务器都从这个存储介质中存取对应的Session,实现Session共享。 优点:可靠性高,减少Web服务器的资源开销。 缺点:实现上有些复杂,配置较多。 适用场景:Web服务器较多、要求高可用性的情况。 可用方案:开源方案Spring Session,也可以自己实现,主要是重写HttpServletRequestWrapper中的getSession方法 * **基于Cookie管理** 这种方式每次发起请求的时候都需要将Session数据放到Cookie中传递给服务端。 优点:不需要依赖额外外部存储,不需要额外配置。 缺点:不安全,易被盗取或篡改;Cookie数量和长度有限制,需要消耗更多网络带宽。 适用场景:数据不重要、不敏感且数据量小的情况 【_**这四种方式,相对来说,Session集中管理更加可靠,使用也是最多的】**_ ### Session集中管理方案应该具备的特点 A、中间存储介质的读写速度要快。之前的Session管理方案将Session对象存放在服务器内存中,有着很高的读写速度,进行Session集中管理后将会在Session读写中引入网络传输,速度会有所降低,所以必须保证中间存储介质的读写速度。 B、中间存储介质要保证高可用。进行Session集中管理后,整个企业应用的Session都会存放在中间存储介质中,如果存储介质是不稳定的,那整个企业应用都将不稳定。 C、对Session的使用者来说,Session管理方案应该是透明的,切换成集中管理方案后用户无感知。 D、Session管理方案不该和某一Web服务器耦合,应该适用于所有常规Web服务器。 根据上述标准可以看出,Session集中管理方案的技术选型应该从Session存储介质和管理方案实现两方面考虑。 ### 管理方案实现 目前常用的Session集中管理方案有两种,一种是Memcache-Tomcat-Session,另一种是Spring Session。 Memcache-Tomcat-Session是一个基于Memcache和Tomcat实现Session集中管理的开源方案。通过扩展Tomcat的SessionManager,并且在配置文件中替换Tomcat默认的SessionManager来实现Session管理。虽然实现起来比较简单,但是与Tomcat耦合,不适用于其他Web服务器。 Spring Session是Spring提供的一套Session管理方案,通过一个SessionFilter将所有请求进行拦截,然后使用Request包装类来接管Session管理。Spring Session不与Web服务器耦合,能够适用于常规的服务器。同时还提供了统一浏览器多Session等功能。 Spring Session虽然优点颇多,但是实现Session管理功能的代码量也比较大,还需要配合Spring-data-redis使用,学习成本比较大,遇到问题不好维护 ![](../assets/20180421005019001.png) _**参考资料**_ [https://www.jianshu.com/p/3dd4e06bdfa4](https://www.jianshu.com/p/3dd4e06bdfa4)