This is an automated email from the ASF dual-hosted git repository. min pushed a commit to branch metadata in repository https://gitbox.apache.org/repos/asf/incubator-dubbo-ops.git
The following commit(s) were added to refs/heads/metadata by this push: new c224fbb add apollo client support c224fbb is described below commit c224fbbb5658cfb3bd07f2f6df95ce564bae691e Author: nzomkxia <z82507...@gmail.com> AuthorDate: Thu Dec 20 10:58:19 2018 +0800 add apollo client support --- .../exception/ConfigurationException.java} | 22 ++------- .../apache/dubbo/admin/config/ConfigCenter.java | 22 ++++++++- .../dubbo/admin/controller/ServiceController.java | 12 +++-- .../admin/data/config/GovernanceConfiguration.java | 6 +++ .../data/config/impl/ApolloConfiguration.java | 56 ++++++++++++++++++++-- .../admin/data/config/impl/NoOpConfiguration.java | 15 ++++++ .../data/config/impl/ZookeeperConfiguration.java | 40 ++++++++++++---- .../admin/service/impl/OverrideServiceImpl.java | 3 +- .../admin/service/impl/ProviderServiceImpl.java | 24 ++++++---- .../src/main/resources/application.properties | 6 ++- .../src/components/governance/AccessControl.vue | 2 +- .../src/components/governance/LoadBalance.vue | 2 +- .../src/components/governance/Overrides.vue | 9 +++- .../src/components/governance/RoutingRule.vue | 2 +- .../src/components/governance/TagRule.vue | 2 +- .../src/components/governance/WeightAdjust.vue | 2 +- 16 files changed, 171 insertions(+), 54 deletions(-) diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/exception/ConfigurationException.java similarity index 68% copy from dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java copy to dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/exception/ConfigurationException.java index 5f86357..89fbb0b 100644 --- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java +++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/exception/ConfigurationException.java @@ -15,23 +15,11 @@ * limitations under the License. */ -package org.apache.dubbo.admin.data.config; +package org.apache.dubbo.admin.common.exception; -import org.apache.dubbo.common.URL; -import org.apache.dubbo.common.extension.SPI; - - -@SPI("zookeeper") -public interface GovernanceConfiguration { - void init(); - - void setUrl(URL url); - - URL getUrl(); - String setConfig(String key, String value); - - String getConfig(String key); - - boolean deleteConfig(String key); +public class ConfigurationException extends RuntimeException{ + public ConfigurationException(String message) { + super(message); + } } diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java index 6f6f13f..31af96f 100644 --- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java +++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java @@ -18,9 +18,12 @@ package org.apache.dubbo.admin.config; import org.apache.commons.lang3.StringUtils; +import org.apache.dubbo.admin.common.exception.ConfigurationException; +import org.apache.dubbo.admin.common.exception.ParamValidationException; import org.apache.dubbo.admin.common.util.Constants; import org.apache.dubbo.admin.data.config.GovernanceConfiguration; import org.apache.dubbo.admin.data.metadata.MetaDataCollector; +import org.apache.dubbo.admin.data.metadata.impl.NoOpMetadataCollector; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.registry.Registry; @@ -59,7 +62,8 @@ public class ConfigCenter { */ @Bean("governanceConfiguration") GovernanceConfiguration getDynamicConfiguration() { - GovernanceConfiguration dynamicConfiguration = ExtensionLoader.getExtensionLoader(GovernanceConfiguration.class).getDefaultExtension(); + GovernanceConfiguration dynamicConfiguration = null; + if (StringUtils.isNotEmpty(configCenter)) { configCenterUrl = formUrl(configCenter, group); dynamicConfiguration = ExtensionLoader.getExtensionLoader(GovernanceConfiguration.class).getExtension(configCenterUrl.getProtocol()); @@ -77,6 +81,17 @@ public class ConfigCenter { }); } } + if (dynamicConfiguration == null) { + if (StringUtils.isNotEmpty(registryAddress)) { + registryUrl = formUrl(registryAddress, group); + dynamicConfiguration = ExtensionLoader.getExtensionLoader(GovernanceConfiguration.class).getExtension(registryUrl.getProtocol()); + dynamicConfiguration.setUrl(registryUrl); + dynamicConfiguration.init(); + } else { + throw new ConfigurationException("Either configcenter or registry address is needed"); + //throw exception + } + } return dynamicConfiguration; } @@ -88,6 +103,9 @@ public class ConfigCenter { Registry getRegistry() { Registry registry = null; if (registryUrl == null) { + if (StringUtils.isNotEmpty(registryAddress)) { + throw new ConfigurationException("Either configcenter or registry address is needed"); + } registryUrl = formUrl(registryAddress, group); } RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension(); @@ -101,7 +119,7 @@ public class ConfigCenter { @Bean @DependsOn("governanceConfiguration") MetaDataCollector getMetadataCollector() { - MetaDataCollector metaDataCollector = ExtensionLoader.getExtensionLoader(MetaDataCollector.class).getDefaultExtension(); + MetaDataCollector metaDataCollector = new NoOpMetadataCollector(); if (metadataUrl != null) { metaDataCollector = ExtensionLoader.getExtensionLoader(MetaDataCollector.class).getExtension(metadataUrl.getProtocol()); metaDataCollector.setUrl(metadataUrl); diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java index ddc8831..704d7e6 100644 --- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java +++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java @@ -120,12 +120,14 @@ public class ServiceController { info.get(Constants.VERSION_KEY), info.get(Constants.GROUP_KEY), Constants.PROVIDER_SIDE, application); String metadata = providerService.getProviderMetaData(identifier); - Gson gson = new Gson(); - FullServiceDefinition serviceDefinition = gson.fromJson(metadata, FullServiceDefinition.class); ServiceDetailDTO serviceDetailDTO = new ServiceDetailDTO(); - serviceDetailDTO.setConsumers(consumers); - serviceDetailDTO.setProviders(providers); - serviceDetailDTO.setMetadata(serviceDefinition); + if (metadata != null) { + Gson gson = new Gson(); + FullServiceDefinition serviceDefinition = gson.fromJson(metadata, FullServiceDefinition.class); + serviceDetailDTO.setConsumers(consumers); + serviceDetailDTO.setProviders(providers); + serviceDetailDTO.setMetadata(serviceDefinition); + } return serviceDetailDTO; } } diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java index 5f86357..8fb75ab 100644 --- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java +++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java @@ -34,4 +34,10 @@ public interface GovernanceConfiguration { boolean deleteConfig(String key); + String setConfig(String group, String key, String value); + + String getConfig(String group, String key); + + boolean deleteConfig(String group, String key); + } diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ApolloConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ApolloConfiguration.java index cb05e6a..2bc0f90 100644 --- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ApolloConfiguration.java +++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ApolloConfiguration.java @@ -18,14 +18,30 @@ package org.apache.dubbo.admin.data.config.impl; import com.ctrip.framework.apollo.openapi.client.ApolloOpenApiClient; +import com.ctrip.framework.apollo.openapi.dto.OpenItemDTO; import org.apache.dubbo.admin.data.config.GovernanceConfiguration; import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.extension.SPI; import org.springframework.beans.factory.annotation.Value; +@SPI("apollo") public class ApolloConfiguration implements GovernanceConfiguration { @Value("${dubbo.apollo.token}") private String token; + + @Value("${dubbo.apollo.cluster}") + private String cluster; + + @Value("${dubbo.apollo.namespace}") + private String namespace; + + @Value("${dubbo.apollo.env}") + private String env; + + @Value("${dubbo.apollo.appId}") + private String appId; + private URL url; private ApolloOpenApiClient client; @@ -47,16 +63,50 @@ public class ApolloConfiguration implements GovernanceConfiguration { @Override public String setConfig(String key, String value) { - return null; + return setConfig(null, key, value); } @Override public String getConfig(String key) { - return null; + return getConfig(null, key); } @Override public boolean deleteConfig(String key) { - return false; + return deleteConfig(null, key); + } + + @Override + public String setConfig(String group, String key, String value) { + if (group == null) { + group = namespace; + } + OpenItemDTO openItemDTO = new OpenItemDTO(); + openItemDTO.setKey(key); + openItemDTO.setValue(value); + client.createItem(appId, env, cluster, group, openItemDTO); + return value; + } + + @Override + public String getConfig(String group, String key) { + if (group == null) { + group = namespace; + } + OpenItemDTO openItemDTO = client.getItem(appId, env, cluster, group, key); + if (openItemDTO != null) { + return openItemDTO.getValue(); + } + return null; + } + + @Override + public boolean deleteConfig(String group, String key) { + if (group == null) { + group = namespace; + } + //TODO user login user name as the operator + client.removeItem(appId, env, cluster, group, key, "admin"); + return true; } } diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/NoOpConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/NoOpConfiguration.java index 324bf8f..08cb489 100644 --- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/NoOpConfiguration.java +++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/NoOpConfiguration.java @@ -51,4 +51,19 @@ public class NoOpConfiguration implements GovernanceConfiguration { public boolean deleteConfig(String key) { return false; } + + @Override + public String setConfig(String group, String key, String value) { + return null; + } + + @Override + public String getConfig(String group, String key) { + return null; + } + + @Override + public boolean deleteConfig(String group, String key) { + return false; + } } diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java index 06770fb..95e7988 100644 --- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java +++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java @@ -24,6 +24,8 @@ import org.apache.dubbo.admin.common.util.Constants; import org.apache.dubbo.admin.data.config.GovernanceConfiguration; import org.apache.dubbo.common.URL; +import javax.swing.*; + public class ZookeeperConfiguration implements GovernanceConfiguration { private CuratorFramework zkClient; private URL url; @@ -52,7 +54,22 @@ public class ZookeeperConfiguration implements GovernanceConfiguration { @Override public String setConfig(String key, String value) { - String path = getNodePath(key); + return setConfig(null, key, value); + } + + @Override + public String getConfig(String key) { + return getConfig(null, key); + } + + @Override + public boolean deleteConfig(String key) { + return deleteConfig(null, key); + } + + @Override + public String setConfig(String group, String key, String value) { + String path = getNodePath(key, group); try { if (zkClient.checkExists().forPath(path) == null) { zkClient.create().creatingParentsIfNeeded().forPath(path); @@ -66,8 +83,8 @@ public class ZookeeperConfiguration implements GovernanceConfiguration { } @Override - public String getConfig(String key) { - String path = getNodePath(key); + public String getConfig(String group, String key) { + String path = getNodePath(key, group); try { if (zkClient.checkExists().forPath(path) == null) { @@ -81,8 +98,8 @@ public class ZookeeperConfiguration implements GovernanceConfiguration { } @Override - public boolean deleteConfig(String key) { - String path = getNodePath(key); + public boolean deleteConfig(String group, String key) { + String path = getNodePath(key, group); try { zkClient.delete().forPath(path); } catch (Exception e) { @@ -91,11 +108,18 @@ public class ZookeeperConfiguration implements GovernanceConfiguration { return true; } - private String getNodePath(String path) { - return toRootDir() + path; + private String getNodePath(String path, String group) { + return toRootDir(group) + path; } - private String toRootDir() { + private String toRootDir(String group) { + if (group != null) { + if (!group.startsWith(Constants.PATH_SEPARATOR)) { + root = Constants.PATH_SEPARATOR + group; + } else { + root = group; + } + } if (root.equals(Constants.PATH_SEPARATOR)) { return root; } diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/OverrideServiceImpl.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/OverrideServiceImpl.java index dc4eef6..519696c 100644 --- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/OverrideServiceImpl.java +++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/OverrideServiceImpl.java @@ -23,7 +23,6 @@ import org.apache.dubbo.admin.common.util.OverrideUtils; import org.apache.dubbo.admin.common.util.YamlParser; import org.apache.dubbo.admin.model.domain.LoadBalance; import org.apache.dubbo.admin.model.domain.Override; -import org.apache.dubbo.admin.model.dto.Config; import org.apache.dubbo.admin.model.domain.Weight; import org.apache.dubbo.admin.model.dto.BalancingDTO; import org.apache.dubbo.admin.model.dto.DynamicConfigDTO; @@ -97,7 +96,7 @@ public class OverrideServiceImpl extends AbstractService implements OverrideServ } configs.addAll(update.getConfigs()); overrideDTO.setConfigs(configs); - dynamicConfiguration.setConfig(path, YamlParser.dumpObject(update)); + dynamicConfiguration.setConfig(path, YamlParser.dumpObject(overrideDTO)); //for 2.6 if (StringUtils.isNotEmpty(update.getService())) { diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/ProviderServiceImpl.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/ProviderServiceImpl.java index 832f17b..09670c8 100644 --- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/ProviderServiceImpl.java +++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/ProviderServiceImpl.java @@ -16,7 +16,9 @@ */ package org.apache.dubbo.admin.service.impl; +import com.google.common.collect.Iterables; import com.google.gson.Gson; +import org.apache.dubbo.admin.common.exception.ParamValidationException; import org.apache.dubbo.admin.common.util.ConvertUtil; import org.apache.dubbo.admin.common.util.Pair; import org.apache.dubbo.admin.common.util.ParseUtils; @@ -31,6 +33,7 @@ import org.apache.dubbo.metadata.definition.model.FullServiceDefinition; import org.apache.dubbo.metadata.identifier.MetadataIdentifier; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.yaml.snakeyaml.events.Event; import java.util.ArrayList; import java.util.HashMap; @@ -39,6 +42,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; +import static org.apache.dubbo.common.Constants.SPECIFICATION_VERSION_KEY; + /** * IbatisProviderService * @@ -398,22 +403,21 @@ public class ProviderServiceImpl extends AbstractService implements ProviderServ @Override public String findVersionInApplication(String application) { List<String> services = findServicesByApplication(application); + if (services == null || services.size() == 0) { + throw new ParamValidationException("there is no service for application: " + application); + } return findServiceVersion(services.get(0), application); } @Override public String findServiceVersion(String serviceName, String application) { String version = "2.6"; - serviceName = serviceName.replace("*", "/"); - Map<String, String> info = ConvertUtil.serviceName2Map(serviceName); - MetadataIdentifier identifier = new MetadataIdentifier(info.get(Constants.INTERFACE_KEY), - info.get(Constants.VERSION_KEY), - info.get(Constants.GROUP_KEY), Constants.PROVIDER_SIDE, application); - String metadata = getProviderMetaData(identifier); - Gson gson = new Gson(); - if (StringUtils.isNoneEmpty(metadata)) { - FullServiceDefinition serviceDefinition = gson.fromJson(metadata, FullServiceDefinition.class); - version = serviceDefinition.getParameters().get("specVersion"); + Map<String, URL> result = findProviderUrlByAppandService(application, serviceName); + if (result != null && result.size() > 0) { + URL url = result.values().stream().findFirst().get(); + if (url.getParameter(Constants.SPECIFICATION_VERSION_KEY) != null) { + version = url.getParameter(Constants.SPECIFICATION_VERSION_KEY); + } } return version; } diff --git a/dubbo-admin-backend/src/main/resources/application.properties b/dubbo-admin-backend/src/main/resources/application.properties index 294b80e..892d167 100644 --- a/dubbo-admin-backend/src/main/resources/application.properties +++ b/dubbo-admin-backend/src/main/resources/application.properties @@ -17,4 +17,8 @@ dubbo.registry.group=dubbo dubbo.configcenter=zookeeper://127.0.0.1:2181 -dubbo.apollo.token=xxxxx \ No newline at end of file +dubbo.apollo.token=e16e5cd903fd0c97a116c873b448544b9d086de9 +dubbo.apollo.appId=test +dubbo.apollo.env=dev +dubbo.apollo.cluster=default +dubbo.apollo.namespace=dubbo diff --git a/dubbo-admin-frontend/src/components/governance/AccessControl.vue b/dubbo-admin-frontend/src/components/governance/AccessControl.vue index 5e26f27..3b2dcab 100644 --- a/dubbo-admin-frontend/src/components/governance/AccessControl.vue +++ b/dubbo-admin-frontend/src/components/governance/AccessControl.vue @@ -307,7 +307,7 @@ export default { let doc = yaml.load(this.modal.content) this.filter = '' if (this.modal.service === '' && this.modal.service === null) { - this.$notify.error("Either service or application is needed") + this.$notify.error('Either service or application is needed') return } var vm = this diff --git a/dubbo-admin-frontend/src/components/governance/LoadBalance.vue b/dubbo-admin-frontend/src/components/governance/LoadBalance.vue index 06ebce2..76f9425 100644 --- a/dubbo-admin-frontend/src/components/governance/LoadBalance.vue +++ b/dubbo-admin-frontend/src/components/governance/LoadBalance.vue @@ -270,7 +270,7 @@ this.ruleText = this.verifyRuleText(this.ruleText) let balancing = yaml.safeLoad(this.ruleText) if (this.service === '' && this.application === '') { - this.$notify.error("Either service or application is needed") + this.$notify.error('Either service or application is needed') return } balancing.service = this.service diff --git a/dubbo-admin-frontend/src/components/governance/Overrides.vue b/dubbo-admin-frontend/src/components/governance/Overrides.vue index 6c773bc..32a1855 100644 --- a/dubbo-admin-frontend/src/components/governance/Overrides.vue +++ b/dubbo-admin-frontend/src/components/governance/Overrides.vue @@ -270,7 +270,7 @@ saveItem: function () { let override = yaml.safeLoad(this.ruleText) if (this.service === '' && this.application === '') { - this.$notify.error("Either service or application is needed") + this.$notify.error('Either service or application is needed') return } override.service = this.service @@ -361,6 +361,7 @@ delete config.service delete config.application delete config.id + this.removeEmpty(config) this.ruleText = yaml.safeDump(config) this.readonly = readonly this.dialog = true @@ -368,6 +369,12 @@ setHeight: function () { this.height = window.innerHeight * 0.5 }, + removeEmpty: function (obj) { + Object.keys(obj).forEach(key => { + if (obj[key] && typeof obj[key] === 'object') this.removeEmpty(obj[key]); + else if (obj[key] == null) delete obj[key]; + }); + }, deleteItem: function (warnStatus) { let id = warnStatus.id let operation = warnStatus.operation diff --git a/dubbo-admin-frontend/src/components/governance/RoutingRule.vue b/dubbo-admin-frontend/src/components/governance/RoutingRule.vue index 5357762..09cbd3f 100644 --- a/dubbo-admin-frontend/src/components/governance/RoutingRule.vue +++ b/dubbo-admin-frontend/src/components/governance/RoutingRule.vue @@ -295,7 +295,7 @@ saveItem: function () { let rule = yaml.safeLoad(this.ruleText) if (this.service === '' && this.application === '') { - this.$notify.error("Either service or application is needed") + this.$notify.error('Either service or application is needed') return } rule.service = this.service diff --git a/dubbo-admin-frontend/src/components/governance/TagRule.vue b/dubbo-admin-frontend/src/components/governance/TagRule.vue index e7bd9ce..ee9c3a7 100644 --- a/dubbo-admin-frontend/src/components/governance/TagRule.vue +++ b/dubbo-admin-frontend/src/components/governance/TagRule.vue @@ -194,7 +194,7 @@ saveItem: function () { let rule = yaml.safeLoad(this.ruleText) if (this.application === '') { - this.$notify.error("application is required") + this.$notify.error('application is required') return } rule.application = this.application diff --git a/dubbo-admin-frontend/src/components/governance/WeightAdjust.vue b/dubbo-admin-frontend/src/components/governance/WeightAdjust.vue index ebedf5e..737daad 100644 --- a/dubbo-admin-frontend/src/components/governance/WeightAdjust.vue +++ b/dubbo-admin-frontend/src/components/governance/WeightAdjust.vue @@ -274,7 +274,7 @@ saveItem: function () { let weight = yaml.safeLoad(this.ruleText) if (this.service === '' && this.application === '') { - this.$notify.error("Either service or application is needed") + this.$notify.error('Either service or application is needed') return } weight.service = this.service