专利名称:一种在云计算环境下实现分布式会话的方法和系统的制作方法
技术领域:
本发明涉及移动通信数据业务技术领域,尤其涉及一种在云计算环境下实现分布式会话的方法和系统。
背景技术:
在多数的Web应用中,应用程序需要保存客户端的状态,以便于在同一个客户端所访问的页面之间建立相互联系。但是,一般的Web应用都是基于超文本传输协议(HTTP)的,而HTTP恰恰是一种无状态协议,具有天生的无状态性,所以一般无法保存客户端的状态。例如,用户从A页面跳转到B页面时会重新发送一次HTTP请求,而服务端在返回响应时却无法获知该用户在请求访问B页面之前做了什么。因此,现有技术中的Web应用服务器一般都是通过会话(Session)的方式来保存客户的状态信息。例如,在JSP应用服务器中,可通过HttpSession对象来实现Session的功能。上述HttpSession表示一次会话,用来保存客户端的状态信息。上述客户端的状态信息保存在服务器端,而Session的id则保存在客户端的Cookie中。当用户打开浏览器访问某个网站时,服务器就会在服务器的内存为该浏览器分配一个空间,该空间被浏览器独占,这个空间就是Session空间,该空间中的数据默认存在时间为30分钟(min)。对于一个浏览器而言,不同的页面能够共享Session空间的数据,因此可以通过Java平台对Session机制的实现规范中所规定的各种方法来查看和使用Session对象相关信息。随着集群服务器的出现,在构建可以灵活地进行水平扩展、高可用性的Java Web应用程序时,对HttpSession的处理策略很大程度决定了应用程序的扩展性、可用性。一般而言,对HttpSession有如下的处理方案:处理方案1:在服务器端不保存Session,完全无状态(Stateless)。对于不需要保持用户状态的Web应用,采用Stateless是最为恰当的,因此就不存在 Session 共享的问题。具象状态传输(REST, Representational State Transfer)是使用该处理方案的最为典型的例子。但该方案的缺点在于:只适用于无状态应用开发环境;比如新闻网页等。处理方案2:基于浏览器Cookie的Session共享。此种方案把与用户相关的Session信息存储到浏览器的Cookie中,也称为客户端Session。但该方案的缺点在于:I)只能够存储字符串、数值等基本类型的数据;c00kie大小存在限制;安全性不高;还存在带宽及数据解压缩、网络传输性能较差等问题;2) Cookie取决于客户端的设置,且客户端可以禁止Cookie,从而导致Session实现的失败。处理方案3:基于数据库的Session信息共享,实现分布式应用间Session信息共孚。
此种方案把Session信息存储到数据库表,以实现不同应用服务器间的Session信息的共享。诸如Websphere Portal、Weblogic Portal等都采用了类似的方案。该方案的优点在于:实现简单。但该方案的缺点在于:I)由于数据库服务器相对于应用服务器更难扩展且资源更为宝贵,在高并发的Web应用中,最大的性能瓶颈通常在于数据库服务器。2)如果将Session存储到数据库表,频繁的增加、删除、查询操作很容易造成数据库表争用及加锁,最终影响业务的性能。处理方案4:基于应用服务器/Servlet容器的Clustering机制。一些常用的应用服务器及Servlet容器的Clustering机制可以实现Session信息复制(Session Replication)的功倉泛,例如 Tomcat Clustering/Session Replication、Jboss buddy Replication 等。但该方案的缺点在于:为了支持JSP HttpSession状态的自动失效无缝转移,Web服务器需要将存储在一台服务器上的Session数据复制到集群中的其他成员上,以防止数据丢失以及允许失效无缝转移,而基于Clustering的Session复制性能很差,扩展性也很差。处理方案5:基于共享存储,实现分布式应用间Session共享。通过共享存储,实现Session信息在不同服务器之间的状态和数据同步,类似于数据库的Session信息共享,但是该方案的共享存储的存取速度更快,效率上有了提升。但该方案的缺点在于:在该处理方案中,通常需要定制Web容器,因此代价极高。在现有技术中的云计算环境下,运行环境的实现往往是无状态的,即对于同一页面的多次访问请求,将会被路由到不同的服务节点之上。上述的实现方法可以极大地利用云计算环境中所有节点的计算能力,为更多的客户提供服务,从而大大提升整个系统的可扩展性和鲁棒性。但问题在于,如果云端的服务器完全无状态,则对于那些需要在访问中保持会话状态的应用而言,将面临很大的困难。为了解决上述问题,现有技术中通常会使用上述的处理方案3和处理方案5来实现在无状态的服务环境中的Session共享,但也必然无法避免上述两种处理方案中所存在的性能瓶颈以及代价极高的问题。综上可知,现有技术中的在云计算环境下实现分布式会话的方法具有如上所述的各种缺点,从而难以在云计算环境下实现高效率、高性能、低成本、易扩展的分布式会话。
发明内容
有鉴于此,本发明提供了一种在云计算环境下实现分布式会话的方法和系统,从而可以在云计算环境下实现高效率、高性能、低成本、易扩展的分布式会话。本发明采用的技术方案具体是这样实现的:一种在云计算环境下实现分布式会话的方法,该方法包括:通过过滤器拦截客户端发送的Http访问请求,并从所述Http访问请求中获取该客户端的Cookie信息中客户端的会话标识;根据所获取的会话标识构造一个Http装饰类对象,将所述Http装饰类对象发送给与所述被拦截的Http访问请求相对应的应用服务器;
根据所获取的会话标识重构与所述客户端相关的会话信息;将所获取的会话标识及相对应的会话信息存储于预先设置在网络侧的缓存服务器上;各应用服务器根据客户端的会话标识从所述缓存服务器上获取与所述客户端相关的会话信息。本发明中还提供了一种在云计算环境下的分布式会话系统,该分布式会话系统包括:包括至少一个客户端的客户端层、包括至少一个应用服务器的应用服务器层、包括至少一个缓存服务器的缓存服务器层、过滤器和重构器;所述客户端,用于发送Http访问请求;所述过滤器,用于拦截所述客户端发送的Http访问请求,并从所述Http访问请求中获取该客户端的Cookie信息中的客户端的会话标识;将所述会话标识发送给重构器;所述重构器,用于根据所获取的会话标识构造新的Http装饰类对象,将所述Http装饰类对象发送给与所述被拦截的Http访问请求相对应的应用服务器;还用于根据所获取的会话标识重构与所述客户端相关的会话信息,将所获取的会话标识及相对应的会话信息发送给缓存服务器;所述缓存服务器,用于存储所接收到的会话标识及相对应的会话信息;所述应用服务器,用于根据客户端的会话标识从所述缓存服务器上获取与所述客户端相关的会话信息。由上述技术方案可见,本发明中由于可通过过滤器拦截客户端发送的Http访问请求以获取客户端的会话标识,然后根据客户端的会话标识重构与客户端相关的Session信息并存储在缓存服务器中,使得应用服务器可根据客户端的会话标识从缓存服务器中读取与客户端相关的Session信息,从而可以在云计算环境下实现高效率、高性能、低成本、易扩展的分布式会话。
图1是本发明中在云计算环境下实现分布式会话的方法的流程图。图2为本发明中在云计算环境下的分布式会话系统的组成示意图。
具体实施例方式为使本发明的目的、技术方案和优点表达得更加清楚明白,下面结合附图及具体实施例对本发明再作进一步详细的说明。图1是本发明中在云计算环境下实现分布式会话的方法的流程图。如图1所示,该方法包括:步骤101,通过过滤器拦截客户端发送的Http访问请求,并从所述Http访问请求中获取该客户端的Cookie信息中客户端的会话标识(Session ID)。具体来说,当用户需要访问某个URL地址时,将通过其使用的客户端向应用服务器发送相应的Http访问请求,该Http访问请求携带有该客户端的Cookie信息。因此,在本发明的具体实施例中,可以通过过滤器对上述Http访问请求进行拦截,从而从所述Http访问请求中获得该客户端的Cookie信息,并从所述客户端的Cookie信息中获取客户端的Session ID。
较佳的,上述的过滤器可以是Java Servlet过滤器。其中,所述Java Servlet是一种服务器端的Java应用程序。步骤102,根据所获取的会话标识构造一个Http装饰类对象,将所述Http装饰类对象发送给与上述被拦截的Http访问请求相对应的应用服务器。由于在步骤101中已获取了客户端的会话标识,因此,在本步骤中,可根据所获取的客户端的会话标识构造一个Http装饰类对象,并将该Http装饰类对象替代上述所拦截的Http访问请求发送给相应的应用服务器。步骤103,根据所获取的会话标识重构与所述客户端相关的Session信息。现有技术的Java框架中已经有创建会话(Session)信息的机制,但该机制并不适用于云计算中的Stateless环境,因此我们需要重构与所述客户端相关的Session信息。因此,在本步骤中将根据上述所获取的客户端的SessionID,重构与该客户端相关的Session信息。在本发明的技术方案中,可以使用多种方法来根据所获取的会话标识重构与客户端相关的Session信息。例如,在本发明的具体实施例中,重构与客户端相关的Session信息可包括如下所述的步骤:步骤1031,根据上述所获取的客户端的Session ID,通过继承重构HttpServletRequestWrapper接口,将与所述客户端相关的Session信息封装为Session对象。在本步骤中,将根据上述从Http访问请求中获取的客户端的Session ID,将与所述客户端相关的Session信息封装为Session对象,从而替换原有的Java框架中的创建Session信息的机制。当系统通过Java标准接口调用Session对象时,所调用的将为重新封装后的Session对象。具体来说,Java框架中有一个名称为 HttpServletRequestWrapper 的接口,Java框架中并未规定该接口的具体实现方法,可以由开发者自行完成具体的实现或扩展。因此,在本步骤中,可根据上述从Http访问请求中获取的客户端的Session ID对该接口进行扩展,通过继承重构HttpServletRequestWrapper接口(例如,重新撰写该接口中与Session信息相关的代码类)的方式将与所述客户端相关的Session信息封装为Session对象,从而替代原有的Java框架中的Session机制。当系统通过Java标准接口调用Session对象时,所调用的将为重新封装后的Session对象。步骤1032,通过继承重构HttpSessionWrapper类,设定所述Session对象的存取方式。当上述步骤1031中将与客户端相关的Session信息封装为Session对象之后,原有的Java框架中的Session信息存取方法已经难以适用。所以,在本发明的具体实施例中,还需设定与该Session对象相关的存取方式,从而使得各个应用服务器可以对上述Session对象进行调用或访问。因此,在本步骤中,将通过继承重构HttpSessionWrapper类(例如,重新撰写与所述HttpSessionWrapper类相关的代码)的方式,设定所述Session对象的存取方式,从而替代原有的Java框架中的的Session信息存取方法。通过上述的步骤1031和1032,可以重构与客户端相关的Session信息。
步骤104,将所获取的会话标识及相对应的Session信息存储于预先设置在网络侧的缓存服务器上。在本发明的具体实施例中,还将在网络侧预先设置一个缓存服务器,该缓存服务器用于存储与客户端相关的Session信息。因此,可将所获取的会话标识及相对应的Session信息存储在该缓存服务器上。例如,在本发明的具体实施例中,可将上述所获取的会话标识及相对应的重构的Session信息通过所述继承重构的HttpServletRequestWrapper接口和HttpSessionWrapper类存储到预先设置在网络侧的缓存服务器中。具体来说,所述缓存服务器可以是Memcached服务器,其中,所述Memcached服务器是一种高性能的分布式内存对象缓存服务器。因此,可通过HttpSessionWrapper类连接Memcached服务器,并以客户端的Session ID作为关键字(key),将与所述客户端相关的Session信息存储在Memcached服务器中。其中,所存储的对象(即与所述客户端相关的Session信息)可以是一个map,因此,该map的内容即为与所述客户端相关的Session信息。步骤105,各应用服务器根据客户端的会话标识从所述缓存服务器上获取与所述客户端相关的Session信息。由于与客户端相关的Session信息已存储在缓存服务器上,因此,各个应用服务器在需要获取与客户端相关的Session信息时,可以直接根据该客户端的Session ID访问上述缓存服务器,从而获取所需的与该客户端相关的Session信息。例如,应用服务器可根据客户端的Session ID从Memcached服务器上获取整个map对象,然后再以Session的属性名称(attributeName)作为关键字(key)从所述map对象中获取相应客户端的Session信息。通过上述的步骤101 105,即可在云计算环境下实现分布式会话,从而可以在云计算环境下实现高效率、高性能、低成本、易扩展的分布式会话。进一步的,在本发明的具体实施例中,还可以对缓存服务器中存储的Session信息进行持久化操作。例如,将缓存服务器中存储的Session信息存储为一个文件;或者,将缓存服务器中存储的Session信息存储在数据库中。进一步的,在本发明的具体实施例中,为了更好地实现分布式缓存,还可以对上述的步骤104进行改进,改进后的步骤104为:在网络侧预先设置至少两个缓存服务器集群,每个缓存服务器集群中包括至少一个缓存服务器;将所获取的会话标识及相对应的Session信息存储在一个缓存服务器集群中的一个缓存服务器上,并将会话标识及相对应的Session信息复制到其它缓存服务器集群中的至少一个缓存服务器上。通过上述的操作,可以更好地实现分布式缓存,并可在多个缓存服务器集群之间完成Session信息的传递与同步,从而可以实现具有更高性能和更高可用性的分布式缓存存储体系结构,进而提高Session信息的高可用性和负载均衡性。在本发明的技术方案中,还提出一种在云计算环境下的分布式会话系统。图2为本发明中在云计算环境下的分布式会话系统的组成示意图。如图2所示,所述在云计算环境下的分布式会话系统包括:包括至少一个客户端的客户端层201、包括至少一个应用服务器的应用服务器层202、包括至少一个缓存服务器的缓存服务器层203、过滤器204和重构器205。所述客户端,用于发送Http访问请求;所述过滤器204,用于拦截所述客户端发送的Http访问请求,并从所述Http访问请求中获取该客户端的Cookie信息中的客户端的会话标识;将所述会话标识发送给重构器 205 ;所述重构器205,用于根据所获取的会话标识构造新的Http装饰类对象,将所述Http装饰类对象发送给与所述被拦截的Http访问请求相对应的应用服务器;还用于根据所获取的会话标识重构与所述客户端相关的Session信息,将所获取的会话标识及相对应的Session信息发送给缓存服务器;所述缓存服务器,用于存储所接收到的会话标识及相对应的Session信息;所述应用服务器,用于根据客户端的会话标识从所述缓存服务器上获取与所述客户端相关的Session信息。进一步地,在本发明的具体实施例中,所述缓存服务器层中可以包括至少两个缓存服务器集群,每个缓存服务器集群中包括至少一个缓存服务器。因此,所述重构器205还可用于将所获取的会话标识及相对应的Session信息发送给一个缓存服务器集群中的一个缓存服务器上。而所述缓存服务器集群中的缓存服务器,则可用于将所存储的会话标识及相对应的Session信息复制到其它缓存服务器集群中的至少一个缓存服务器上。综上所述,在本发明的技术方案中,由于可通过过滤器拦截客户端发送的Http访问请求以获取客户端的会话标识,然后根据客户端的会话标识重构与客户端相关的Session信息并存储在缓存服务器中,使得应用服务器可根据客户端的会话标识从缓存服务器中读取与客户端相关的Session信息,从而可以在云计算环境下实现高效率、高性能、低成本、易扩展的分布式会话。而且,还可以更好地实现分布式缓存,并可在多个缓存服务器集群之间完成Session信息的传递与同步,从而可以实现具有更高性能和更高可用性的分布式缓存存储体系结构,进而提高Session信息的高可用性和负载均衡性。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
权利要求
1.一种在云计算环境下实现分布式会话的方法,其特征在于,该方法包括: 通过过滤器拦截客户端发送的Http访问请求,并从所述Http访问请求中获取该客户端的Cookie信息中客户端的会话标识; 根据所获取的会话标识构造一个Http装饰类对象,将所述Http装饰类对象发送给与所述被拦截的Http访问请求相对应的应用服务器; 根据所获取的会话标识重构与所述客户端相关的会话信息;将所获取的会话标识及相对应的会话信息存储于预先设置在网络侧的缓存服务器上; 各应用服务器根据客户端的会话标识从所述缓存服务器上获取与所述客户端相关的会话信息。
2.根据权利要求1所述的方法,其特征在于, 所述过滤器为Java Servlet过滤器。
3.根据权利要求1所述的方法,其特征在于,所述根据所获取的会话标识重构与所述客户端相关的会话信息包括: 根据所获取的客户端的 会话标识,通过继承重构HttpServletRequestWrapper接口,将与所述客户端相关的会话信息封装为会话对象; 通过继承重构HttpSessionWrapper类,设定所述会话对象的存取方式。
4.根据权利要求3所述的方法,其特征在于,所述将所获取的会话标识及相对应的会话信息存储于预先设置在网络侧的缓存服务器上包括: 将所获取的会话标识及相对应的重构的会话信息通过所述继承重构的HttpServletRequestWrapper接口和HttpSessionWrapper类存储到预先设置在网络侧的缓存服务器中。
5.根据权利要求1或4所述的方法,其特征在于, 所述缓存服务器可以是Memcached服务器。
6.根据权利要求1所述的方法,其特征在于,所述将所获取的会话标识及相对应的会话信息存储于预先设置在网络侧的缓存服务器上包括: 在网络侧预先设置至少两个缓存服务器集群,每个缓存服务器集群中包括至少一个缓存服务器; 将所获取的会话标识及相对应的会话信息存储在一个缓存服务器集群中的一个缓存服务器上,并将所述会话标识及相对应的会话信息复制到其它缓存服务器集群中的至少一个缓存服务器上。
7.—种在云计算环境下的分布式会话系统,其特征中在于,该分布式会话系统包括:包括至少一个客户端的客户端层、包括至少一个应用服务器的应用服务器层、包括至少一个缓存服务器的缓存服务器层、过滤器和重构器; 所述客户端,用于发送Http访问请求; 所述过滤器,用于拦截所述客户端发送的Http访问请求,并从所述Http访问请求中获取该客户端的Cookie信息中的客户端的会话标识;将所述会话标识发送给重构器; 所述重构器,用于根据所获取的会话标识构造新的Http装饰类对象,将所述Http装饰类对象发送给与所述被拦截的Http访问请求相对应的应用服务器;还用于根据所获取的会话标识重构与所述客户端相关的会话信息,将所获取的会话标识及相对应的会话信息发送给缓存服务器; 所述缓存服务器,用于存储所接收到的会话标识及相对应的会话信息; 所述应用服务器,用于根据客户端的会话标识从所述缓存服务器上获取与所述客户端相关的会话信息。
8.根据权利要求7所述的分布式会话系统,其特征在于, 所述缓存服务器层中包括至少两个缓存服务器集群,每个缓存服务器集群中包括至少一个缓存服务器; 所述重构器,还用于将所获取的会话标识及相对应的会话信息发送给一个缓存服务器集群中的一个缓存服务器上; 所述缓存服务器,还用于将所存储的会话标识及相对应的会话信息复制到其它缓存服务器集群中的至少一个缓存服 务器上。
全文摘要
本发明提供了一种在云计算环境下实现分布式会话的方法和系统。其中的方法包括通过过滤器拦截客户端发送的Htp访问请求,从所述Http访问请求中获取客户端的会话标识;根据所获取的会话标识构造一个Http装饰类对象,将所述Http装饰类对象发送给与所述被拦截的Http访问请求相对应的应用服务器;根据所获取的会话标识重构与所述客户端相关的会话信息;将所获取的会话标识及相对应的会话信息存储于预先设置在网络侧的缓存服务器上;各应用服务器根据客户端的会话标识从所述缓存服务器上获取与所述客户端相关的会话信息。应用本发明可以在云计算环境下实现高效率、高性能、低成本、易扩展的分布式会话。
文档编号H04L29/08GK103200212SQ20121000485
公开日2013年7月10日 申请日期2012年1月4日 优先权日2012年1月4日
发明者王磊建, 孔令军, 刘涛 申请人:中国移动通信集团公司