blob: 6e71ae6d436e119826228200bdea434251e86a50 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.registry;
import org.apache.dubbo.common.utils.NamedThreadFactory;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.CuratorEvent;
import org.apache.curator.framework.api.CuratorListener;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
*/
public class ZKTools {
private static CuratorFramework client;
private static ExecutorService executor = Executors.newFixedThreadPool(1, new NamedThreadFactory("ZKTools-test", true));
public static void main(String[] args) throws Exception {
client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", 60 * 1000, 60 * 1000,
new ExponentialBackoffRetry(1000, 3));
client.start();
client.getCuratorListenable().addListener(new CuratorListener() {
@Override
public void eventReceived(CuratorFramework client, CuratorEvent event) throws Exception {
System.out.println("event notification: " + event.getPath());
System.out.println(event);
}
}, executor);
tesConditionRule();
// testStartupConfig();
// testProviderConfig();
// testPathCache();
// testTreeCache();
// testCuratorListener();
// Thread.sleep(100000);
}
public static void testStartupConfig() {
String str = "dubbo.registry.address=zookeeper://127.0.0.1:2181\n" +
"dubbo.registry.group=dubboregistrygroup1\n" +
"dubbo.metadata-report.address=zookeeper://127.0.0.1:2181\n" +
"dubbo.protocol.port=20990\n" +
"dubbo.service.org.apache.dubbo.demo.DemoService.timeout=9999\n";
// System.out.println(str);
try {
String path = "/dubboregistrygroup1/config/dubbo/dubbo.properties";
if (client.checkExists().forPath(path) == null) {
client.create().creatingParentsIfNeeded().forPath(path);
}
setData(path, str);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void testProviderConfig() {
String str = "---\n" +
"apiVersion: v2.7\n" +
"scope: service\n" +
"key: dd-test/org.apache.dubbo.demo.DemoService:1.0.4\n" +
"enabled: true\n" +
"configs:\n" +
"- addresses: ['0.0.0.0:20880']\n" +
" side: provider\n" +
" parameters:\n" +
" timeout: 6000\n" +
"...";
// System.out.println(str);
try {
String path = "/dubbo/config/dd-test*org.apache.dubbo.demo.DemoService:1.0.4/configurators";
if (client.checkExists().forPath(path) == null) {
client.create().creatingParentsIfNeeded().inBackground().forPath(path);
}
setData(path, str);
String pathaa = "/dubboregistrygroup1/config/aaa/dubbo.properties";
if (client.checkExists().forPath(pathaa) == null) {
client.create().creatingParentsIfNeeded().forPath(pathaa);
}
setData(pathaa, "aaaa");
String pathaaa = "/dubboregistrygroup1/config/aaa";
if (client.checkExists().forPath(pathaaa) == null) {
client.create().creatingParentsIfNeeded().inBackground().forPath(pathaaa);
}
setData(pathaaa, "aaaa");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void testConsumerConfig() {
String serviceStr = "---\n" +
"scope: service\n" +
"key: org.apache.dubbo.demo.DemoService\n" +
"configs:\n" +
" - addresses: [30.5.121.156]\n" +
" side: consumer\n" +
" rules:\n" +
" cluster:\n" +
" loadbalance: random\n" +
" cluster: failfast\n" +
" config:\n" +
" timeout: 9999\n" +
" weight: 222\n" +
"...";
String appStr = "---\n" +
"scope: application\n" +
"key: demo-consumer\n" +
"configs:\n" +
" - addresses: [30.5.121.156]\n" +
" services: [org.apache.dubbo.demo.DemoService]\n" +
" side: consumer\n" +
" rules:\n" +
" cluster:\n" +
" loadbalance: random\n" +
" cluster: failfast\n" +
" config:\n" +
" timeout: 4444\n" +
" weight: 222\n" +
"...";
try {
String servicePath = "/dubbo/config/org.apache.dubbo.demo.DemoService/configurators";
if (client.checkExists().forPath(servicePath) == null) {
client.create().creatingParentsIfNeeded().forPath(servicePath);
}
setData(servicePath, serviceStr);
String appPath = "/dubbo/config/demo-consumer/configurators";
if (client.checkExists().forPath(appPath) == null) {
client.create().creatingParentsIfNeeded().forPath(appPath);
}
setData(appPath, appStr);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void tesConditionRule() {
String serviceStr = "---\n" +
"scope: application\n" +
"force: true\n" +
"runtime: false\n" +
"conditions:\n" +
" - method!=sayHello =>\n" +
" - method=routeMethod1 => 30.5.121.156:20880\n" +
"...";
try {
String servicePath = "/dubbo/config/demo-consumer/routers";
if (client.checkExists().forPath(servicePath) == null) {
client.create().creatingParentsIfNeeded().forPath(servicePath);
}
setData(servicePath, serviceStr);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void setData(String path, String data) throws Exception {
client.setData().inBackground().forPath(path, data.getBytes());
}
public static void testPathCache() throws Exception {
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", 60 * 1000, 60 * 1000,
new ExponentialBackoffRetry(1000, 3));
client.start();
PathChildrenCache pathChildrenCache = new PathChildrenCache(client, "/dubbo/config", true);
pathChildrenCache.start(true);
pathChildrenCache.getListenable().addListener((zkClient, event) -> {
System.out.println(event.getData().getPath());
}, Executors.newFixedThreadPool(1));
List<ChildData> dataList = pathChildrenCache.getCurrentData();
dataList.stream().map(ChildData::getPath).forEach(System.out::println);
}
public static void testTreeCache() throws Exception {
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", 60 * 1000, 60 * 1000,
new ExponentialBackoffRetry(1000, 3));
client.start();
CountDownLatch latch = new CountDownLatch(1);
TreeCache treeCache = TreeCache.newBuilder(client, "/dubbo/config").setCacheData(true).build();
treeCache.start();
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
TreeCacheEvent.Type type = event.getType();
ChildData data = event.getData();
if (type == TreeCacheEvent.Type.INITIALIZED) {
latch.countDown();
}
System.out.println(data.getPath() + "\n");
if (data.getPath().split("/").length == 5) {
byte[] value = data.getData();
String stringValue = new String(value, StandardCharsets.UTF_8);
// fire event to all listeners
Map<String, Object> added = null;
Map<String, Object> changed = null;
Map<String, Object> deleted = null;
switch (type) {
case NODE_ADDED:
added = new HashMap<>(1);
added.put(pathToKey(data.getPath()), stringValue);
added.forEach((k, v) -> System.out.println(k + " " + v));
break;
case NODE_REMOVED:
deleted = new HashMap<>(1);
deleted.put(pathToKey(data.getPath()), stringValue);
deleted.forEach((k, v) -> System.out.println(k + " " + v));
break;
case NODE_UPDATED:
changed = new HashMap<>(1);
changed.put(pathToKey(data.getPath()), stringValue);
changed.forEach((k, v) -> System.out.println(k + " " + v));
}
}
}
});
latch.await();
/* Map<String, ChildData> dataMap = treeCache.getCurrentChildren("/dubbo/config");
dataMap.forEach((k, v) -> {
System.out.println(k);
treeCache.getCurrentChildren("/dubbo/config/" + k).forEach((ck, cv) -> {
System.out.println(ck);
});
});*/
}
private static String pathToKey(String path) {
if (StringUtils.isEmpty(path)) {
return path;
}
return path.replace("/dubbo/config/", "").replaceAll("/", ".");
}
public static void testCuratorListener() throws Exception {
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", 60 * 1000, 60 * 1000,
new ExponentialBackoffRetry(1000, 3));
client.start();
List<String> children = client.getChildren().forPath("/dubbo/config");
children.forEach(System.out::println);
/*
client.getCuratorListenable().addListener(new CuratorListener() {
@Override
public void eventReceived(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {
curatorEvent.get
}
});
*/
/*client.getChildren().usingWatcher(new CuratorWatcher() {
@Override
public void process(WatchedEvent watchedEvent) throws Exception {
System.out.println(watchedEvent.getPath());
client.getChildren().usingWatcher(this).forPath("/dubbo/config");
System.out.println(watchedEvent.getWrapper().getPath());
}
}).forPath("/dubbo/config");*/
}
}