web项目集群时共享session方案实践。
2014-05-28 17:28
603 查看
web项目在集群负载均衡时一个主要的问题就是如何共享session 。 让多台机器之间的数据统一。 不能出现用户在A机器上面登录成功, 之后访问到B机器的时候提示未登录。
如果使用nginx来实现负载均衡, 它提供了一种hash ip的策略, 将同一个ip的每次请求都转发到同一台服务器上面。 这样的话, 就不需要共享session了。 但是这样的坏处是无法让负载更好的均衡, 可能出现某些机器负载高,有些机器负载低的情况。 所以还是不建议使用这种方式。
下面想到一种负载均衡的思路,就是使用专门一台缓存服务器来保存session信息。
无论在哪台服务器登录之后,都将用户的登录信息保存在缓存服务器中。 然后给客户端设置一个cookie来标识用户的身份。 来取代jsessionid
缓存服务器可以使用membercached / redis 等内存数据库。
由于前几天刚好学习了hessian 。 所以决定自己来实现一个缓存服务器 , 并提供接口给其他项目使用。(只简单的提供了put、get两个方法)
实例场景
项目1 : cookie-server 缓存服务器
项目2 :cookie-web 普通web项目,实现了登录用例
首先来完成cookie-server (maven)项目。
1、建立cookie-cacheserver-client模块, 用于定义Hessian接口。 一些公共的VO / DTO 对象。
首先定义用于存取数据的接口 CacheService
然后定义一个LoginUser对象,来表示用户登录信息
ok 。 cookie-cacheserver-client 模块完成
2、建立cookie-cacheserver-service模块 , 实现cookie-cacheserver-client模块中定义的service
cookie-cacheserver-service 完成。
3、 建立cookie-cacheserver模块, 来当做 cacheserver的web模块。 来提供服务。
主要来配置hessian通过web的方式启动。 代码不贴了。 可以直接下载项目来看。 项目在文章最后会给出下载链接。
项目结构如图:
缓存服务器已经完成了 。
接下来做一个web项目。 该项目有主要几个功能{
1、通过login.jsp页面进行登录, 通过Login sevlet完成。
Login Servlet 内判断用户Id与nick是否符合要求,如果符合要求,就登录成功,并将用户信息保存到缓存服务器上。 然后给浏览器设置一个cookie。 将用户登录标识存入cookie , 然后跳转到 index servlet 。 在index servlet中会根据用户cookie中的标识去缓存服务器取出用户的登录信息。 然后将信息展示在index.jsp中。
}
项目就随便取了个名字cookie-weba , 项目结构如下
项目代码下载地址:项目源码
两个项目已经打成war包了。 可以部署到tomcat直接运行。 下载地址:war包
注意:在部署时,最好是将cookie-cacheserver.war 与 cookie-weba.war 分开部署到服务器上面。
我是在同一台机器上面测试了。 使用了三个tomcat , 可以将每个tomcat的端口设置成不同 。
tomcat1 使用8080端口来启动 cookie-cacheserver.war
tomcat2 使用8082端口来启动cookie-weba.war
tomcat3 使用8083端口,也来启动cookie-weba.war
然后访问tomcat2的项目 http://localhost:8082/cookie-weba/login.jsp
来登录。
登录成功后。 访问tomcat3的项目。 http://localhost:8083/cookie-webb/index.do , 如果没有登录, 将会跳转到login.jsp页面 。 如果已经登录,就会到index.jsp展示登录信息。
登录规则是:nike必须以userId字符串为开头。 nick.startsWith(id)
如果使用nginx来实现负载均衡, 它提供了一种hash ip的策略, 将同一个ip的每次请求都转发到同一台服务器上面。 这样的话, 就不需要共享session了。 但是这样的坏处是无法让负载更好的均衡, 可能出现某些机器负载高,有些机器负载低的情况。 所以还是不建议使用这种方式。
下面想到一种负载均衡的思路,就是使用专门一台缓存服务器来保存session信息。
无论在哪台服务器登录之后,都将用户的登录信息保存在缓存服务器中。 然后给客户端设置一个cookie来标识用户的身份。 来取代jsessionid
缓存服务器可以使用membercached / redis 等内存数据库。
由于前几天刚好学习了hessian 。 所以决定自己来实现一个缓存服务器 , 并提供接口给其他项目使用。(只简单的提供了put、get两个方法)
实例场景
项目1 : cookie-server 缓存服务器
项目2 :cookie-web 普通web项目,实现了登录用例
首先来完成cookie-server (maven)项目。
1、建立cookie-cacheserver-client模块, 用于定义Hessian接口。 一些公共的VO / DTO 对象。
首先定义用于存取数据的接口 CacheService
package cookie.chacheserver.client; public interface CacheService { Object getByKey(Object key) ; boolean put(Object key , Object value) ; }
然后定义一个LoginUser对象,来表示用户登录信息
package cookie.chacheserver.client; import java.io.Serializable; public class LoginUser implements Serializable { /** * */ private static final long serialVersionUID = -2958174180520979633L; private String userId ; private String nick ; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getNick() { return nick; } public void setNick(String nick) { this.nick = nick; } }
ok 。 cookie-cacheserver-client 模块完成
2、建立cookie-cacheserver-service模块 , 实现cookie-cacheserver-client模块中定义的service
package cookie.cacheserver.service; import java.util.concurrent.ConcurrentHashMap; import cookie.chacheserver.client.CacheService; public class CacheServiceImpl implements CacheService{ private static final ConcurrentHashMap<Object, Object> cacheMap = new ConcurrentHashMap<Object, Object>() ; public Object getByKey(Object key) { return cacheMap.get(key) ; } public boolean put(Object key, Object value) { cacheMap.put(key, value) ; return cacheMap.containsKey(key) ; } }
cookie-cacheserver-service 完成。
3、 建立cookie-cacheserver模块, 来当做 cacheserver的web模块。 来提供服务。
主要来配置hessian通过web的方式启动。 代码不贴了。 可以直接下载项目来看。 项目在文章最后会给出下载链接。
项目结构如图:
缓存服务器已经完成了 。
接下来做一个web项目。 该项目有主要几个功能{
1、通过login.jsp页面进行登录, 通过Login sevlet完成。
Login Servlet 内判断用户Id与nick是否符合要求,如果符合要求,就登录成功,并将用户信息保存到缓存服务器上。 然后给浏览器设置一个cookie。 将用户登录标识存入cookie , 然后跳转到 index servlet 。 在index servlet中会根据用户cookie中的标识去缓存服务器取出用户的登录信息。 然后将信息展示在index.jsp中。
}
项目就随便取了个名字cookie-weba , 项目结构如下
项目代码下载地址:项目源码
两个项目已经打成war包了。 可以部署到tomcat直接运行。 下载地址:war包
注意:在部署时,最好是将cookie-cacheserver.war 与 cookie-weba.war 分开部署到服务器上面。
我是在同一台机器上面测试了。 使用了三个tomcat , 可以将每个tomcat的端口设置成不同 。
tomcat1 使用8080端口来启动 cookie-cacheserver.war
tomcat2 使用8082端口来启动cookie-weba.war
tomcat3 使用8083端口,也来启动cookie-weba.war
然后访问tomcat2的项目 http://localhost:8082/cookie-weba/login.jsp
来登录。
登录成功后。 访问tomcat3的项目。 http://localhost:8083/cookie-webb/index.do , 如果没有登录, 将会跳转到login.jsp页面 。 如果已经登录,就会到index.jsp展示登录信息。
登录规则是:nike必须以userId字符串为开头。 nick.startsWith(id)
相关文章推荐
- 纯Java Web项目下的Session共享方案收集(待实践)
- 在同一个tomcat下,不同的web项目共享session
- Tomcat 服务器配置及远程调试和不同web项目session共享方法以及设置TOMCAT的内存
- 大型网站系统架构实践(六)深入探讨web应用集群Session保持
- Tomcat 同一服务器上 不同web项目共享session的
- 解决WEB集群session同步的方案,Redis内存缓存
- 在同一个tomcat下,不同的web项目共享session
- 同一tomcat下不同web项目session共享方法
- Tomcat 不同web项目session共享.
- Apache + tomcat实现高并发负载均衡方案(四)----实现session共享(memcache)的集群
- nginx+tomcat7+memcache集群,使用memcached-session-manager实现session共享方案
- 在同一个tomcat下,不同的web项目共享session
- 在同一个tomcat下,不同的web项目共享session
- 大型网站系统架构实践(六)深入探讨web应用集群Session保持
- 同一tomcat下不同web项目session共享方法
- 在同一个tomcat下,不同的web项目共享session
- Apache+tomcat实现负载均衡集群和session共享、tengine+tomcat实现web动静分离
- 关于同一tomcat服务器下2个不同的web项目如何共享session的问题
- 项目分布式部署那些事(2):基于OCS(Memcached)的Session共享方案
- 同一tomcat下不同web项目session共享方法