web项目集群时共享session方案实践。

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) 






评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值