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)
202

被折叠的 条评论
为什么被折叠?



