[ISSUE #771]Use url parameters instead of special configuration (#772)
* use url parameters instead of special configuration
* fix ci
* keep config here
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
index 994bb8c..43a2dc1 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
@@ -170,10 +170,10 @@
private URL formUrl(String config, String group, String nameSpace, String username, String password) {
URL url = URL.valueOf(config);
- if (StringUtils.isNotEmpty(group)) {
+ if (StringUtils.isEmpty(url.getParameter(Constants.GROUP_KEY)) && StringUtils.isNotEmpty(group)) {
url = url.addParameter(Constants.GROUP_KEY, group);
}
- if (StringUtils.isNotEmpty(nameSpace)){
+ if (StringUtils.isEmpty(url.getParameter(Constants.NAMESPACE_KEY)) && StringUtils.isNotEmpty(nameSpace)) {
url = url.addParameter(Constants.NAMESPACE_KEY, nameSpace);
}
if (StringUtils.isNotEmpty(username)) {
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/config/impl/ApolloConfiguration.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/config/impl/ApolloConfiguration.java
index 58ce20c..528df20 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/config/impl/ApolloConfiguration.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/config/impl/ApolloConfiguration.java
@@ -19,29 +19,48 @@
import com.ctrip.framework.apollo.openapi.client.ApolloOpenApiClient;
import com.ctrip.framework.apollo.openapi.dto.OpenItemDTO;
+
+import org.apache.dubbo.admin.common.util.Constants;
import org.apache.dubbo.admin.registry.config.GovernanceConfiguration;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.SPI;
+import org.apache.dubbo.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Value;
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
+
@SPI("apollo")
public class ApolloConfiguration implements GovernanceConfiguration {
- @Value("${admin.apollo.token}")
+ private static final String APOLLO_ENV_KEY = "env";
+ private static final String CLUSTER_KEY = "cluster";
+ private static final String TOKEN_KEY = "token";
+ private static final String APOLLO_APPID_KEY = "app.id";
+ private static final String APOLLO_PROTOCOL_PREFIX = "http://";
+
+ @Value("${admin.apollo.token:}")
+ private String configToken;
+
+ @Value("${admin.apollo.cluster:}")
+ private String configCluster;
+
+ @Value("${admin.apollo.namespace:}")
+ private String configNamespace;
+
+ @Value("${admin.apollo.env:}")
+ private String configEnv;
+
+ @Value("${admin.apollo.appId:}")
+ private String configAppId;
+
private String token;
-
- @Value("${admin.apollo.cluster}")
private String cluster;
-
- @Value("${admin.apollo.namespace}")
private String namespace;
-
- @Value("${admin.apollo.env}")
private String env;
-
- @Value("${admin.apollo.appId}")
private String appId;
-
private URL url;
private ApolloOpenApiClient client;
@@ -58,9 +77,28 @@
@Override
public void init() {
- client = ApolloOpenApiClient.newBuilder().withPortalUrl(url.getAddress()).withToken(token).build();
+ token = url.getParameter(TOKEN_KEY, configToken);
+ cluster = url.getParameter(CLUSTER_KEY, configCluster);
+ namespace = url.getParameter(Constants.NAMESPACE_KEY, configNamespace);
+ env = url.getParameter(APOLLO_ENV_KEY, configEnv);
+ appId = url.getParameter(APOLLO_APPID_KEY, configAppId);
+ String address = getAddressWithProtocolPrefix(url);
+ client = ApolloOpenApiClient.newBuilder().withPortalUrl(address).withToken(token).build();
}
-
+ private String getAddressWithProtocolPrefix(URL url) {
+ String address = url.getBackupAddress();
+ if (StringUtils.isNotEmpty(address)) {
+ address = Arrays.stream(COMMA_SPLIT_PATTERN.split(address))
+ .map(addr -> {
+ if (addr.startsWith(APOLLO_PROTOCOL_PREFIX)) {
+ return addr;
+ }
+ return APOLLO_PROTOCOL_PREFIX + addr;
+ })
+ .collect(Collectors.joining(","));
+ }
+ return address;
+ }
@Override
public String setConfig(String key, String value) {
return setConfig(null, key, value);
diff --git a/dubbo-admin-server/src/main/resources/application.properties b/dubbo-admin-server/src/main/resources/application.properties
index 38abde6..df17468 100644
--- a/dubbo-admin-server/src/main/resources/application.properties
+++ b/dubbo-admin-server/src/main/resources/application.properties
@@ -15,35 +15,42 @@
# limitations under the License.
#
-# centers in dubbo2.7
+# centers in dubbo2.7, if you want to add parameters, please add them to the url
admin.registry.address=zookeeper://127.0.0.1:2181
admin.config-center=zookeeper://127.0.0.1:2181
admin.metadata-report.address=zookeeper://127.0.0.1:2181
-#admin.registry.address=nacos://127.0.0.1:8848
-#admin.config-center=nacos://127.0.0.1:8848
-#admin.metadata-report.address=nacos://127.0.0.1:8848
+# nacos config, add parameters to url like username=nacos&password=nacos
+#admin.registry.address=nacos://127.0.0.1:8848?group=DEFAULT_GROUP&namespace=public
+#admin.config-center=nacos://127.0.0.1:8848?group=dubbo
+#admin.metadata-report.address=nacos://127.0.0.1:8848?group=dubbo
+
+#group (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.group=dubbo
+#admin.config-center.group=dubbo
+#admin.metadata-report.group=dubbo
+
+#namespace used by nacos. (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.namespace=public
+#admin.config-center.namespace=public
+#admin.metadata-report.namespace=public
admin.root.user.name=root
admin.root.user.password=root
-#group
-admin.registry.group=dubbo
-admin.config-center.group=dubbo
-admin.metadata-report.group=dubbo
#session timeout, default is one hour
admin.check.sessionTimeoutMilli=3600000
-#namespace used by nacos
-admin.registry.namespace=public
-admin.config-center.namespace=public
-admin.metadata-report.namespace=public
-admin.apollo.token=e16e5cd903fd0c97a116c873b448544b9d086de9
-admin.apollo.appId=test
-admin.apollo.env=dev
-admin.apollo.cluster=default
-admin.apollo.namespace=dubbo
+# apollo config
+# admin.config-center = apollo://localhost:8070?token=e16e5cd903fd0c97a116c873b448544b9d086de9&app.id=test&env=dev&cluster=default&namespace=dubbo
+
+# (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.apollo.token=e16e5cd903fd0c97a116c873b448544b9d086de9
+#admin.apollo.appId=test
+#admin.apollo.env=dev
+#admin.apollo.cluster=default
+#admin.apollo.namespace=dubbo
#compress
server.compression.enabled=true
diff --git a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/config/ConfigCenterTest.java b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/config/ConfigCenterTest.java
index 2def1ac..87271c1 100644
--- a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/config/ConfigCenterTest.java
+++ b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/config/ConfigCenterTest.java
@@ -68,8 +68,7 @@
@Test
public void testGetDynamicConfiguration() throws Exception {
// mock @value inject
- ReflectionTestUtils.setField(configCenter, "configCenter", zkAddress);
- ReflectionTestUtils.setField(configCenter, "configCenterGroup", "dubbo");
+ ReflectionTestUtils.setField(configCenter, "configCenter", zkAddress + "?group=" + "dubbo");
ReflectionTestUtils.setField(configCenter, "username", "username");
ReflectionTestUtils.setField(configCenter, "password", "password");
@@ -128,8 +127,7 @@
assertNull(ReflectionTestUtils.getField(configCenter, "registryUrl"));
// mock @value inject
- ReflectionTestUtils.setField(configCenter, "registryAddress", zkAddress);
- ReflectionTestUtils.setField(configCenter, "registryGroup", "dubbo");
+ ReflectionTestUtils.setField(configCenter, "registryAddress", zkAddress + "?group=" + "dubbo");
ReflectionTestUtils.setField(configCenter, "username", "username");
ReflectionTestUtils.setField(configCenter, "password", "password");
@@ -147,8 +145,7 @@
assertNull(ReflectionTestUtils.getField(configCenter, "metadataUrl"));
// mock @value inject
- ReflectionTestUtils.setField(configCenter, "metadataAddress", zkAddress);
- ReflectionTestUtils.setField(configCenter, "metadataGroup", "dubbo");
+ ReflectionTestUtils.setField(configCenter, "metadataAddress", zkAddress + "?group=" + "dubbo");
ReflectionTestUtils.setField(configCenter, "username", "username");
ReflectionTestUtils.setField(configCenter, "password", "password");