使用 Zookeeper 的 Api 实现服务注册

创建常量接口
com.bjsxt.constant.Constants
package com.bjsxt.constant;
public interface Constants {
//访问ZooKeeper集群的URL
String host="192.168.181.129:2181,192.168.181.129:2182,192.168.181.129:2183,";
//连接ZooKeeper的超时时间
int ZK_TIME_OUT=5000;
//ZooKeeper集群中注册服务的URL永久结点
String ZK_REGISTER="/provider";
//ZooKeeper集群中注册服务的URL瞬时结点
String ZK_RMI=ZK_REGISTER+"/rmi";
}
com.bjsxt.service.impl.UserService
package com.bjsxt.service.impl;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface UserService extends Remote {
public String helloRem(String name) throws RemoteException;
}
实现类接口
com.bjsxt.service.impl.impl.UserServiceImpl
package com.bjsxt.service.impl.impl;
import com.bjsxt.service.impl.UserService;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class UserServiceImpl extends UnicastRemoteObject implements UserService {
public UserServiceImpl() throws RemoteException {
}
@Override
public String helloRem(String name) throws RemoteException {
return "name= "+name;
}
}
创建服务地址的写入节点
com.bjsxt.service.impl.impl.ServiceProvider
package com.bjsxt.service.impl.impl;
import com.bjsxt.constant.Constants;
import org.apache.zookeeper.*;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.registry.LocateRegistry;
import java.util.concurrent.CountDownLatch;
public class ServiceProvider {
CountDownLatch latch=new CountDownLatch(1);
/***
* 连接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;
}
/**
* 创建znode结点
*/
public void createNode(ZooKeeper zk,String url){
try {
//将保存的数据URL转换成字节数组
byte[] data=url.getBytes();
zk.create(Constants.ZK_RMI,data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 发布rmi服务,并且将服务的URL注册到zk集群中
*/
public String publishService(Remote remote,String host,int port){
String url=null;
try {
LocateRegistry.createRegistry(port);
url="rmi://"+host+":"+port+"/rmiservice";
Naming.bind(url,remote);
}catch (Exception e){
e.printStackTrace();
}
return url;
}
}
发布 RMI 服务
/**
* 发布rmi服务,并且将服务的url注册到zk集群
*/
public void publish(Remote remote,String host,int port){
//调用publishService,返回值服务url
String url = publishService(remote, host, port);
if (url!=null){
ZooKeeper zk=connectZk();
if (zk!=null){
createNode(zk,url);
}
}
}
创建启动类
注意:
运行三次启动类,实现服务的集群发布,提高服务的高可用行(HA),每次启动端口号需要修改拷贝前一天课程发布 RMI 服务的 UserService 接口和 UserServiceImpl 实现类
com.bjsxt.app.ZkClusterProviderApp
package com.bjsxt.app;
import com.bjsxt.service.impl.UserService;
import com.bjsxt.service.impl.impl.ServiceProvider;
import com.bjsxt.service.impl.impl.UserServiceImpl;
import java.rmi.RemoteException;
public class ZkClusterProviderApp {
public static void main(String[] args) throws RemoteException {
//创建ServiceProvider对象
ServiceProvider serviceProvider=new ServiceProvider();
//创建UserService对象
UserService userService=new UserServiceImpl();
System.out.println("==========7777================");
serviceProvider.publish(userService,"localhost",7777);
}
}

浙公网安备 33010602011771号