netty入门(zookeeper-java发布和发现)

注册【发布】

/**
 * 
 */
package com.cn.server.zuk.registry;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 */
public class ServiceRegistry {
	private static final int ZK_SESSION_TIMEOUT = 5000;
	private static final String ZK_REGISTRY_PATH = "/rpc";
//	private static final String ZK_PROVIDE_PATH = ZK_REGISTRY_PATH + "/provide";
//	private static final String ZK_CONSUMER_PATH = ZK_REGISTRY_PATH + "/consumer";
	
    private static final Logger logger = LoggerFactory.getLogger(ServiceRegistry.class);

    private CountDownLatch latch = new CountDownLatch(1);

    private String registryAddress;
    
    
    public static void main(String[] args) throws IOException {
    	ServiceRegistry serviceRegistry = new ServiceRegistry("127.0.0.1:2181");
    	serviceRegistry.register("127.0.0.1:18866");
    	System.in.read();
	}
    

    public ServiceRegistry(String registryAddress) {
        this.registryAddress = registryAddress;
    }

    public void register(String data) {
        if (data != null) {
            ZooKeeper zk = connectServer();
            if (zk != null) {
                AddRootNode(zk);
                List<String> ls = new ArrayList<String>();
                ls.add("com.a.zuk.server.service.HelloService");
                ls.add("com.a.zuk.server.service.HiService");
                for(String node : ls){
                	this.createNodeEphemeral(zk, node);
                	this.createNodeProvideEphemeral(zk, node);
                }
            }
        }
    }
    
    /**
     * 创建接口临时节点
     * */
    private void createNodeEphemeral(ZooKeeper zk, String node){
    	try {
    		
    		node = ZK_REGISTRY_PATH + "/" + node;
    		System.out.println(node);
    		Stat s = zk.exists(node, false);
    		if(s==null){
    			String str = "node values.";
    			zk.create(node, str.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    		}
    		
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    /**
     * 创建发布节点
     * */
    private void createNodeProvideEphemeral(ZooKeeper zk, String node){
    	try {
    		
    		String provides = ZK_REGISTRY_PATH + "/" + node + "/" + "provides";
    		System.out.println(provides);
    		Stat s = zk.exists(provides, false);
    		if(s==null){
    			zk.create(provides, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    		}
    		
    		String rpc1 = provides + "/" + "rpc:%2F%2F127.0.0.1:20884%2Fcom.a.zuk.server.service.HelloService?interface=com.a.zuk.server.service.HelloService&methods=sayHello";
    		s = zk.exists(rpc1, false);
    		if(s==null){
    			zk.create(rpc1, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
    		}
    		
    		String rpc2 = provides + "/" + "rpc:%2F%2F127.0.0.1:20884%2Fcom.a.zuk.server.service.HiService?interface=com.a.zuk.server.service.HiService&methods=sayHi";
    		s = zk.exists(rpc2, false);
    		if(s==null){
    			zk.create(rpc2, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
    		}
    		
    		String consumers = ZK_REGISTRY_PATH + "/" + node + "/" + "consumers";
    		System.out.println(consumers);
    		s = zk.exists(consumers, false);
    		if(s==null){
    			zk.create(consumers, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    		}
    		
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
   

    private ZooKeeper connectServer() {
        ZooKeeper zk = null;
        try {
            zk = new ZooKeeper(registryAddress, ZK_SESSION_TIMEOUT, new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == Event.KeeperState.SyncConnected) {
                        latch.countDown();
                    }
                }
            });
            latch.await();
        } catch (IOException e) {
            logger.error("", e);
        }
        catch (InterruptedException ex){
            logger.error("", ex);
        }
        return zk;
    }
    //dubbo://10.118.131.58:20884/com.paic.hm.meeting.dubbo.meetingroom.ZwtMeetingRoomDubboService?anyhost=true&application=szsc-meeting&dubbo=2.6.0&generic=false&group=pasc&interface=com.paic.hm.meeting.dubbo.meetingroom.ZwtMeetingRoomDubboService&methods=queryAllZwtMeetingRoom,delZwtMeetingRoom,editZwtMeetingRoom,findZwtMeetingRoom,addZwtMeetingRoom&pid=29376&revision=1.0.0&side=provider&timeout=6000&timestamp=1545794869851&version=1.0.0
    private void AddRootNode(ZooKeeper zk){
        try {
        	
        	//创建根节点
            Stat s = zk.exists(ZK_REGISTRY_PATH, false);
            if (s == null) {
                zk.create(ZK_REGISTRY_PATH, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            }
            
        } catch (KeeperException e) {
            logger.error(e.toString());
        } catch (InterruptedException e) {
            logger.error(e.toString());
        }
    }

}

发现

/**
 * 
 */
package com.cn.server.zuk.registry;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;


/**
 */
public class ServiceDiscovery {
	
	private CountDownLatch latch = new CountDownLatch(1);
	
	private static final int ZK_SESSION_TIMEOUT = 5000;
	
	private static final String ZK_REGISTRY_PATH = "/rpc";
	
	private static final Logger logger = LoggerFactory.getLogger(ServiceDiscovery.class);
	
	private volatile List<String> dataList = new ArrayList<>();
	
    private String registryAddress;
    private ZooKeeper zookeeper;
    
    public static void main(String[] args) throws IOException {
    	ServiceDiscovery ServiceDiscovery = new ServiceDiscovery("127.0.0.1:2181");
    	System.in.read();
	}
	
    public ServiceDiscovery(String registryAddress) {
    	this.registryAddress = registryAddress;
    	zookeeper = connectServer();
        if (zookeeper != null) {
            watchNode(zookeeper);
        }
    }
    
    private ZooKeeper connectServer() {
        ZooKeeper zk = null;
        try {
            zk = new ZooKeeper(registryAddress, ZK_SESSION_TIMEOUT, new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    if (event.getState() == Event.KeeperState.SyncConnected) {
                        latch.countDown();
                    }
                }
            });
            latch.await();
        } catch (IOException | InterruptedException e) {
            logger.error("", e);
        }
        return zk;
    }
    
    private void watchNode(final ZooKeeper zk) {
        try {
            List<String> nodeList = zk.getChildren(ZK_REGISTRY_PATH, 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) {
            	System.out.println("变化的节点:"+node);
                byte[] bytes = zk.getData(ZK_REGISTRY_PATH + "/" + node, false, null);
                System.out.println("变化的节点值:"+new String(bytes));
                dataList.add(new String(bytes));
            }
            logger.debug("node data: {}", dataList);
            this.dataList = dataList;

            logger.debug("Service discovery triggered updating connected server node.");
            UpdateConnectedServer();
        } catch (KeeperException | InterruptedException e) {
            logger.error("", e);
        }
    }
    
    private void UpdateConnectedServer(){
    	logger.info("dataList:"+JSON.toJSONString(this.dataList));
    }
    

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值