您的位置:首页 > 其它

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

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: