diff --git a/dubbo-registry-admin/pom.xml b/dubbo-registry-admin/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..23b21358d8be2b5578ddd5b6a97d4b0cee2a42d7 --- /dev/null +++ b/dubbo-registry-admin/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + com.alibaba + dubbo-parent + 2.0.9-SNAPSHOT + + dubbo-registry-admin + jar + Dubbo Registry Admin Module + The registry admin module of dubbo project + + true + + + + com.alibaba + dubbo-registry + ${project.parent.version} + + + com.alibaba + dubbo-container + ${project.parent.version} + + + \ No newline at end of file diff --git a/dubbo-registry-admin/src/assembly/assembly.xml b/dubbo-registry-admin/src/assembly/assembly.xml new file mode 100644 index 0000000000000000000000000000000000000000..9b2629fdef8c4327fa06896c68de84494cde6b39 --- /dev/null +++ b/dubbo-registry-admin/src/assembly/assembly.xml @@ -0,0 +1,19 @@ + + dist + + tar.gz + + true + + + src/main/assembly/bin + bin + 0755 + + + + + lib + + + \ No newline at end of file diff --git a/dubbo-registry-admin/src/assembly/bin/restart.sh b/dubbo-registry-admin/src/assembly/bin/restart.sh new file mode 100644 index 0000000000000000000000000000000000000000..647ec1951954d7340d804c5caf2b2e692839ba1e --- /dev/null +++ b/dubbo-registry-admin/src/assembly/bin/restart.sh @@ -0,0 +1,4 @@ +#!/bin/bash +cd `dirname $0` +./stop.sh +./start.sh diff --git a/dubbo-registry-admin/src/assembly/bin/start.sh b/dubbo-registry-admin/src/assembly/bin/start.sh new file mode 100644 index 0000000000000000000000000000000000000000..9dd460e0a377e50559c56237c89be0a194cf16d3 --- /dev/null +++ b/dubbo-registry-admin/src/assembly/bin/start.sh @@ -0,0 +1,65 @@ +#!/bin/bash +cd `dirname $0` +BIN_DIR=`pwd` +cd .. +DEPLOY_DIR=`pwd` + +LIB_DIR=$DEPLOY_DIR/lib +LOGS_DIR=$DEPLOY_DIR/logs +STDOUT_FILE=$LOGS_DIR/stdout.log +SERVER_PORT=$1 + +if [ ! -d $LOGS_DIR ]; then + mkdir $LOGS_DIR +fi + +if [ -z "$SERVER_PORT" ]; then + SERVER_PORT=8080 +fi + +SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l` +if [ $SERVER_PORT_COUNT -gt 0 ]; then + echo "********************************************************************" + echo "** Error: Dubbo registry admin server port $SERVER_PORT already used!" + echo "********************************************************************" + exit 1 +fi + +JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true " +JAVA_MEM_OPTS="" +BITS=`file $JAVA_HOME/bin/java | grep 64-bit` +if [ -n "$BITS" ]; then + let memTotal=`cat /proc/meminfo |grep MemTotal|awk '{printf "%d", $2/1024 }'` + if [ $memTotal -gt 2500 ];then + JAVA_MEM_OPTS=" -server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 " + else + JAVA_MEM_OPTS=" -server -Xmx1g -Xms1g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 " + fi +else + JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC " +fi + +EXIST_PIDS=`ps --no-heading -C java -f --width 1000 | grep "$DEPLOY_DIR" |awk '{print $2}'` +if [ ! -z "$EXIST_PIDS" ]; then + echo "Dubbo registry admin server already started!" + echo "PID: $EXIST_PIDS" + exit; +fi + +LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"` + +echo -e "Starting dubbo registry admin server on $SERVER_PORT \c" +nohup $JAVA_HOME/bin/java $JAVA_OPTS $JAVA_MEM_OPTS -classpath $LIB_JARS com.alibaba.dubbo.container.Main spring jetty log4j >> $STDOUT_FILE 2>&1 & + +COUNT=0 +while [ $COUNT -lt 1 ]; do + echo -e ".\c" + sleep 1 + COUNT=`curl -s "http://127.0.0.1:$SERVER_PORT/status" |grep -c "OK"` + if [ $COUNT -lt 1 ]; then + break + fi +done +echo "OK!" +START_PIDS=`ps --no-heading -C java -f --width 1000 | grep "$DEPLOY_DIR" |awk '{print $2}'` +echo "PID: $START_PIDS" diff --git a/dubbo-registry-admin/src/assembly/bin/stop.sh b/dubbo-registry-admin/src/assembly/bin/stop.sh new file mode 100644 index 0000000000000000000000000000000000000000..83db8e9389fca1ad6a7ba8cec14f0e94124dd79d --- /dev/null +++ b/dubbo-registry-admin/src/assembly/bin/stop.sh @@ -0,0 +1,33 @@ +#!/bin/bash +cd `dirname $0` +BIN_DIR=`pwd` +cd .. +DEPLOY_DIR=`pwd` + +KILL_PIDS=`ps --no-heading -C java -f --width 1000 | grep "$DEPLOY_DIR" |awk '{print $2}'` +if [ -z "$KILL_PIDS" ]; then + echo "Dubbo registry admin server does not started!" + exit 1; +fi + +echo -e "Stopping dubbo registry admin server \c" +for PID in $KILL_PIDS ; do + echo -e "$PID \c" + kill $PID > /dev/null 2>&1 +done + +COUNT=0 +while [ $COUNT -lt 1 ]; do + echo -e ".\c" + sleep 1 + COUNT=1 + for PID in $KILL_PIDS ; do + PID_PS=`ps --no-heading -p $PID` + if [ -n "$PID_PS" ]; then + COUNT=0 + break + fi + done +done +echo "OK!" +echo "PID: $KILL_PIDS" diff --git a/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/RegistryContainer.java b/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/RegistryContainer.java new file mode 100644 index 0000000000000000000000000000000000000000..bb1d205b58108da6659f3caafa66ccb65c14e053 --- /dev/null +++ b/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/RegistryContainer.java @@ -0,0 +1,151 @@ +/* + * Copyright 1999-2011 Alibaba Group. + * + * Licensed 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 com.alibaba.dubbo.registry.admin; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import com.alibaba.dubbo.common.Extension; +import com.alibaba.dubbo.common.ExtensionLoader; +import com.alibaba.dubbo.common.URL; +import com.alibaba.dubbo.common.logger.Logger; +import com.alibaba.dubbo.common.logger.LoggerFactory; +import com.alibaba.dubbo.common.utils.ConcurrentHashSet; +import com.alibaba.dubbo.container.Container; +import com.alibaba.dubbo.registry.Registry; +import com.alibaba.dubbo.registry.RegistryFactory; + +/** + * RegistryContainer + * + * @author william.liangf + */ +@Extension("registry") +public class RegistryContainer implements Container { + + private static final Logger logger = LoggerFactory.getLogger(RegistryContainer.class); + + public static final String REGISTRY_URL = "registry.url"; + + private final RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension(); + + private final Set services = new ConcurrentHashSet(); + + private final Map> providers = new ConcurrentHashMap>(); + + private final Map> routes = new ConcurrentHashMap>(); + + private Registry registry; + + private static RegistryContainer INSTANCE = null; + + public RegistryContainer() { + INSTANCE = this; + } + + public static RegistryContainer getInstance() { + return INSTANCE; + } + + public Registry getRegistry() { + return registry; + } + + public Set getServices() { + return Collections.unmodifiableSet(services); + } + + public Map> getProviders() { + return Collections.unmodifiableMap(providers); + } + + public Map> getRoutes() { + return Collections.unmodifiableMap(routes); + } + + public List getProviders(String service) { + List urls = providers.get(service); + return urls == null ? null : Collections.unmodifiableList(urls); + } + + public List getRoutes(String service) { + List urls = routes.get(service); + return urls == null ? null : Collections.unmodifiableList(urls); + } + + public void start() { + /*String url = System.getProperty(REGISTRY_URL); + if (url == null || url.length() == 0) { + throw new IllegalArgumentException("Please set java start argument: -D" + REGISTRY_URL + "=zookeeper://127.0.0.1:2181"); + } + URL registryUrl = URL.valueOf(url); + registry = registryFactory.getRegistry(registryUrl); + URL subscribeUrl = new URL(Constants.SUBSCRIBE_PROTOCOL, NetUtils.getLocalHost(), 0) + .addParameters(Constants.INTERFACE_KEY, Constants.ANY_VALUE, + Constants.GROUP_KEY, Constants.ANY_VALUE, + Constants.VERSION_KEY, Constants.ANY_VALUE); + registry.subscribe(subscribeUrl, new NotifyListener() { + public void notify(List urls) { + if (urls == null || urls.size() == 0) { + return; + } + String service = urls.get(0).getServiceName(); + services.add(service); + List proivderUrls = new ArrayList(); + List routeUrls = new ArrayList(); + for (URL url : urls) { + if (Constants.ROUTE_PROTOCOL.equals(url.getProtocol())) { + routeUrls.add(url); + } else { + proivderUrls.add(url); + } + } + providers.put(service, proivderUrls); + routes.put(service, proivderUrls); + } + });*/ + for (int i = 0; i < 5; i ++) { + String service = "com.alibaba.foo.BarService" + i; + services.add(service); + + List proivderUrls = new ArrayList(); + for (int j = 0; j < 10; j ++) { + proivderUrls.add(URL.valueOf("dubbo://10.20.153." + j + ":20880/" + service)); + } + providers.put(service, proivderUrls); + + List routeUrls = new ArrayList(); + for (int j = 0; j < 10; j ++) { + routeUrls.add(URL.valueOf("registry://127.0.0.1:20880?type=js&rule=aaa" + j)); + } + routes.put(service, routeUrls); + } + + } + + public void stop() { + try { + registry.destroy(); + } catch (Throwable e) { + logger.error(e.getMessage(), e); + } + } + +} diff --git a/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/pages/ProvidersPageHandler.java b/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/pages/ProvidersPageHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..61d798bc1613cba4028dee1bd55110125729d263 --- /dev/null +++ b/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/pages/ProvidersPageHandler.java @@ -0,0 +1,69 @@ +/* + * Copyright 1999-2011 Alibaba Group. + * + * Licensed 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 com.alibaba.dubbo.registry.admin.pages; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import com.alibaba.dubbo.common.Extension; +import com.alibaba.dubbo.common.URL; +import com.alibaba.dubbo.container.page.Page; +import com.alibaba.dubbo.container.page.PageHandler; +import com.alibaba.dubbo.registry.admin.RegistryContainer; + +/** + * ProvidersPageHandler + * + * @author william.liangf + */ +@Extension("providers") +public class ProvidersPageHandler implements PageHandler { + + public Page handle(URL url) { + String service = url.getParameter("service"); + List> rows = new ArrayList>(); + String nav; + if (service != null && service.length() > 0) { + List providers = RegistryContainer.getInstance().getProviders(service); + if (providers != null && providers.size() > 0) { + for (URL provider : providers) { + List row = new ArrayList(); + row.add(provider.toFullString()); + rows.add(row); + } + } + nav = " > Services > " + service; + } else { + Collection> values = RegistryContainer.getInstance().getProviders().values(); + if (values != null && values.size() > 0) { + for (List providers : values) { + if (providers != null && providers.size() > 0) { + for (URL provider : providers) { + List row = new ArrayList(); + row.add(provider.toFullString()); + rows.add(row); + } + } + } + } + nav = ""; + } + return new Page("Home" + nav + " > Providers", "Providers (" + rows.size() + ")", + new String[] { "Provider URL:" }, rows); + } + +} diff --git a/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/pages/RoutesPageHandler.java b/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/pages/RoutesPageHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..73e5607b61ec5c58ed43f510179ba05482ae15a6 --- /dev/null +++ b/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/pages/RoutesPageHandler.java @@ -0,0 +1,72 @@ +/* + * Copyright 1999-2011 Alibaba Group. + * + * Licensed 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 com.alibaba.dubbo.registry.admin.pages; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import com.alibaba.dubbo.common.Extension; +import com.alibaba.dubbo.common.URL; +import com.alibaba.dubbo.container.page.Page; +import com.alibaba.dubbo.container.page.PageHandler; +import com.alibaba.dubbo.registry.admin.RegistryContainer; +import com.alibaba.dubbo.rpc.RpcConstants; + +/** + * RoutesPageHandler + * + * @author william.liangf + */ +@Extension("routes") +public class RoutesPageHandler implements PageHandler { + + public Page handle(URL url) { + String service = url.getParameter("service"); + List> rows = new ArrayList>(); + String nav; + if (service != null && service.length() > 0) { + List routes = RegistryContainer.getInstance().getRoutes(service); + if (routes != null && routes.size() > 0) { + for (URL route : routes) { + List row = new ArrayList(); + row.add(route.getParameter(RpcConstants.TYPE_KEY)); + row.add(route.getParameterAndDecoded(RpcConstants.RULE_KEY).replace("<", "lt;").replace(">", "gt;")); + rows.add(row); + } + } + nav = " > Services > " + service; + } else { + Collection> values = RegistryContainer.getInstance().getRoutes().values(); + if (values != null && values.size() > 0) { + for (List routes : values) { + if (routes != null && routes.size() > 0) { + for (URL route : routes) { + List row = new ArrayList(); + row.add(route.getParameter(RpcConstants.TYPE_KEY)); + row.add(route.getParameterAndDecoded(RpcConstants.RULE_KEY).replace("<", "lt;").replace(">", "gt;")); + rows.add(row); + } + } + } + } + nav = ""; + } + return new Page("Home" + nav + " > Routes", "Routes (" + rows.size() + ")", + new String[] { "Route Type:", "Route Rule:" }, rows); + } + +} diff --git a/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/pages/ServicesPageHandler.java b/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/pages/ServicesPageHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..b1622aa3d214d57e495354381a984e75d9f9c5f5 --- /dev/null +++ b/dubbo-registry-admin/src/main/java/com/alibaba/dubbo/registry/admin/pages/ServicesPageHandler.java @@ -0,0 +1,54 @@ +/* + * Copyright 1999-2011 Alibaba Group. + * + * Licensed 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 com.alibaba.dubbo.registry.admin.pages; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import com.alibaba.dubbo.common.Extension; +import com.alibaba.dubbo.common.URL; +import com.alibaba.dubbo.container.page.Menu; +import com.alibaba.dubbo.container.page.Page; +import com.alibaba.dubbo.container.page.PageHandler; +import com.alibaba.dubbo.registry.admin.RegistryContainer; + +/** + * ServicesPageHandler + * + * @author william.liangf + */ +@Menu(name = "Services", desc = "Services", order = 1000) +@Extension("services") +public class ServicesPageHandler implements PageHandler { + + public Page handle(URL url) { + Set services = RegistryContainer.getInstance().getServices(); + List> rows = new ArrayList>(); + if (services != null && services.size() > 0) { + for (String service : services) { + List row = new ArrayList(); + row.add(service); + row.add("Providers"); + row.add("Routes"); + rows.add(row); + } + } + return new Page("Home > Services", "Services (" + rows.size() + ")", + new String[] { "Service Name:", "Providers", "Routes" }, rows); + } + +} diff --git a/dubbo-registry-admin/src/main/resources/META-INF/services/com.alibaba.dubbo.container.Container b/dubbo-registry-admin/src/main/resources/META-INF/services/com.alibaba.dubbo.container.Container new file mode 100644 index 0000000000000000000000000000000000000000..060465d32fc6f49c1d855420b25bf8afd3ef8c6e --- /dev/null +++ b/dubbo-registry-admin/src/main/resources/META-INF/services/com.alibaba.dubbo.container.Container @@ -0,0 +1 @@ +com.alibaba.dubbo.registry.admin.RegistryContainer \ No newline at end of file diff --git a/dubbo-registry-admin/src/main/resources/META-INF/services/com.alibaba.dubbo.container.page.PageHandler b/dubbo-registry-admin/src/main/resources/META-INF/services/com.alibaba.dubbo.container.page.PageHandler new file mode 100644 index 0000000000000000000000000000000000000000..78a8ead560e69a2a271d3200d0e2e7e76a414b26 --- /dev/null +++ b/dubbo-registry-admin/src/main/resources/META-INF/services/com.alibaba.dubbo.container.page.PageHandler @@ -0,0 +1,3 @@ +com.alibaba.dubbo.registry.admin.pages.ServicesPageHandler +com.alibaba.dubbo.registry.admin.pages.ProvidersPageHandler +com.alibaba.dubbo.registry.admin.pages.RoutesPageHandler \ No newline at end of file diff --git a/dubbo-registry-admin/src/test/java/com/alibaba/dubbo/registry/admin/Admin.java b/dubbo-registry-admin/src/test/java/com/alibaba/dubbo/registry/admin/Admin.java new file mode 100644 index 0000000000000000000000000000000000000000..cef7f863d4b861e11aa492673219758957a97659 --- /dev/null +++ b/dubbo-registry-admin/src/test/java/com/alibaba/dubbo/registry/admin/Admin.java @@ -0,0 +1,30 @@ +/* + * Copyright 1999-2011 Alibaba Group. + * + * Licensed 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 com.alibaba.dubbo.registry.admin; + +/** + * Main + * + * @author william.liangf + */ +public class Admin { + + public static void main(String[] args) { + System.setProperty(RegistryContainer.REGISTRY_URL, "zookeeper://10.20.153.10:2181"); + com.alibaba.dubbo.container.Main.main(new String[] {"registry", "log4j", "jetty"}); + } + +} diff --git a/pom.xml b/pom.xml index 0c7e530ef392aa84b90c82fd739252ab9a69ef23..58a2b01263925570fe879ecf915c1dcdde26c769 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,7 @@ dubbo-registry-simple dubbo-registry-multicast dubbo-registry-zookeeper + dubbo-registry-admin dubbo-monitor dubbo-monitor-simple dubbo-config