diff --git a/apm-collector/apm-collector-client/client-h2/pom.xml b/apm-collector/apm-collector-client/client-h2/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bf8b6d0cc31c309801d91647747748154323bbab
--- /dev/null
+++ b/apm-collector/apm-collector-client/client-h2/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ apm-collector-client
+ org.skywalking
+ 3.2-2017
+
+ 4.0.0
+
+ client-h2
+ jar
+
+
+
+ com.h2database
+ h2
+ 1.4.196
+
+
+
\ No newline at end of file
diff --git a/apm-collector/apm-collector-client/client-h2/src/main/java/org/skywalking/apm/collector/client/h2/H2Client.java b/apm-collector/apm-collector-client/client-h2/src/main/java/org/skywalking/apm/collector/client/h2/H2Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4855190ac155bb5edbe8473fb2aac74f573f2f5
--- /dev/null
+++ b/apm-collector/apm-collector-client/client-h2/src/main/java/org/skywalking/apm/collector/client/h2/H2Client.java
@@ -0,0 +1,38 @@
+package org.skywalking.apm.collector.client.h2;
+
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.client.ClientException;
+
+/**
+ * @author pengys5
+ */
+public class H2Client implements Client {
+
+ @Override public void initialize() throws ClientException {
+
+ }
+
+ @Override public void insert(String path) throws ClientException {
+
+ }
+
+ @Override public void update() {
+
+ }
+
+ @Override public String select(String path) throws ClientException {
+ return null;
+ }
+
+ @Override public void delete() {
+
+ }
+
+ @Override public boolean exist(String path) throws ClientException {
+ return false;
+ }
+
+ @Override public void listen(String path) throws ClientException {
+
+ }
+}
diff --git a/apm-collector/apm-collector-client/client-redis/pom.xml b/apm-collector/apm-collector-client/client-redis/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d16292efea70fae18faa4439814493b975010982
--- /dev/null
+++ b/apm-collector/apm-collector-client/client-redis/pom.xml
@@ -0,0 +1,14 @@
+
+
+
+ apm-collector-client
+ org.skywalking
+ 3.2-2017
+
+ 4.0.0
+
+ client-redis
+ jar
+
\ No newline at end of file
diff --git a/apm-collector/apm-collector-client/client-redis/src/main/java/org/skywalking/apm/collector/client/redis/RedisClient.java b/apm-collector/apm-collector-client/client-redis/src/main/java/org/skywalking/apm/collector/client/redis/RedisClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..539d10fcacaabd13ef5c05c6db3a30d0de04ac49
--- /dev/null
+++ b/apm-collector/apm-collector-client/client-redis/src/main/java/org/skywalking/apm/collector/client/redis/RedisClient.java
@@ -0,0 +1,38 @@
+package org.skywalking.apm.collector.client.redis;
+
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.client.ClientException;
+
+/**
+ * @author pengys5
+ */
+public class RedisClient implements Client {
+
+ @Override public void initialize() throws ClientException {
+
+ }
+
+ @Override public void insert(String path) throws ClientException {
+
+ }
+
+ @Override public void update() {
+
+ }
+
+ @Override public String select(String path) throws ClientException {
+ return null;
+ }
+
+ @Override public void delete() {
+
+ }
+
+ @Override public boolean exist(String path) throws ClientException {
+ return false;
+ }
+
+ @Override public void listen(String path) throws ClientException {
+
+ }
+}
diff --git a/apm-collector/apm-collector-client/client-zookeeper/pom.xml b/apm-collector/apm-collector-client/client-zookeeper/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..50a4f61f1d0a52067e8feb8782be642bf58822a1
--- /dev/null
+++ b/apm-collector/apm-collector-client/client-zookeeper/pom.xml
@@ -0,0 +1,36 @@
+
+
+
+ apm-collector-client
+ org.skywalking
+ 3.2-2017
+
+ 4.0.0
+
+ client-zookeeper
+ jar
+
+
+
+ org.apache.zookeeper
+ zookeeper
+ 3.4.10
+
+
+ slf4j-api
+ org.slf4j
+
+
+ log4j
+ log4j
+
+
+ slf4j-log4j12
+ org.slf4j
+
+
+
+
+
\ No newline at end of file
diff --git a/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperClient.java b/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..52798b26710f7332a6ff354b3d05111ab45deb2a
--- /dev/null
+++ b/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperClient.java
@@ -0,0 +1,78 @@
+package org.skywalking.apm.collector.client.zookeeper;
+
+import java.io.IOException;
+import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.ZooDefs;
+import org.apache.zookeeper.ZooKeeper;
+import org.apache.zookeeper.data.Stat;
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.util.ObjectUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author pengys5
+ */
+public class ZookeeperClient implements Client {
+
+ private final Logger logger = LoggerFactory.getLogger(ZookeeperClient.class);
+
+ private ZooKeeper zk;
+
+ @Override public void initialize() throws ZookeeperClientException {
+ try {
+ zk = new ZooKeeper(ZookeeperConfig.hostPort, ZookeeperConfig.sessionTimeout, new ZookeeperDataListener(this));
+ } catch (IOException e) {
+ throw new ZookeeperClientException(e.getMessage(), e);
+ }
+ }
+
+ @Override public void insert(String path) throws ZookeeperClientException {
+ logger.info("add the zookeeper path \"{}\"", path);
+ try {
+ zk.create(path, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
+ } catch (KeeperException | InterruptedException e) {
+ throw new ZookeeperClientException(e.getMessage(), e);
+ }
+ }
+
+ @Override public void update() {
+
+ }
+
+ @Override public String select(String path) throws ZookeeperClientException {
+ logger.info("get the zookeeper data from path \"{}\"", path);
+ try {
+ return zk.getData(path, false, null).toString();
+ } catch (KeeperException | InterruptedException e) {
+ throw new ZookeeperClientException(e.getMessage(), e);
+ }
+ }
+
+ @Override public void delete() {
+
+ }
+
+ @Override public boolean exist(String path) throws ZookeeperClientException {
+ logger.info("assess the zookeeper path \"{}\" exist", path);
+ try {
+ Stat stat = zk.exists(path, false);
+ if (ObjectUtils.isEmpty(stat)) {
+ return false;
+ } else {
+ return true;
+ }
+ } catch (KeeperException | InterruptedException e) {
+ throw new ZookeeperClientException(e.getMessage(), e);
+ }
+ }
+
+ @Override public void listen(String path) throws ZookeeperClientException {
+ try {
+ zk.exists(path, true);
+ } catch (KeeperException | InterruptedException e) {
+ throw new ZookeeperClientException(e.getMessage(), e);
+ }
+ }
+}
diff --git a/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperClientException.java b/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperClientException.java
new file mode 100644
index 0000000000000000000000000000000000000000..d6772e66a9534f572a9a7357c7c5f33ad9da905c
--- /dev/null
+++ b/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperClientException.java
@@ -0,0 +1,16 @@
+package org.skywalking.apm.collector.client.zookeeper;
+
+import org.skywalking.apm.collector.core.client.ClientException;
+
+/**
+ * @author pengys5
+ */
+public class ZookeeperClientException extends ClientException {
+ public ZookeeperClientException(String message) {
+ super(message);
+ }
+
+ public ZookeeperClientException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperConfig.java b/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..11b27d0325b00dcf128ae7094ab5751fa11a2514
--- /dev/null
+++ b/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperConfig.java
@@ -0,0 +1,9 @@
+package org.skywalking.apm.collector.client.zookeeper;
+
+/**
+ * @author pengys5
+ */
+public class ZookeeperConfig {
+ public static String hostPort;
+ public static int sessionTimeout;
+}
diff --git a/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperDataListener.java b/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperDataListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b5e8f5dca1e11f8df2a4ba0a8de3d968517fca7
--- /dev/null
+++ b/apm-collector/apm-collector-client/client-zookeeper/src/main/java/org/skywalking/apm/collector/client/zookeeper/ZookeeperDataListener.java
@@ -0,0 +1,59 @@
+package org.skywalking.apm.collector.client.zookeeper;
+
+import java.util.LinkedList;
+import java.util.List;
+import org.apache.zookeeper.WatchedEvent;
+import org.apache.zookeeper.Watcher;
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.client.ClientException;
+import org.skywalking.apm.collector.core.client.DataListener;
+import org.skywalking.apm.collector.core.cluster.ClusterDataInitializer;
+import org.skywalking.apm.collector.core.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author pengys5
+ */
+public class ZookeeperDataListener implements DataListener, Watcher {
+
+ private final Logger logger = LoggerFactory.getLogger(ZookeeperDataListener.class);
+
+ private Client client;
+
+ public ZookeeperDataListener(Client client) {
+ this.client = client;
+ }
+
+ @Override public void process(WatchedEvent event) {
+ logger.debug("path {}", event.getPath());
+ if (StringUtils.isEmpty(event.getPath())) {
+ return;
+ }
+
+ try {
+ String data = client.select(event.getPath());
+ logger.debug("data {}", data);
+ } catch (ClientException e) {
+ logger.error(e.getMessage(), e);
+ }
+ }
+
+ @Override public void listen() throws ClientException {
+ for (String itemKey : items()) {
+ String[] catalogs = itemKey.split("\\.");
+ StringBuilder pathBuilder = new StringBuilder();
+ for (String catalog : catalogs) {
+ pathBuilder.append("/").append(catalog);
+ }
+ client.listen(pathBuilder.toString());
+ }
+ }
+
+ @Override public List items() {
+ List items = new LinkedList<>();
+ items.add(ClusterDataInitializer.FOR_AGENT_CATALOG);
+ items.add(ClusterDataInitializer.FOR_UI_CATALOG);
+ return items;
+ }
+}
diff --git a/apm-collector/apm-collector-client/pom.xml b/apm-collector/apm-collector-client/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7942957cfc8a12c25309ebc33f4f71136268832e
--- /dev/null
+++ b/apm-collector/apm-collector-client/pom.xml
@@ -0,0 +1,27 @@
+
+
+
+ apm-collector
+ org.skywalking
+ 3.2-2017
+
+ 4.0.0
+
+ apm-collector-client
+ pom
+
+ client-zookeeper
+ client-redis
+ client-h2
+
+
+
+
+ org.skywalking
+ apm-collector-core
+ ${project.version}
+
+
+
\ No newline at end of file
diff --git a/apm-collector/apm-collector-commons/pom.xml b/apm-collector/apm-collector-cluster-new/cluster-redis/pom.xml
similarity index 78%
rename from apm-collector/apm-collector-commons/pom.xml
rename to apm-collector/apm-collector-cluster-new/cluster-redis/pom.xml
index a6cc374cc386b48841c4aad3f725ea9da2d0d2ca..0759fcf058a5d846899b12f3a9b7aa98311d4989 100644
--- a/apm-collector/apm-collector-commons/pom.xml
+++ b/apm-collector/apm-collector-cluster-new/cluster-redis/pom.xml
@@ -3,20 +3,20 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- apm-collector
+ apm-collector-cluster-new
org.skywalking
3.2-2017
4.0.0
- apm-collector-commons
+ cluster-redis
jar
org.skywalking
- apm-collector-cluster
+ client-redis
${project.version}
-
+
\ No newline at end of file
diff --git a/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisConfigParser.java b/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisConfigParser.java
new file mode 100644
index 0000000000000000000000000000000000000000..4009ed918a3733a9398795d2d62030b6891f2cc9
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisConfigParser.java
@@ -0,0 +1,15 @@
+package org.skywalking.apm.collector.cluster.redis;
+
+import java.util.Map;
+import org.skywalking.apm.collector.core.config.ConfigParseException;
+import org.skywalking.apm.collector.core.module.ModuleConfigParser;
+
+/**
+ * @author pengys5
+ */
+public class ClusterRedisConfigParser implements ModuleConfigParser {
+
+ @Override public void parse(Map config) throws ConfigParseException {
+
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisDataInitializer.java b/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisDataInitializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..55e1280d323504b50ad2120842f5d4ef48a803c3
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisDataInitializer.java
@@ -0,0 +1,18 @@
+package org.skywalking.apm.collector.cluster.redis;
+
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.client.ClientException;
+import org.skywalking.apm.collector.core.cluster.ClusterDataInitializer;
+
+/**
+ * @author pengys5
+ */
+public class ClusterRedisDataInitializer extends ClusterDataInitializer {
+ @Override public void addItem(Client client, String itemKey) throws ClientException {
+
+ }
+
+ @Override public boolean existItem(Client client, String itemKey) throws ClientException {
+ return false;
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisModuleDefine.java b/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisModuleDefine.java
new file mode 100644
index 0000000000000000000000000000000000000000..4947649a1057e058dea29936bfb27e1a107aa18f
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisModuleDefine.java
@@ -0,0 +1,43 @@
+package org.skywalking.apm.collector.cluster.redis;
+
+import org.skywalking.apm.collector.client.redis.RedisClient;
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.cluster.ClusterModuleDefine;
+import org.skywalking.apm.collector.core.cluster.ClusterModuleRegistrationWriter;
+import org.skywalking.apm.collector.core.framework.DataInitializer;
+import org.skywalking.apm.collector.core.module.ModuleConfigParser;
+import org.skywalking.apm.collector.core.module.ModuleGroup;
+
+/**
+ * @author pengys5
+ */
+public class ClusterRedisModuleDefine extends ClusterModuleDefine {
+
+ @Override public ModuleGroup group() {
+ return ModuleGroup.Cluster;
+ }
+
+ @Override public String name() {
+ return "redis";
+ }
+
+ @Override public boolean defaultModule() {
+ return false;
+ }
+
+ @Override protected ModuleConfigParser configParser() {
+ return new ClusterRedisConfigParser();
+ }
+
+ @Override protected Client client() {
+ return new RedisClient();
+ }
+
+ @Override protected DataInitializer dataInitializer() {
+ return new ClusterRedisDataInitializer();
+ }
+
+ @Override protected ClusterModuleRegistrationWriter registrationWriter() {
+ return new ClusterRedisModuleRegistrationWriter();
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisModuleRegistrationWriter.java b/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisModuleRegistrationWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..bae3b505b0b9b9427db20f39129721da1c452145
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/java/org/skywalking/apm/collector/cluster/redis/ClusterRedisModuleRegistrationWriter.java
@@ -0,0 +1,13 @@
+package org.skywalking.apm.collector.cluster.redis;
+
+import org.skywalking.apm.collector.core.cluster.ClusterModuleRegistrationWriter;
+
+/**
+ * @author pengys5
+ */
+public class ClusterRedisModuleRegistrationWriter implements ClusterModuleRegistrationWriter {
+
+ @Override public void write(String key, String value) {
+
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/resources/META-INF/defines/module.define b/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/resources/META-INF/defines/module.define
new file mode 100644
index 0000000000000000000000000000000000000000..108425a44deaaad0cf61ee7ca2e821e34795d29e
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-redis/src/main/resources/META-INF/defines/module.define
@@ -0,0 +1 @@
+org.skywalking.apm.collector.cluster.redis.ClusterRedisModuleDefine
\ No newline at end of file
diff --git a/apm-collector/apm-collector-cluster-new/cluster-standalone/pom.xml b/apm-collector/apm-collector-cluster-new/cluster-standalone/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f7e08fdee94bb0fd148b659e2929cdc0fecc32bf
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-standalone/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ apm-collector-cluster-new
+ org.skywalking
+ 3.2-2017
+
+ 4.0.0
+
+ cluster-standalone
+ jar
+
+
+
+ org.skywalking
+ client-h2
+ ${project.version}
+
+
+
\ No newline at end of file
diff --git a/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneConfigParser.java b/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneConfigParser.java
new file mode 100644
index 0000000000000000000000000000000000000000..d12844f29f61f85eae773787fbed1a77676c9537
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneConfigParser.java
@@ -0,0 +1,14 @@
+package org.skywalking.apm.collector.cluster.standalone;
+
+import java.util.Map;
+import org.skywalking.apm.collector.core.config.ConfigParseException;
+import org.skywalking.apm.collector.core.module.ModuleConfigParser;
+
+/**
+ * @author pengys5
+ */
+public class ClusterStandaloneConfigParser implements ModuleConfigParser {
+ @Override public void parse(Map config) throws ConfigParseException {
+
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneDataInitializer.java b/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneDataInitializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..85f8bb21d787efc3287fd63a5ba68749ce52a179
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneDataInitializer.java
@@ -0,0 +1,19 @@
+package org.skywalking.apm.collector.cluster.standalone;
+
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.client.ClientException;
+import org.skywalking.apm.collector.core.cluster.ClusterDataInitializer;
+
+/**
+ * @author pengys5
+ */
+public class ClusterStandaloneDataInitializer extends ClusterDataInitializer {
+
+ @Override public void addItem(Client client, String itemKey) throws ClientException {
+
+ }
+
+ @Override public boolean existItem(Client client, String itemKey) throws ClientException {
+ return false;
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneModuleDefine.java b/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneModuleDefine.java
new file mode 100644
index 0000000000000000000000000000000000000000..cfcb129f4a9101aea52c8d9d7c5add9c1dcf0871
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneModuleDefine.java
@@ -0,0 +1,43 @@
+package org.skywalking.apm.collector.cluster.standalone;
+
+import org.skywalking.apm.collector.client.h2.H2Client;
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.cluster.ClusterModuleDefine;
+import org.skywalking.apm.collector.core.cluster.ClusterModuleRegistrationWriter;
+import org.skywalking.apm.collector.core.framework.DataInitializer;
+import org.skywalking.apm.collector.core.module.ModuleConfigParser;
+import org.skywalking.apm.collector.core.module.ModuleGroup;
+
+/**
+ * @author pengys5
+ */
+public class ClusterStandaloneModuleDefine extends ClusterModuleDefine {
+
+ @Override public ModuleGroup group() {
+ return ModuleGroup.Cluster;
+ }
+
+ @Override public String name() {
+ return "standalone";
+ }
+
+ @Override public boolean defaultModule() {
+ return true;
+ }
+
+ @Override protected ModuleConfigParser configParser() {
+ return new ClusterStandaloneConfigParser();
+ }
+
+ @Override protected Client client() {
+ return new H2Client();
+ }
+
+ @Override protected DataInitializer dataInitializer() {
+ return new ClusterStandaloneDataInitializer();
+ }
+
+ @Override protected ClusterModuleRegistrationWriter registrationWriter() {
+ return new ClusterStandaloneModuleRegistrationWriter();
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneModuleRegistrationWriter.java b/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneModuleRegistrationWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e535ddb5314dc769084528f37981d6758970dca
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/java/org/skywalking/apm/collector/cluster/standalone/ClusterStandaloneModuleRegistrationWriter.java
@@ -0,0 +1,13 @@
+package org.skywalking.apm.collector.cluster.standalone;
+
+import org.skywalking.apm.collector.core.cluster.ClusterModuleRegistrationWriter;
+
+/**
+ * @author pengys5
+ */
+public class ClusterStandaloneModuleRegistrationWriter implements ClusterModuleRegistrationWriter {
+
+ @Override public void write(String key, String value) {
+
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/resources/META-INF/defines/module.define b/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/resources/META-INF/defines/module.define
new file mode 100644
index 0000000000000000000000000000000000000000..6cf83ed9b55edeb1169331cc66873d6e0a5b36dd
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-standalone/src/main/resources/META-INF/defines/module.define
@@ -0,0 +1 @@
+org.skywalking.apm.collector.cluster.standalone.ClusterStandaloneModuleDefine
\ No newline at end of file
diff --git a/apm-collector/apm-collector-cluster-new/cluster-zookeeper/pom.xml b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..342d5ccf30ec0e40b43936b09a1945dc88884931
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ apm-collector-cluster-new
+ org.skywalking
+ 3.2-2017
+
+ 4.0.0
+
+ cluster-zookeeper
+ jar
+
+
+
+ org.skywalking
+ client-zookeeper
+ ${project.version}
+
+
+
\ No newline at end of file
diff --git a/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKConfigParser.java b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKConfigParser.java
new file mode 100644
index 0000000000000000000000000000000000000000..dfbf1c63f19b8bc6938107d20c7974d35023dcba
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKConfigParser.java
@@ -0,0 +1,29 @@
+package org.skywalking.apm.collector.cluster.zookeeper;
+
+import java.util.Map;
+import org.skywalking.apm.collector.client.zookeeper.ZookeeperConfig;
+import org.skywalking.apm.collector.core.config.ConfigParseException;
+import org.skywalking.apm.collector.core.module.ModuleConfigParser;
+import org.skywalking.apm.collector.core.util.StringUtils;
+
+/**
+ * @author pengys5
+ */
+public class ClusterZKConfigParser implements ModuleConfigParser {
+
+ private final String HOST_PORT = "hostPort";
+ private final String SESSION_TIMEOUT = "sessionTimeout";
+
+ @Override public void parse(Map config) throws ConfigParseException {
+ if (StringUtils.isEmpty(config.get(HOST_PORT))) {
+ throw new ConfigParseException("");
+ }
+ ZookeeperConfig.hostPort = (String)config.get(HOST_PORT);
+
+ if (StringUtils.isEmpty(config.get(SESSION_TIMEOUT))) {
+ ZookeeperConfig.sessionTimeout = 1000;
+ } else {
+ ZookeeperConfig.sessionTimeout = (Integer)config.get(SESSION_TIMEOUT);
+ }
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKDataInitializer.java b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKDataInitializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..4860c5c0325538e03dd93874a3462cc02b368dd6
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKDataInitializer.java
@@ -0,0 +1,37 @@
+package org.skywalking.apm.collector.cluster.zookeeper;
+
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.client.ClientException;
+import org.skywalking.apm.collector.core.cluster.ClusterDataInitializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author pengys5
+ */
+public class ClusterZKDataInitializer extends ClusterDataInitializer {
+
+ private final Logger logger = LoggerFactory.getLogger(ClusterZKDataInitializer.class);
+
+ @Override public void addItem(Client client, String itemKey) throws ClientException {
+ logger.info("add the zookeeper item key \"{}\" exist", itemKey);
+ String[] catalogs = itemKey.split("\\.");
+ StringBuilder pathBuilder = new StringBuilder();
+ for (String catalog : catalogs) {
+ pathBuilder.append("/").append(catalog);
+ if (!client.exist(pathBuilder.toString())) {
+ client.insert(pathBuilder.toString());
+ }
+ }
+ }
+
+ @Override public boolean existItem(Client client, String itemKey) throws ClientException {
+ logger.info("assess the zookeeper item key \"{}\" exist", itemKey);
+ String[] catalogs = itemKey.split("\\.");
+ StringBuilder pathBuilder = new StringBuilder();
+ for (String catalog : catalogs) {
+ pathBuilder.append("/").append(catalog);
+ }
+ return client.exist(pathBuilder.toString());
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleDefine.java b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleDefine.java
new file mode 100644
index 0000000000000000000000000000000000000000..0485bb10f0fa09a6709cf688cbcdbf056c455bd6
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleDefine.java
@@ -0,0 +1,43 @@
+package org.skywalking.apm.collector.cluster.zookeeper;
+
+import org.skywalking.apm.collector.client.zookeeper.ZookeeperClient;
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.cluster.ClusterDataInitializer;
+import org.skywalking.apm.collector.core.cluster.ClusterModuleDefine;
+import org.skywalking.apm.collector.core.cluster.ClusterModuleRegistrationWriter;
+import org.skywalking.apm.collector.core.module.ModuleConfigParser;
+import org.skywalking.apm.collector.core.module.ModuleGroup;
+
+/**
+ * @author pengys5
+ */
+public class ClusterZKModuleDefine extends ClusterModuleDefine {
+
+ @Override public ModuleGroup group() {
+ return ModuleGroup.Cluster;
+ }
+
+ @Override public String name() {
+ return "zookeeper";
+ }
+
+ @Override public boolean defaultModule() {
+ return false;
+ }
+
+ @Override public ModuleConfigParser configParser() {
+ return new ClusterZKConfigParser();
+ }
+
+ @Override public Client client() {
+ return new ZookeeperClient();
+ }
+
+ @Override public ClusterDataInitializer dataInitializer() {
+ return new ClusterZKDataInitializer();
+ }
+
+ @Override protected ClusterModuleRegistrationWriter registrationWriter() {
+ return new ClusterZKModuleRegistrationWriter();
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleRegistrationReader.java b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleRegistrationReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..44dec48611a14b62f2fd703855776adc1c482248
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleRegistrationReader.java
@@ -0,0 +1,13 @@
+package org.skywalking.apm.collector.cluster.zookeeper;
+
+import java.util.List;
+import org.skywalking.apm.collector.core.cluster.ClusterModuleRegistrationReader;
+
+/**
+ * @author pengys5
+ */
+public class ClusterZKModuleRegistrationReader implements ClusterModuleRegistrationReader {
+ @Override public List read(String key) {
+ return null;
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleRegistrationWriter.java b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleRegistrationWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..8ca0b0cb857729abc02824db0452bf2d71f1fbd3
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleRegistrationWriter.java
@@ -0,0 +1,13 @@
+package org.skywalking.apm.collector.cluster.zookeeper;
+
+import org.skywalking.apm.collector.core.cluster.ClusterModuleRegistrationWriter;
+
+/**
+ * @author pengys5
+ */
+public class ClusterZKModuleRegistrationWriter implements ClusterModuleRegistrationWriter {
+
+ @Override public void write(String key, String value) {
+
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/resources/META-INF/defines/module.define b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/resources/META-INF/defines/module.define
new file mode 100644
index 0000000000000000000000000000000000000000..54bd972ef54e57a4d86666998b1672041255a372
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/main/resources/META-INF/defines/module.define
@@ -0,0 +1 @@
+org.skywalking.apm.collector.cluster.zookeeper.ClusterZKModuleDefine
\ No newline at end of file
diff --git a/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/test/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleDefineTestCase.java b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/test/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleDefineTestCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e7d92da116759391b08315fba6aae4456c48a96
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/test/java/org/skywalking/apm/collector/cluster/zookeeper/ClusterZKModuleDefineTestCase.java
@@ -0,0 +1,32 @@
+package org.skywalking.apm.collector.cluster.zookeeper;
+
+import java.io.FileNotFoundException;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Test;
+import org.skywalking.apm.collector.client.zookeeper.ZookeeperConfig;
+import org.skywalking.apm.collector.core.cluster.ClusterModuleException;
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * @author pengys5
+ */
+public class ClusterZKModuleDefineTestCase {
+
+ private Map config;
+
+ @Before
+ public void before() throws FileNotFoundException {
+ Yaml yaml = new Yaml();
+ config = (Map)yaml.load("hostPort: localhost:2181" + System.lineSeparator() + "sessionTimeout: 2000");
+ }
+
+ @Test
+ public void testInitialize() throws ClusterModuleException {
+ ClusterZKModuleDefine define = new ClusterZKModuleDefine();
+ define.initialize(config);
+
+ System.out.println(ZookeeperConfig.hostPort);
+ System.out.println(ZookeeperConfig.sessionTimeout);
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/test/java/org/skywalking/apm/collector/cluster/zookeeper/ZookeeperTestCase.java b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/test/java/org/skywalking/apm/collector/cluster/zookeeper/ZookeeperTestCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc5fb00e5bc15781377006fc0dc34898844c5f75
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/test/java/org/skywalking/apm/collector/cluster/zookeeper/ZookeeperTestCase.java
@@ -0,0 +1,55 @@
+package org.skywalking.apm.collector.cluster.zookeeper;
+
+import java.io.IOException;
+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.junit.Test;
+
+/**
+ * @author pengys5
+ */
+public class ZookeeperTestCase {
+
+ @Test
+ public void test() throws IOException, KeeperException, InterruptedException {
+ String hostPort = "localhost:2181";
+ String znode = "/collector/module";
+ String filename = "";
+ String exec[] = new String[5 - 3];
+// new ZookeeperExecutor(hostPort, znode, filename, exec).run();
+
+ ZooKeeper zk = new ZooKeeper(hostPort, 1000, new Watcher() {
+ @Override public void process(WatchedEvent event) {
+ String path = event.getPath();
+ System.out.println("已经触发了" + event.getType() + "事件!");
+ System.out.println("path: " + path);
+ }
+ });
+
+ zk.create("/testRootPath", "testRootData".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
+ CreateMode.PERSISTENT);
+// 创建一个子目录节点
+ zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(),
+ ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
+ System.out.println(new String(zk.getData("/testRootPath",false,null)));
+ // 取出子目录节点列表
+ System.out.println(zk.getChildren("/testRootPath",true));
+ // 修改子目录节点数据
+ zk.setData("/testRootPath/testChildPathOne","modifyChildDataOne".getBytes(),-1);
+ System.out.println("目录节点状态:["+zk.exists("/testRootPath",true)+"]");
+ // 创建另外一个子目录节点
+ zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(),
+ ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
+// System.out.println(new String(zk.getData("/testRootPath/testChildPathTwo",true,null)));
+ // 删除子目录节点
+ zk.delete("/testRootPath/testChildPathTwo",-1);
+ zk.delete("/testRootPath/testChildPathOne",-1);
+ // 删除父目录节点
+ zk.delete("/testRootPath",-1);
+ zk.close();
+ }
+}
diff --git a/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/test/resources/application.yml b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/test/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5608ba0c6d0b1e3d130687c8ef72c91ccc89e3f9
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/cluster-zookeeper/src/test/resources/application.yml
@@ -0,0 +1,3 @@
+ hostPort: localhost-zk
+ sessionTimeout: 2000
+
diff --git a/apm-collector/apm-collector-cluster-new/pom.xml b/apm-collector/apm-collector-cluster-new/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e08b3e70c539d5d533327b7cf252aaa7df23dfe9
--- /dev/null
+++ b/apm-collector/apm-collector-cluster-new/pom.xml
@@ -0,0 +1,27 @@
+
+
+
+ apm-collector
+ org.skywalking
+ 3.2-2017
+
+ 4.0.0
+
+ apm-collector-cluster-new
+ pom
+
+ cluster-zookeeper
+ cluster-redis
+ cluster-standalone
+
+
+
+
+ org.skywalking
+ apm-collector-core
+ ${project.version}
+
+
+
\ No newline at end of file
diff --git a/apm-collector/apm-collector-commons/src/main/java/org/skywalking/apm/collector/commons/config/SeedNodesFormatter.java b/apm-collector/apm-collector-commons/src/main/java/org/skywalking/apm/collector/commons/config/SeedNodesFormatter.java
deleted file mode 100644
index 93b27edeb9f9cbd25ffcb9906f47102cef6e9847..0000000000000000000000000000000000000000
--- a/apm-collector/apm-collector-commons/src/main/java/org/skywalking/apm/collector/commons/config/SeedNodesFormatter.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.skywalking.apm.collector.commons.config;
-
-/**
- * @author pengys5
- */
-public enum SeedNodesFormatter {
- INSTANCE;
-
- public String formatter(String seedNodes) {
- return null;
- }
-}
diff --git a/apm-collector/apm-collector-commons/src/main/java/org/skywalking/apm/collector/commons/role/TraceSegmentReceiverRole.java b/apm-collector/apm-collector-commons/src/main/java/org/skywalking/apm/collector/commons/role/TraceSegmentReceiverRole.java
deleted file mode 100644
index a21b71cde5adcbfc8bc957749fb89c5e73657c1a..0000000000000000000000000000000000000000
--- a/apm-collector/apm-collector-commons/src/main/java/org/skywalking/apm/collector/commons/role/TraceSegmentReceiverRole.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.skywalking.apm.collector.commons.role;
-
-import org.skywalking.apm.collector.actor.Role;
-import org.skywalking.apm.collector.actor.selector.RollingSelector;
-import org.skywalking.apm.collector.actor.selector.WorkerSelector;
-
-/**
- * @author pengys5
- */
-public enum TraceSegmentReceiverRole implements Role {
- INSTANCE;
-
- @Override
- public String roleName() {
- return "TraceSegmentReceiver";
- }
-
- @Override
- public WorkerSelector workerSelector() {
- return new RollingSelector();
- }
-}
diff --git a/apm-collector/apm-collector-commons/src/main/resources/application.conf b/apm-collector/apm-collector-commons/src/main/resources/application.conf
deleted file mode 100644
index c37784cd82b0efca07f527422bc08ba145ff87c3..0000000000000000000000000000000000000000
--- a/apm-collector/apm-collector-commons/src/main/resources/application.conf
+++ /dev/null
@@ -1,34 +0,0 @@
-akka {
- actor {
- provider = "akka.cluster.ClusterActorRefProvider"
-
- serializers {
- java = "akka.serialization.JavaSerializer"
- proto = "akka.remote.serialization.ProtobufSerializer"
-// TraceSegment = "org.skywalking.apm.collector.worker.TraceSegmentSerializer"
-// json = "org.skywalking.apm.collector.commons.serializer.JsonSerializer"
- }
-
- serialization-bindings {
- "java.lang.String" = java
- "com.google.protobuf.Message" = proto
-// "TraceSegment" = TraceSegment
-// "com.google.gson.JsonObject" = json
- }
-
- warn-about-java-serializer-usage = on
- }
-
- remote {
- log-remote-lifecycle-events = off
-
- netty.tcp {
- }
- }
-
- cluster {
- auto-down-unreachable-after = off
- metrics.enabled = off
- roles = ["WorkersListener"]
- }
-}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleContext.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..0aa78b4f389e0774d830cee174edbdff5e78a564
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleContext.java
@@ -0,0 +1,16 @@
+package org.skywalking.apm.collector.core.cluster;
+
+/**
+ * @author pengys5
+ */
+public class ClusterModuleContext {
+ private ClusterModuleRegistrationWriter writer;
+
+ public ClusterModuleRegistrationWriter getWriter() {
+ return writer;
+ }
+
+ public void setWriter(ClusterModuleRegistrationWriter writer) {
+ this.writer = writer;
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleDefine.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleDefine.java
index 2ac18f2f2923c010255f1c7968ab6370aea32577..f09dff349d136d213c585786ea6530e4e0bf4f84 100644
--- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleDefine.java
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleDefine.java
@@ -5,6 +5,7 @@ import org.skywalking.apm.collector.core.client.Client;
import org.skywalking.apm.collector.core.client.ClientException;
import org.skywalking.apm.collector.core.config.ConfigParseException;
import org.skywalking.apm.collector.core.module.ModuleDefine;
+import org.skywalking.apm.collector.core.module.ModuleRegistration;
import org.skywalking.apm.collector.core.server.Server;
/**
@@ -26,4 +27,10 @@ public abstract class ClusterModuleDefine extends ModuleDefine {
@Override public final Server server() {
throw new UnsupportedOperationException("");
}
+
+ @Override protected final ModuleRegistration registration() {
+ throw new UnsupportedOperationException("Cluster module do not need module registration.");
+ }
+
+ protected abstract ClusterModuleRegistrationWriter registrationWriter();
}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Discovery.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleDiscovery.java
similarity index 71%
rename from apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Discovery.java
rename to apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleDiscovery.java
index 0957d512545a813fadb76a7162484f4a730d5d38..bddfaf2216713f7a9c45be18b2a87e349444ba57 100644
--- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Discovery.java
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleDiscovery.java
@@ -3,7 +3,7 @@ package org.skywalking.apm.collector.core.cluster;
/**
* @author pengys5
*/
-public interface Discovery {
+public interface ClusterModuleDiscovery {
void discover();
}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleInstaller.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleInstaller.java
new file mode 100644
index 0000000000000000000000000000000000000000..fd56eed9eac4c72cdd2b272404f6bc7e739b10da
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleInstaller.java
@@ -0,0 +1,38 @@
+package org.skywalking.apm.collector.core.cluster;
+
+import java.util.Iterator;
+import java.util.Map;
+import org.skywalking.apm.collector.core.framework.DefineException;
+import org.skywalking.apm.collector.core.module.ModuleDefine;
+import org.skywalking.apm.collector.core.module.ModuleInstaller;
+import org.skywalking.apm.collector.core.util.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author pengys5
+ */
+public class ClusterModuleInstaller implements ModuleInstaller {
+
+ private final Logger logger = LoggerFactory.getLogger(ClusterModuleInstaller.class);
+
+ @Override public void install(Map moduleConfig,
+ Map moduleDefineMap) throws DefineException {
+ logger.info("beginning cluster module install");
+ if (CollectionUtils.isEmpty(moduleConfig)) {
+ logger.info("could not configure cluster module, use the default");
+ Iterator> moduleDefineEntry = moduleDefineMap.entrySet().iterator();
+ while (moduleDefineEntry.hasNext()) {
+ ModuleDefine moduleDefine = moduleDefineEntry.next().getValue();
+ if (moduleDefine.defaultModule()) {
+ logger.info("module {} initialize", moduleDefine.getClass().getName());
+ moduleDefine.initialize(null);
+ }
+ }
+ } else {
+ Map.Entry clusterConfigEntry = moduleConfig.entrySet().iterator().next();
+ ModuleDefine moduleDefine = moduleDefineMap.get(clusterConfigEntry.getKey());
+ moduleDefine.initialize(clusterConfigEntry.getValue());
+ }
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleRegistrationReader.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleRegistrationReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..d9ad04e02ab72def6bc073479a2e599ce4104d8c
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleRegistrationReader.java
@@ -0,0 +1,10 @@
+package org.skywalking.apm.collector.core.cluster;
+
+import java.util.List;
+
+/**
+ * @author pengys5
+ */
+public interface ClusterModuleRegistrationReader {
+ List read(String key);
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleRegistrationWriter.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleRegistrationWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..449a904d54a62beb6f85fcc346c6fdb9a54ae1f4
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleRegistrationWriter.java
@@ -0,0 +1,8 @@
+package org.skywalking.apm.collector.core.cluster;
+
+/**
+ * @author pengys5
+ */
+public interface ClusterModuleRegistrationWriter {
+ void write(String key, String value);
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Registration.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Registration.java
deleted file mode 100644
index c37bb83bb20639a85905f969f36b137cda06af53..0000000000000000000000000000000000000000
--- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Registration.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.skywalking.apm.collector.core.cluster;
-
-/**
- * @author pengys5
- */
-public interface Registration {
-
- void register();
-}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoader.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoader.java
index 06e1cff84b3678d8b70132921c4431107e93a65e..b4fd431cfada267e8473b445e4b1d107b5f4e45a 100644
--- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoader.java
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoader.java
@@ -5,5 +5,5 @@ import org.skywalking.apm.collector.core.framework.Loader;
/**
* @author pengys5
*/
-public interface ConfigLoader extends Loader {
+public interface ConfigLoader extends Loader {
}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/CollectorStarter.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/CollectorStarter.java
new file mode 100644
index 0000000000000000000000000000000000000000..054e812ee48e80fea7008f1aa3fbdb24f1012628
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/CollectorStarter.java
@@ -0,0 +1,39 @@
+package org.skywalking.apm.collector.core.framework;
+
+import java.util.Map;
+import org.skywalking.apm.collector.core.config.ConfigException;
+import org.skywalking.apm.collector.core.module.ModuleConfigLoader;
+import org.skywalking.apm.collector.core.module.ModuleDefine;
+import org.skywalking.apm.collector.core.module.ModuleDefineLoader;
+import org.skywalking.apm.collector.core.module.ModuleGroup;
+import org.skywalking.apm.collector.core.module.ModuleInstallerAdapter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author pengys5
+ */
+public class CollectorStarter implements Starter {
+
+ private final Logger logger = LoggerFactory.getLogger(CollectorStarter.class);
+
+ @Override public void start() throws ConfigException, DefineException {
+ ModuleConfigLoader configLoader = new ModuleConfigLoader();
+ Map configuration = configLoader.load();
+
+ ModuleDefineLoader defineLoader = new ModuleDefineLoader();
+ Map> moduleDefineMap = defineLoader.load();
+
+ ModuleInstallerAdapter moduleInstallerAdapter = new ModuleInstallerAdapter(ModuleGroup.Cluster);
+ moduleInstallerAdapter.install(configuration.get(ModuleGroup.Cluster.name().toLowerCase()), moduleDefineMap.get(ModuleGroup.Cluster.name().toLowerCase()));
+
+ ModuleGroup[] moduleGroups = ModuleGroup.values();
+ for (ModuleGroup moduleGroup : moduleGroups) {
+ if (!ModuleGroup.Cluster.equals(moduleGroup)) {
+ moduleInstallerAdapter = new ModuleInstallerAdapter(moduleGroup);
+ logger.info("module group {}, configuration {}", moduleGroup.name().toLowerCase(), configuration.get(moduleGroup.name().toLowerCase()));
+ moduleInstallerAdapter.install(configuration.get(moduleGroup.name().toLowerCase()), moduleDefineMap.get(moduleGroup.name().toLowerCase()));
+ }
+ }
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Context.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Context.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f9b7dffc3a6074700c1301753b29b6f86c5df85
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Context.java
@@ -0,0 +1,8 @@
+package org.skywalking.apm.collector.core.framework;
+
+/**
+ * @author pengys5
+ */
+public class Context {
+
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Define.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Define.java
index 591a383435a699b60051c7923fa90783505b6dd8..34ec6598d3e6e9acd8e590881749deb55d582922 100644
--- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Define.java
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Define.java
@@ -9,7 +9,5 @@ public interface Define {
void initialize(Map config) throws DefineException;
- String getName();
-
- void setName(String name);
+ String name();
}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Loader.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Loader.java
index 70957c8a415bc11a985e14b7f7167b332ff7cf6a..10c4be9343e92d5b625d3b1f8d979cbf47d788b9 100644
--- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Loader.java
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Loader.java
@@ -5,7 +5,6 @@ import org.skywalking.apm.collector.core.config.ConfigException;
/**
* @author pengys5
*/
-public interface Loader {
-
- void load() throws ConfigException;
+public interface Loader {
+ T load() throws ConfigException;
}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Starter.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Starter.java
index 8d7a4f8febefe55ceb92e56dec22732426ef2f52..dbf0a53ed985cd50506198f537d7218b6c077bb4 100644
--- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Starter.java
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Starter.java
@@ -1,8 +1,10 @@
package org.skywalking.apm.collector.core.framework;
+import org.skywalking.apm.collector.core.CollectorException;
+
/**
* @author pengys5
*/
public interface Starter {
- void start();
+ void start() throws CollectorException;
}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoader.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoader.java
index f3d882e53b3c8da799f202e41bb5241be0d11bbf..55c8a0e78f7734d9737eea8f18e8f553073d4441 100644
--- a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoader.java
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoader.java
@@ -11,28 +11,16 @@ import org.yaml.snakeyaml.Yaml;
/**
* @author pengys5
*/
-public class ModuleConfigLoader implements ConfigLoader {
+public class ModuleConfigLoader implements ConfigLoader