diff --git a/skywalking-storage-center/skywalking-routing/src/main/java/com/a/eye/skywalking/routing/Main.java b/skywalking-storage-center/skywalking-routing/src/main/java/com/a/eye/skywalking/routing/Main.java
index 5df9c01fb..2e90e30c0 100644
--- a/skywalking-storage-center/skywalking-routing/src/main/java/com/a/eye/skywalking/routing/Main.java
+++ b/skywalking-storage-center/skywalking-routing/src/main/java/com/a/eye/skywalking/routing/Main.java
@@ -6,6 +6,7 @@ import com.a.eye.skywalking.logging.impl.log4j2.Log4j2Resolver;
import com.a.eye.skywalking.network.Server;
import com.a.eye.skywalking.registry.RegistryCenterFactory;
import com.a.eye.skywalking.registry.api.RegistryCenter;
+import com.a.eye.skywalking.registry.assist.NetUtils;
import com.a.eye.skywalking.registry.impl.zookeeper.ZookeeperConfig;
import com.a.eye.skywalking.routing.config.Config;
import com.a.eye.skywalking.routing.config.ConfigInitializer;
@@ -30,7 +31,9 @@ public class Main {
center.start(fetchRegistryCenterConfig());
center.subscribe(Config.StorageNode.SUBSCRIBE_PATH, RoutingService.getRouter());
- Server.newBuilder(Config.Routing.PORT).addSpanStorageService(new SpanStorageListenerImpl()).addTraceSearchService(new TraceSearchListenerImpl()).build().start();
+ Server.newBuilder(Config.Server.PORT).addSpanStorageService(new SpanStorageListenerImpl()).addTraceSearchService(new TraceSearchListenerImpl()).build().start();
+
+ center.register(Config.RegistryCenter.PATH_PREFIX + NetUtils.getLocalAddress().getHostAddress() + ":" + Config.Server.PORT);
logger.info("Skywalking routing service was started.");
Thread.currentThread().join();
} catch (Exception e) {
diff --git a/skywalking-storage-center/skywalking-routing/src/main/java/com/a/eye/skywalking/routing/config/Config.java b/skywalking-storage-center/skywalking-routing/src/main/java/com/a/eye/skywalking/routing/config/Config.java
index f292e566e..f9f902ae6 100644
--- a/skywalking-storage-center/skywalking-routing/src/main/java/com/a/eye/skywalking/routing/config/Config.java
+++ b/skywalking-storage-center/skywalking-routing/src/main/java/com/a/eye/skywalking/routing/config/Config.java
@@ -1,7 +1,7 @@
package com.a.eye.skywalking.routing.config;
public class Config {
- public static class Routing {
+ public static class Server {
public static int PORT = 23000;
}
diff --git a/skywalking-webui/pom.xml b/skywalking-webui/pom.xml
index 0ab294bf0..9c46d755f 100644
--- a/skywalking-webui/pom.xml
+++ b/skywalking-webui/pom.xml
@@ -34,6 +34,11 @@
skywalking-logging-impl-log4j2
${project.parent.version}
+
+ com.a.eye
+ skywalking-registry
+ ${project.parent.version}
+
org.springframework
@@ -105,6 +110,5 @@
test
-
diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/client/routing/RoutingServerWatcher.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/client/routing/RoutingServerWatcher.java
new file mode 100644
index 000000000..a1abb9acd
--- /dev/null
+++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/client/routing/RoutingServerWatcher.java
@@ -0,0 +1,49 @@
+package com.a.eye.skywalking.web.client.routing;
+
+import com.a.eye.skywalking.network.Client;
+import com.a.eye.skywalking.network.grpc.client.TraceSearchClient;
+import com.a.eye.skywalking.registry.api.NotifyListener;
+import com.a.eye.skywalking.registry.api.RegistryNode;
+
+import java.util.*;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Created by wusheng on 2016/12/6.
+ */
+public class RoutingServerWatcher implements NotifyListener {
+ private ReentrantLock lock = new ReentrantLock();
+
+ private static Map allSearchClients = new HashMap();
+ private static Map allClient = new HashMap<>();
+
+
+ public static TraceSearchClient[] getAllSearchClient(){
+ return allSearchClients.values().toArray(new TraceSearchClient[0]);
+ }
+
+ @Override
+ public void notify(List registryNodes) {
+ lock.lock();
+ try {
+ registryNodes.forEach((each) -> {
+ if (RegistryNode.ChangeType.ADDED.equals(each.getChangeType())) {
+ String connectionURL = each.getNode();
+ String[] urlSegment = connectionURL.split(":");
+ if (urlSegment.length != 2) {
+ throw new IllegalArgumentException();
+ }
+ Client client = new Client(urlSegment[0], Integer.valueOf(urlSegment[1]));
+ TraceSearchClient traceSearchClient = client.newTraceSearchClient();
+ allClient.put(connectionURL, client);
+ allSearchClients.put(connectionURL, traceSearchClient);
+ } else {
+ allSearchClients.remove(each.getNode());
+ allClient.remove(each.getNode()).shutdown();
+ }
+ });
+ } finally {
+ lock.unlock();
+ }
+ }
+}
diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/client/routing/SearchClient.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/client/routing/SearchClient.java
new file mode 100644
index 000000000..2b5089459
--- /dev/null
+++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/client/routing/SearchClient.java
@@ -0,0 +1,27 @@
+package com.a.eye.skywalking.web.client.routing;
+
+import com.a.eye.skywalking.network.grpc.client.TraceSearchClient;
+import com.a.eye.skywalking.web.dto.TraceNodesResult;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+/**
+ * Created by wusheng on 2016/12/6.
+ */
+public class SearchClient {
+ private TraceSearchClient client;
+
+ public SearchClient() {
+ TraceSearchClient[] allSearchClients = RoutingServerWatcher.getAllSearchClient();
+
+ client = allSearchClients[ThreadLocalRandom.current().nextInt(0, allSearchClients.length)];
+ }
+
+ public TraceNodesResult searchSpan(String traceId){
+ String[] traceIdSegments = traceId.split(".");
+ if(traceIdSegments.length != 6){
+ return new TraceNodesResult();
+ }
+ return new TraceNodesResult();
+ }
+}
diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/config/Config.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/config/Config.java
index 3cef04b5a..0d36cedfe 100644
--- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/config/Config.java
+++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/config/Config.java
@@ -5,14 +5,13 @@ package com.a.eye.skywalking.web.config;
*/
public class Config {
public static class RegistryCenter {
+ public static String TYPE = "zookeeper";
public static String AUTH_INFO = "";
public static String AUTH_SCHEMA = "";
public static String CONNECT_URL = "127.0.0.1:2181";
-
- public static String PATH_PREFIX = "/skywalking/storage_list/";
}
public static class RoutingNode {
diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/SearchController.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/SearchController.java
index e5c207b3c..36c93ec1b 100644
--- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/SearchController.java
+++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/controller/SearchController.java
@@ -1,5 +1,9 @@
package com.a.eye.skywalking.web.controller;
+import com.a.eye.skywalking.registry.RegistryCenterFactory;
+import com.a.eye.skywalking.registry.api.RegistryCenter;
+import com.a.eye.skywalking.registry.impl.zookeeper.ZookeeperConfig;
+import com.a.eye.skywalking.web.client.routing.RoutingServerWatcher;
import com.a.eye.skywalking.web.common.BaseController;
import com.a.eye.skywalking.web.config.Config;
import com.a.eye.skywalking.web.config.ConfigInitializer;
@@ -44,6 +48,11 @@ public class SearchController extends BaseController {
Properties properties = new Properties();
properties.load(SearchController.class.getResourceAsStream("/config.properties"));
ConfigInitializer.initialize(properties, Config.class);
+
+ RegistryCenter center = RegistryCenterFactory.INSTANCE.getRegistryCenter(Config.RegistryCenter.TYPE);
+
+ center.start(fetchRegistryCenterConfig());
+ center.subscribe(Config.RoutingNode.SUBSCRIBE_PATH, new RoutingServerWatcher());
}
@RequestMapping(value = "/search/traceId", produces = "application/json; charset=UTF-8")
@@ -89,4 +98,12 @@ public class SearchController extends BaseController {
//TODO: not provided in this release
return "";
}
+
+ private static Properties fetchRegistryCenterConfig() {
+ Properties centerConfig = new Properties();
+ centerConfig.setProperty(ZookeeperConfig.CONNECT_URL, Config.RegistryCenter.CONNECT_URL);
+ centerConfig.setProperty(ZookeeperConfig.AUTH_SCHEMA, Config.RegistryCenter.AUTH_SCHEMA);
+ centerConfig.setProperty(ZookeeperConfig.AUTH_INFO, Config.RegistryCenter.AUTH_INFO);
+ return centerConfig;
+ }
}
diff --git a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dao/impl/TraceNodeDao.java b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dao/impl/TraceNodeDao.java
index 7d8ab63e1..c807a4bcb 100644
--- a/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dao/impl/TraceNodeDao.java
+++ b/skywalking-webui/src/main/java/com/a/eye/skywalking/web/dao/impl/TraceNodeDao.java
@@ -1,6 +1,7 @@
package com.a.eye.skywalking.web.dao.impl;
import com.a.eye.skywalking.network.grpc.Span;
+import com.a.eye.skywalking.web.client.routing.SearchClient;
import com.a.eye.skywalking.web.dao.inter.ITraceNodeDao;
import com.a.eye.skywalking.web.dto.TraceNodeInfo;
import com.a.eye.skywalking.web.dto.TraceNodesResult;
@@ -28,7 +29,8 @@ public class TraceNodeDao implements ITraceNodeDao {
InvocationTargetException {
List searchResult = new ArrayList<>();
- TraceNodesResult result = new TraceNodesResult();
+ SearchClient client = new SearchClient();
+ TraceNodesResult result = client.searchSpan(traceId);
Map traceNodeInfoMap = new HashMap<>();
searchResult.forEach((span -> {
traceNodeInfoMap.put(span.getLevelId(), new TraceNodeInfo(span));