服务提供者中拷贝 Constants
服务提供者中拷贝 UserService
连接 Zk 集群
/***
* 连接ZooKeeper集群
*/
public ZooKeeper connectZk() {
ZooKeeper zk = null;
try {
zk = new ZooKeeper(Constants.host, Constants.ZK_TIME_OUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
// 判断是否连接zk集群
if (event.getState() == Event.KeeperState.SyncConnected) {
latch.countDown();//唤醒处于等待状态的连接
}
}
});
latch.await(); //使当前线程处于等待状态
} catch (Exception e) {
e.printStackTrace();
}
return zk;
}
注册 watcher
/**
* 观察/provider节点中的数据是否有变化
*
* @param zk
*/
public void watchNode(ZooKeeper zk) {
try {
//观察/provider下面的结点是否有变化
List<String> nodelist = zk.getChildren(Constants.ZK_REGISTER, new Watcher() {
@Override
public void process(WatchedEvent event) {
//子节点发生变化
if (event.getType() == Event.EventType.NodeChildrenChanged) {
watchNode(zk);
}
}
});
//存放读取的地址数据
List<String> datalist = new ArrayList<>();
for (String node : nodelist) {
byte[] data = zk.getData(Constants.ZK_REGISTER + "/" + node, false, null);
datalist.add(new String(data));
}
//将datalist复制给urls
urls = datalist;
} catch (Exception e) {
e.printStackTrace();
}
}
获取远程服务
/**
* 获取rmi的远程服务对象
*/
public <T> T lookupService(String url) {
T remote = null;
try {
remote = (T) Naming.lookup(url);
} catch (Exception e) {
if (e instanceof ConnectException) {
if (urls.size() != 0) {
url = urls.get(0);
return lookupService(url);
}
}
}
return remote;
}
随机获取远程服务
**
* 查找rmi服务,,通过随机算法,产生一个URL
*/
public <T extends Remote> T lookup() {
T service = null;
int size = urls.size();
if (size > 0) {
String url = null;
if (size == 1) {
url = urls.get(0);
} else {
//产生随机数
int random = ThreadLocalRandom.current().nextInt(size);
url = urls.get(random);
}
System.out.println("==========" + url);
service = lookupService(url);
}
return service;
}
创建无参数构造方法、
public ServiceConsumer(){
ZooKeeper zk=connectZk();
if (zk!=null){
watchNode(zk);
}
}
创建启动类消费服务
package com.bjsxt.app;
import com.bjsxt.service.UserService;
import com.bjsxt.service.ServiceConsumer;
import java.rmi.RemoteException;
public class ZkClusterConsumerApp {
public static void main(String[] args) throws RemoteException, InterruptedException {
ServiceConsumer serviceConsumer=new ServiceConsumer();
while (true){
UserService userService=serviceConsumer.lookup();
//调用远程的方法
String result = userService.helloRem("zhangsan");
System.out.println("result= "+result);
Thread.sleep(3000);
}
}
}