使用 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);

    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-12-11 08:56  sakura-yxf  阅读(569)  评论(0)    收藏  举报