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