kestrel利用dubbo和memcached协议实现 队列服务

本文介绍了如何利用Kestrel、Memcached协议和Dubbo来搭建队列服务。首先解压安装Kestrel并创建启动脚本。接着安装并启动Memcached。然后部署Zookeeper伪集群。再安装Dubbo Web管理界面并配置服务。最后,通过服务名、服务地址等信息完成配置,并进行测试。所需依赖包括相关jar包。

1.解压安装,kestrel-2.3.4.tar.gz

编写启动脚本,并启动。

start_kestrel.sh:

#设置工作目录
WOKR_DIR=.
#设置lib库目录
EXTEN_LIB_HOME=$WOKR_DIR/lib
#设置执行类库目录
CLASS_DIR=kestrel_2.9.1-2.3.4.jar
#设置path路径分隔符
PATH_SPLIT=:
#设置java路径
JAVA_HOME=/usr/java/jdk1.6.0_38
JAVA=$JAVA_HOME/bin/java
#设置classpath
CLASSPATH=$CLASSPATH$PATH_SPLIT$CLASS_DIR
for i in $EXTEN_LIB_HOME/*.*; do
  CLASSPATH="$CLASSPATH":"$i"
done
export CLASSPATH
#设置内存
#JAVA_OPTS="$JAVA_OPTS -server -Xmx2048m -agentpath:/home/soft/yjp-8.0.30/bin/linux-x86-32/libyjpagent.so"
JAVA_OPTS="$JAVA_OPTS -server -Xmx2048m"
echo


echo JDK is $JAVA


echo


echo CLASSPATH is $CLASSPATH


echo


echo MAINCLASS is $BEAN


echo
#执行
$JAVA -jar kestrel_2.9.1-2.3.4.jar &


2.安装memcached-1.4.24.tar.gz

启动memcached :

memcached -p 12677 -U 0 -d -r -u root -m 2040 -c 1024 -t 4




3.安装zookeeper-3.4.3(这里做了伪集群,安装步骤请查找相关资料)启动zookeeper

4.安装dubbo Web管理界面(官网下载dubbo-admin-tomcat.tar.gz  )解压后,修改ROOT/WEB-INF/dubbo.properties.,并启动tomcat


dubbo.registry.address=zookeeper://X.X.X.X:2181(zookeeper服务地址)
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

5.编写队列接口类:

public abstract interface Queue extends java.util.Queue
{
  public abstract boolean add(String paramString, Object paramObject);

  public abstract Object element(String paramString);

  public abstract boolean offer(String paramString, Object paramObject);

  public abstract Object peek(String paramString);

  public abstract Object poll(String paramString);

  public abstract Object remove(String paramString);

  public abstract void setServers(String[] paramArrayOfString);

  public abstract int size(String paramString);

  public abstract void init();

  public abstract void destroy();
}


6.编写实现类

import java.util.Collection;
import java.util.Iterator;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.MonitorConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;

public class QueueImpl  implements Queue
{	
	  public QueueImpl() {
		super();
	}

	private String[] servers = new String[0];

	  private ReferenceConfig<Queue> reference = null;

	  public void setServers(String[] servers)
	  {
	    if (servers == null)
	      this.servers = new String[0];
	    else
	      this.servers = servers;
	  }

	  public void destroy()
	  {
	    if (this.reference != null) {
	      this.reference.destroy();
	      this.reference = null;
	    }
	  }

	  public void init()
	  {
	    ApplicationConfig application = new ApplicationConfig();
	    application.setName("queue");
	
	    RegistryConfig registry = new RegistryConfig();
	    String zookeeperAddress = "zookeeper://";
	    for (int i = 0; i < this.servers.length; i++) {
	      zookeeperAddress = zookeeperAddress + this.servers[i];
	      if ((this.servers.length > 1) && (i == 0)) {
	        zookeeperAddress = zookeeperAddress + "?backup=";
	      }
	      if ((i < this.servers.length - 1) && (i > 0)) {
	        zookeeperAddress = zookeeperAddress + ",";
	      }
	    }
	    MonitorConfig monitor = new MonitorConfig();
	    monitor.setProtocol("registry");//监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心
	    registry.setAddress(zookeeperAddress);//注册中心服务器地址
	    this.reference = new ReferenceConfig(); //用于创建一个远程服务代理,可以像使用本地bean一样使用demoService
	  
	    this.reference.setApplication(application);
	  
	    this.reference.setRegistry(registry);//设置注册中心 
	 
	    this.reference.setMonitor(monitor);
	 
	    this.reference.setInterface(Queue.class);//
	
	  }

	  public boolean add(String queueName, Object e)
	  {
	    Queue queue = (Queue)this.reference.get();
	    return queue.add(queueName, e);
	  }

	  public Object element(String queueName)
	  {
	    Queue queue = (Queue)this.reference.get();
	    return queue.element(queueName);
	  }

	  public boolean offer(String queueName, Object e)
	  {
	    Queue queue = (Queue)this.reference.get();
	    return queue.offer(queueName, e);
	  }

	  public Object peek(String queueName)
	  {
	    Queue queue = (Queue)this.reference.get();
	    return queue.peek(queueName);
	  }

	  public Object poll(String queueName)
	  {
	    Queue queue = (Queue)this.reference.get();
	    return queue.poll(queueName);
	  }

	  public Object remove(String queueName)
	  {
	    Queue queue = (Queue)this.reference.get();
	    return queue.remove(queueName);
	  }


	  public boolean add(Object e)
	  {
	    return false;
	  }

	  public Object element()
	  {
	    return null;
	  }

	  public boolean offer(Object e)
	  {
	    return false;
	  }

	  public Object peek()
	  {
	    return null;
	  }

	  public Object poll()
	  {
	    return null;
	  }

	  public Object remove()
	  {
	    return null;
	  }

	  public boolean addAll(Collection c)
	  {
	    return false;
	  }

	  public void clear()
	  {
	  }

	  public boolean contains(Object o)
	  {
	    return false;
	  }

	  public boolean containsAll(Collection c)
	  {
	    return false;
	  }

	  public boolean isEmpty()
	  {
	    return false;
	  }

	  public Iterator iterator()
	  {
	    return null;
	  }

	  public boolean remove(Object o)
	  {
	    return false;
	  }

	  public boolean removeAll(Collection c)
	  {
	    return false;
	  }

	  public boolean retainAll(Collection c)
	  {
	    return false;
	  }

	  public int size()
	  {
	    return 0;
	  }

	  public Object[] toArray()
	  {
	    return null;
	  }

	  public Object[] toArray(Object[] a)
	  {
	    return null;
	  }

	  public int size(String queueName)
	  {
	    Queue queue = (Queue)this.reference.get();
	    return queue.size(queueName);
	  }
	}

7.配置dubbo服务

1)

服务名:x.x.x.Queue

2)

服务地址:memcached://X.X.X.X:22133/x.x.x.Queue?application=zqueue&dynamic=false&interface=x.x.x.Queue&loadbalance=consistenthash

3)保存并启用


8:测试


public class QueueTestMian {

	
	public static void main(String[] args) {
		
		 QueueImpl queue = new QueueImpl();
	    queue.setServers(new String[] { "x.x.x.x:2181", 
	       "x.x.x.x:2182", "x.x.x.x:2183"});
		 
	     queue.init();
	 for (int i = 0; i <10; i++) {
		 queue.offer("test_queue1", Integer.valueOf(i));
	}
	 
	 try {
		Thread.sleep(2000);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	System.out.println(queue.poll("test_queue")); 
	System.out.println(queue.poll("test_queue")); 
	System.out.println(queue.poll("test_queue")); 
	System.out.println(queue.poll("test_queue")); 
	System.out.println(queue.poll("test_queue")); 
	 
	
}

}

依赖jar包如下:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值