注册【发布】
/**
*
*/
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×tamp=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));
}
}