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