This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 0d7053b2dda4ad1fd3677cd5741f4085c8c0d573
Author: liubao <[email protected]>
AuthorDate: Fri Sep 11 18:00:19 2020 +0800

    [SCB-2081]add ssl support
---
 clients/http-client-common/pom.xml                 |   5 +
 .../http/client/common/HttpConfiguration.java}     |  46 ++++---
 .../http/client/common/HttpTransportFactory.java   |  53 +++++++-
 .../http/client/common/HttpTransportImpl.java      |   7 +-
 .../servicecomb/http/client/common/TLSConfig.java  |  97 --------------
 .../http/client/common/TLSHttpsTransport.java      | 140 ---------------------
 .../http/client/common/HttpTransportImplTest.java  |   3 +-
 .../service/center/client/AbstractTask.java        |   4 +
 .../service/center/client/AddressManager.java      |  63 ++++++++++
 .../service/center/client/ServiceCenterClient.java |  69 +---------
 .../center/client/ServiceCenterConfiguration.java  |  84 +++++++++++++
 .../center/client/ServiceCenterDiscovery.java      |  27 ++++
 .../center/client/ServiceCenterRawClient.java      | 138 +++++---------------
 .../service/center/client/model/Microservice.java  |   3 -
 .../center/client/model/MicroserviceInstance.java  |   3 -
 .../center/client/ServiceCenterRawClientTest.java  |   6 +-
 .../RegistryClientTest.java                        |  11 +-
 17 files changed, 314 insertions(+), 445 deletions(-)

diff --git a/clients/http-client-common/pom.xml 
b/clients/http-client-common/pom.xml
index b585b1a..4f4ff52 100644
--- a/clients/http-client-common/pom.xml
+++ b/clients/http-client-common/pom.xml
@@ -58,6 +58,11 @@
     </dependency>
 
     <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>foundation-ssl</artifactId>
+    </dependency>
+
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>
diff --git 
a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/TLSHttpsTransportTest.java
 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpConfiguration.java
similarity index 54%
rename from 
clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/TLSHttpsTransportTest.java
rename to 
clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpConfiguration.java
index 185ac3d..59b6b4c 100644
--- 
a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/TLSHttpsTransportTest.java
+++ 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpConfiguration.java
@@ -17,31 +17,39 @@
 
 package org.apache.servicecomb.http.client.common;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.apache.servicecomb.foundation.ssl.SSLCustom;
+import org.apache.servicecomb.foundation.ssl.SSLOption;
 
-/**
- * Created by   on 2019/10/31.
- */
-public class TLSHttpsTransportTest {
+public interface HttpConfiguration {
+  class SSLProperties {
+    private boolean enabled;
+
+    private SSLOption sslOption;
+
+    private SSLCustom sslCustom;
 
-  /**
-   * test TLS HttpTransport
-   */
-  @Test
-  public void TestTLSConfig() {
+    public boolean isEnabled() {
+      return enabled;
+    }
 
-    TLSConfig tlsConfig = new TLSConfig();
+    public void setEnabled(boolean enabled) {
+      this.enabled = enabled;
+    }
 
-    tlsConfig.setKeyStoreType(TLSConfig.KeyStoreInstanceType.PKCS12);
-    
tlsConfig.setKeyStore(this.getClass().getResource("/tls/client.p12").getFile().toString());
-    tlsConfig.setKeyStoreValue("123456");
+    public SSLOption getSslOption() {
+      return sslOption;
+    }
 
-    
tlsConfig.setTrustStore(this.getClass().getResource("/tls/server.jks").getFile().toString());
-    tlsConfig.setTrustStoreValue("123456");
+    public void setSslOption(SSLOption sslOption) {
+      this.sslOption = sslOption;
+    }
 
-    HttpTransport tlsHttpTransport = new TLSHttpsTransport(tlsConfig);
+    public SSLCustom getSslCustom() {
+      return sslCustom;
+    }
 
-    Assert.assertNotNull(tlsHttpTransport);
+    public void setSslCustom(SSLCustom sslCustom) {
+      this.sslCustom = sslCustom;
+    }
   }
 }
diff --git 
a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportFactory.java
 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportFactory.java
index a3a61f4..3fa5f73 100644
--- 
a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportFactory.java
+++ 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportFactory.java
@@ -17,14 +17,61 @@
 
 package org.apache.servicecomb.http.client.common;
 
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.servicecomb.foundation.ssl.SSLManager;
+
 public class HttpTransportFactory {
+  // All parameters set to 5 seconds now.
+  public static final int CONNECT_TIMEOUT = 5000;
+
+  public static final int CONNECTION_REQUEST_TIMEOUT = 5000;
+
+  public static final int SOCKET_TIMEOUT = 5000;
+
+  public static final int MAX_TOTAL = 100;
 
-  private static final HttpTransport httpTransport = new HttpTransportImpl();
+  public static final int DEFAULT_MAX_PER_ROUTE = 10;
 
   private HttpTransportFactory() {
   }
 
-  public static HttpTransport getDefaultHttpTransport() {
-    return httpTransport;
+  public static HttpTransport 
createHttpTransport(HttpConfiguration.SSLProperties sslProperties) {
+    RequestConfig config = RequestConfig.custom()
+        .setConnectTimeout(CONNECT_TIMEOUT)
+        .setConnectionRequestTimeout(
+            CONNECTION_REQUEST_TIMEOUT)
+        .setSocketTimeout(SOCKET_TIMEOUT).build();
+
+    //register http/https socket factory
+    RegistryBuilder<ConnectionSocketFactory> builder = 
RegistryBuilder.<ConnectionSocketFactory>create();
+    builder.register("http", PlainConnectionSocketFactory.INSTANCE);
+    if (sslProperties.isEnabled()) {
+      builder.register("https",
+          new SSLConnectionSocketFactory(
+              SSLManager.createSSLContext(sslProperties.getSslOption(), 
sslProperties.getSslCustom()),
+              NoopHostnameVerifier.INSTANCE));
+    }
+    Registry<ConnectionSocketFactory> connectionSocketFactoryRegistry = 
builder.build();
+
+    //connection pool management
+    PoolingHttpClientConnectionManager connectionManager = new 
PoolingHttpClientConnectionManager(
+        connectionSocketFactoryRegistry);
+    connectionManager.setMaxTotal(MAX_TOTAL);
+    connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE);
+
+    HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().
+        setDefaultRequestConfig(config).
+        setConnectionManager(connectionManager).
+        disableCookieManagement();
+
+    return new HttpTransportImpl(httpClientBuilder.build());
   }
 }
diff --git 
a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java
 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java
index b205234..06f714d 100644
--- 
a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java
+++ 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java
@@ -21,7 +21,6 @@ import java.io.IOException;
 import java.util.Map;
 
 import org.apache.http.client.HttpClient;
-import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
 
 /**
@@ -33,12 +32,12 @@ public class HttpTransportImpl implements HttpTransport {
 
   private static final String HEADER_USER_AGENT = "User-Agent";
 
-  protected HttpClient httpClient;
+  private HttpClient httpClient;
 
   private Map<String, String> globalHeaders;
 
-  public HttpTransportImpl() {
-    httpClient = HttpClients.createDefault();
+  public HttpTransportImpl(HttpClient httpClient) {
+    this.httpClient = httpClient;
   }
 
   public HttpClient getHttpClient() {
diff --git 
a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/TLSConfig.java
 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/TLSConfig.java
deleted file mode 100644
index 054b563..0000000
--- 
a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/TLSConfig.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.servicecomb.http.client.common;
-
-public class TLSConfig {
-
-  private KeyStoreInstanceType keyStoreType;
-
-  //trust certificate
-  private String trustStore;
-
-  //trust certificate password
-  private String trustStoreValue;
-
-  //identity certificate
-  private String keyStore;
-
-  //identity certificate password
-  private String keyStoreValue;
-
-  public TLSConfig() {
-
-  }
-
-  public TLSConfig(KeyStoreInstanceType keyStoreType, String trustStore, 
String trustStoreValue, String keyStore,
-      String keyStoreValue) {
-    this.keyStoreType = keyStoreType;
-    this.trustStore = trustStore;
-    this.trustStoreValue = trustStoreValue;
-    this.keyStore = keyStore;
-    this.keyStoreValue = keyStoreValue;
-  }
-
-  public KeyStoreInstanceType getKeyStoreType() {
-    return keyStoreType;
-  }
-
-  public void setKeyStoreType(KeyStoreInstanceType keyStoreType) {
-    this.keyStoreType = keyStoreType;
-  }
-
-  public String getTrustStore() {
-    return trustStore;
-  }
-
-  public void setTrustStore(String trustStore) {
-    this.trustStore = trustStore;
-  }
-
-  public String getTrustStoreValue() {
-    return trustStoreValue;
-  }
-
-  public void setTrustStoreValue(String trustStoreValue) {
-    this.trustStoreValue = trustStoreValue;
-  }
-
-  public String getKeyStore() {
-    return keyStore;
-  }
-
-  public void setKeyStore(String keyStore) {
-    this.keyStore = keyStore;
-  }
-
-  public String getKeyStoreValue() {
-    return keyStoreValue;
-  }
-
-  public void setKeyStoreValue(String keyStoreValue) {
-    this.keyStoreValue = keyStoreValue;
-  }
-
-  //keyStore type
-  public enum KeyStoreInstanceType {
-    JKS,
-    JCEKS,
-    PKCS12,
-    PKCS11,
-    DKS
-  }
-}
diff --git 
a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/TLSHttpsTransport.java
 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/TLSHttpsTransport.java
deleted file mode 100644
index d544662..0000000
--- 
a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/TLSHttpsTransport.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.servicecomb.http.client.common;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.KeyManagementException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
-
-import javax.net.ssl.KeyManager;
-import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
-
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.config.Registry;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.ssl.SSLContexts;
-
-/**
- * Created by   on 2019/10/31.
- */
-public class TLSHttpsTransport extends HttpTransportImpl {
-
-  private static final int DEFAULT_MAX_CONNECTIONS = 1000;
-
-  private static final int DEFAULT_MAX_PER_ROUTE = 500;
-
-  private static final int DEFAULT_REQUEST_TIMEOUT = 5000;
-
-  private static final int DEFAULT_CONNECTION_TIMEOUT = 5000;
-
-  public TLSHttpsTransport() {
-
-  }
-
-  /**
-   * configure the certificate to httpClient
-   * @param tlsConfig
-   */
-  public TLSHttpsTransport(TLSConfig tlsConfig) {
-
-    // create keyStore and trustStore
-    KeyStore keyStore = getKeyStore(tlsConfig.getKeyStore(), 
tlsConfig.getKeyStoreType().name(),
-        tlsConfig.getKeyStoreValue());
-    KeyStore trustStore = getKeyStore(tlsConfig.getTrustStore(), 
TLSConfig.KeyStoreInstanceType.JKS.name(),
-        tlsConfig.getTrustStoreValue());
-
-    // initialize SSLContext
-    SSLContext sslContext = getSSLContext(keyStore, 
tlsConfig.getKeyStoreValue(), trustStore);
-
-    assert sslContext != null;
-    //register http/https socket factory
-    Registry<ConnectionSocketFactory> connectionSocketFactoryRegistry = 
RegistryBuilder.<ConnectionSocketFactory>create()
-        .register("http", PlainConnectionSocketFactory.INSTANCE)
-        .register("https", new SSLConnectionSocketFactory(sslContext))
-        .build();
-
-    //connection pool management
-    PoolingHttpClientConnectionManager connectionManager = new 
PoolingHttpClientConnectionManager(
-        connectionSocketFactoryRegistry);
-    connectionManager.setMaxTotal(DEFAULT_MAX_CONNECTIONS);
-    connectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE);
-
-    //request parameter configuration
-    RequestConfig config = RequestConfig.custom().
-        setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT).
-        setConnectionRequestTimeout(DEFAULT_CONNECTION_TIMEOUT).
-        setSocketTimeout(DEFAULT_REQUEST_TIMEOUT).
-        build();
-
-    // construct httpClient
-    HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().
-        setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext)).
-        setConnectionManager(connectionManager).
-        setDefaultRequestConfig(config);
-
-    this.httpClient = httpClientBuilder.build();
-  }
-
-  private KeyStore getKeyStore(String keyStorePath, String keyStoreType, 
String keyStoreValue) {
-    try {
-      KeyStore keyStore = KeyStore.getInstance(keyStoreType);
-      InputStream inputStream = new FileInputStream(keyStorePath);
-      keyStore.load(inputStream, keyStoreValue.toCharArray());
-      return keyStore;
-    } catch (KeyStoreException | CertificateException | 
NoSuchAlgorithmException | IOException e) {
-      e.printStackTrace();
-    }
-    return null;
-  }
-
-  private SSLContext getSSLContext(KeyStore keyStore, String keyStoreValue, 
KeyStore trustStore) {
-    try {
-      KeyManagerFactory keyManagerFactory = 
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
-      keyManagerFactory.init(keyStore, keyStoreValue.toCharArray());
-      KeyManager[] keyManagers = keyManagerFactory.getKeyManagers();
-
-      TrustManagerFactory trustManagerFactory = TrustManagerFactory
-          .getInstance(TrustManagerFactory.getDefaultAlgorithm());
-      trustManagerFactory.init(trustStore);
-      TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
-
-      SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(new 
TrustSelfSignedStrategy()).build();
-      sslContext.init(keyManagers, trustManagers, new SecureRandom());
-      return sslContext;
-    } catch (UnrecoverableKeyException | NoSuchAlgorithmException | 
KeyStoreException | KeyManagementException e) {
-      e.printStackTrace();
-    }
-    return null;
-  }
-}
diff --git 
a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/HttpTransportImplTest.java
 
b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/HttpTransportImplTest.java
index e7fe921..b71aae8 100644
--- 
a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/HttpTransportImplTest.java
+++ 
b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/HttpTransportImplTest.java
@@ -50,8 +50,7 @@ public class HttpTransportImplTest {
 
     when(httpClient.execute(Mockito.any())).thenReturn(httpResponse);
 
-    HttpTransportImpl httpTransport = new HttpTransportImpl();
-    httpTransport.setHttpClient(httpClient);
+    HttpTransportImpl httpTransport = new HttpTransportImpl(httpClient);
     Map<String, String> extraHeaders = new HashMap<>();
     extraHeaders.put("test", "testContext");
     httpTransport.addHeaders(extraHeaders);
diff --git 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/AbstractTask.java
 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/AbstractTask.java
index 592db3c..a8ead0c 100644
--- 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/AbstractTask.java
+++ 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/AbstractTask.java
@@ -82,4 +82,8 @@ public class AbstractTask {
       LOGGER.error("execute task rejected {}", task.getClass().getName(), e);
     }
   }
+
+  public void stop() {
+    this.taskPool.shutdownNow();
+  }
 }
diff --git 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/AddressManager.java
 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/AddressManager.java
new file mode 100644
index 0000000..01f26f6
--- /dev/null
+++ 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/AddressManager.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.servicecomb.service.center.client;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.apache.servicecomb.http.client.common.HttpUtils;
+
+public class AddressManager {
+  private final String projectName;
+
+  private final List<String> addresses;
+
+  private int index;
+
+  public AddressManager(String projectName, List<String> addresses) {
+    this.projectName = projectName;
+    this.addresses = new ArrayList<>(addresses.size());
+    addresses.forEach((address -> this.addresses.add(formatAddress(address))));
+    this.index = new Random().nextInt(addresses.size());
+  }
+
+  private String formatAddress(String address) {
+    try {
+      return address + "/v4/" + HttpUtils.encodeURLParam(this.projectName);
+    } catch (Exception e) {
+      throw new IllegalStateException("not possible");
+    }
+  }
+
+  public String nextAddress() {
+    synchronized (this) {
+      this.index++;
+      if (this.index >= addresses.size()) {
+        this.index = 0;
+      }
+    }
+    return address();
+  }
+
+  public String address() {
+    synchronized (this) {
+      return addresses.get(index);
+    }
+  }
+}
diff --git 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
index 5c168f1..5fe6a4f 100755
--- 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
+++ 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
@@ -26,12 +26,11 @@ import java.util.Map;
 
 import org.apache.http.HttpStatus;
 import org.apache.http.client.utils.URIBuilder;
+import 
org.apache.servicecomb.http.client.common.HttpConfiguration.SSLProperties;
 import org.apache.servicecomb.http.client.common.HttpResponse;
 import org.apache.servicecomb.http.client.common.HttpTransport;
 import org.apache.servicecomb.http.client.common.HttpTransportFactory;
 import org.apache.servicecomb.http.client.common.HttpUtils;
-import org.apache.servicecomb.http.client.common.TLSConfig;
-import org.apache.servicecomb.http.client.common.TLSHttpsTransport;
 import 
org.apache.servicecomb.service.center.client.exception.OperationException;
 import 
org.apache.servicecomb.service.center.client.model.CreateMicroserviceInstanceRequest;
 import 
org.apache.servicecomb.service.center.client.model.CreateMicroserviceRequest;
@@ -60,76 +59,21 @@ public class ServiceCenterClient implements 
ServiceCenterOperation {
 
   private ServiceCenterRawClient httpClient;
 
-  /**
-   * Use default config parameter
-   */
-  public ServiceCenterClient() {
-    this(new ServiceCenterRawClient());
-  }
-
-  /**
-   * Add TLS config of client
-   * @param tlsConfig
-   */
-  public ServiceCenterClient(TLSConfig tlsConfig) {
-    this(tlsConfig, null);
+  public ServiceCenterClient(ServiceCenterRawClient httpClient) {
+    this.httpClient = httpClient;
   }
 
-  /**
-   * Add extraGlobalHeaders to http request
-   * @param extraGlobalHeaders
-   */
-  public ServiceCenterClient(Map<String, String> extraGlobalHeaders) {
-    this(null, 0, null, null, null, extraGlobalHeaders);
-  }
-
-  /**
-   * Add TLS config and extraGlobalHeaders
-   * @param tlsConfig
-   * @param extraGlobalHeaders
-   */
-  public ServiceCenterClient(TLSConfig tlsConfig, Map<String, String> 
extraGlobalHeaders) {
-    this(null, 0, null, null, tlsConfig, extraGlobalHeaders);
-  }
-
-  /**
-   * Customized host,port,
-   * @param host
-   * @param port
-   */
-  public ServiceCenterClient(String host, int port) {
-    this(host, port, null, null, null, null);
-  }
-
-  /**
-   * Customized host, port, projectName, tenantName, TLSConf, headers and any 
one parameter can be null.
-   * @param host
-   * @param port
-   * @param projectName
-   * @param tenantName
-   * @param tlsConfig
-   * @param extraGlobalHeaders
-   */
-  public ServiceCenterClient(String host, int port, String projectName, String 
tenantName, TLSConfig tlsConfig,
+  public ServiceCenterClient(AddressManager addressManager, SSLProperties 
sslProperties, String tenantName,
       Map<String, String> extraGlobalHeaders) {
-    HttpTransport httpTransport = 
HttpTransportFactory.getDefaultHttpTransport();
-    if (tlsConfig != null) {
-      httpTransport = new TLSHttpsTransport(tlsConfig);
-    }
+    HttpTransport httpTransport = 
HttpTransportFactory.createHttpTransport(sslProperties);
     httpTransport.addHeaders(extraGlobalHeaders);
 
     this.httpClient = new ServiceCenterRawClient.Builder()
-        .setHost(host)
-        .setPort(port)
-        .setProjectName(projectName)
         .setTenantName(tenantName)
+        .setAddressManager(addressManager)
         .setHttpTransport(httpTransport).build();
   }
 
-  public ServiceCenterClient(ServiceCenterRawClient serviceCenterRawClient) {
-    this.httpClient = serviceCenterRawClient;
-  }
-
   @Override
   public MicroserviceInstancesResponse getServiceCenterInstances() {
     try {
@@ -216,7 +160,6 @@ public class ServiceCenterClient implements 
ServiceCenterOperation {
   }
 
   @Override
-  @SuppressWarnings("unchecked")
   public Microservice getMicroserviceByServiceId(String serviceId) {
     try {
       HttpResponse response = 
httpClient.getHttpRequest("/registry/microservices/" + serviceId, null, null);
diff --git 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterConfiguration.java
 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterConfiguration.java
new file mode 100644
index 0000000..ae420e2
--- /dev/null
+++ 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterConfiguration.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.servicecomb.service.center.client;
+
+public interface ServiceCenterConfiguration {
+  class AddressProperties {
+    private boolean address;
+
+    public boolean isAddress() {
+      return address;
+    }
+
+    public void setAddress(boolean address) {
+      this.address = address;
+    }
+  }
+
+  class AKSKProperties {
+    private boolean enabled;
+
+    private String accessKey;
+
+    private String secretKey;
+
+    private String cipher;
+
+    private String project;
+
+    public boolean isEnabled() {
+      return enabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+      this.enabled = enabled;
+    }
+
+    public String getAccessKey() {
+      return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+      this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+      return secretKey;
+    }
+
+    public void setSecretKey(String secretKey) {
+      this.secretKey = secretKey;
+    }
+
+    public String getCipher() {
+      return cipher;
+    }
+
+    public void setCipher(String cipher) {
+      this.cipher = cipher;
+    }
+
+    public String getProject() {
+      return project;
+    }
+
+    public void setProject(String project) {
+      this.project = project;
+    }
+  }
+}
diff --git 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
index bf1f779..60c45d1 100644
--- 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
+++ 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
@@ -114,6 +114,17 @@ public class ServiceCenterDiscovery extends AbstractTask {
               .findMicroserviceInstance(myself.getServiceId(), k.appId, 
k.serviceName, ALL_VERSION, v.revision);
           if (instancesResponse.isModified()) {
             // java chassis 实现了空实例保护,这里暂时不实现。
+            LOGGER.info("Instance changed event, "
+                    + "current: revision={}, instances={}; "
+                    + "origin: revision={}, instances={}; "
+                    + "appId={}, serviceName={}",
+                instancesResponse.getRevision(),
+                
instanceToString(instancesResponse.getMicroserviceInstancesResponse().getInstances()),
+                v.revision,
+                instanceToString(v.instancesCache),
+                k.appId,
+                k.serviceName
+            );
             v.instancesCache = 
instancesResponse.getMicroserviceInstancesResponse().getInstances();
             v.revision = instancesResponse.getRevision();
             eventBus.post(new InstanceChangedEvent(k.appId, k.serviceName,
@@ -126,5 +137,21 @@ public class ServiceCenterDiscovery extends AbstractTask {
 
       startTask(new BackOffSleepTask(POLL_INTERVAL, new PullInstanceTask()));
     }
+
+    private String instanceToString(List<MicroserviceInstance> instances) {
+      if (instances == null) {
+        return "";
+      }
+
+      StringBuilder sb = new StringBuilder();
+      for (MicroserviceInstance instance : instances) {
+        for (String endpoint : instance.getEndpoints()) {
+          sb.append(endpoint.length() > 20 ? endpoint.substring(0, 20) : 
endpoint);
+          sb.append("|");
+        }
+      }
+      sb.append("#");
+      return sb.toString();
+    }
   }
 }
diff --git 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java
 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java
index fc30c93..d7748ee 100755
--- 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java
+++ 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java
@@ -24,64 +24,25 @@ import java.util.Map;
 import org.apache.servicecomb.http.client.common.HttpRequest;
 import org.apache.servicecomb.http.client.common.HttpResponse;
 import org.apache.servicecomb.http.client.common.HttpTransport;
-import org.apache.servicecomb.http.client.common.HttpTransportFactory;
-import org.apache.servicecomb.http.client.common.TLSConfig;
-import org.apache.servicecomb.http.client.common.TLSHttpsTransport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-/**
- * Created by   on 2019/10/16.
- */
 public class ServiceCenterRawClient {
-
-  private static final String DEFAULT_HOST = "localhost";
-
-  private static final int DEFAULT_PORT = 30100;
-
-  private static final String PROJECT_NAME = "default";
-
-  private static final String V4_PREFIX = "v4";
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(ServiceCenterRawClient.class);
 
   private static final String HEADER_TENANT_NAME = "x-domain-name";
 
-  private static final String DEFAULT_HEADER_TENANT_NAME = "default";
-
-  private String basePath;
-
-  private String host;
-
-  private int port;
-
-  private String projectName;
-
   private String tenantName;
 
   private HttpTransport httpTransport;
 
-  public ServiceCenterRawClient() {
-    this(DEFAULT_HOST, DEFAULT_PORT, PROJECT_NAME, 
HttpTransportFactory.getDefaultHttpTransport(),
-        DEFAULT_HEADER_TENANT_NAME);
-  }
+  private AddressManager addressManager;
 
-  private ServiceCenterRawClient(String host, int port, String projectName, 
HttpTransport httpTransport,
-      String tenantName) {
-    this.host = host;
-    this.port = port;
-    this.projectName = projectName;
+  private ServiceCenterRawClient(String tenantName, HttpTransport 
httpTransport,
+      AddressManager addressManager) {
     this.httpTransport = httpTransport;
     this.tenantName = tenantName;
-
-    // check that host has scheme or not
-    String hostLowercase = host.toLowerCase();
-    if (!hostLowercase.startsWith("https://";) && 
!hostLowercase.startsWith("http://";)) {
-      // no protocol in host, use default 'http'
-      if (httpTransport instanceof TLSHttpsTransport) {
-        host = "https://"; + host;
-      } else {
-        host = "http://"; + host;
-      }
-    }
-
-    this.basePath = host + ":" + port + "/" + V4_PREFIX + "/" + projectName;
+    this.addressManager = addressManager;
   }
 
   public HttpResponse getHttpRequest(String url, Map<String, String> headers, 
String content) throws IOException {
@@ -106,88 +67,51 @@ public class ServiceCenterRawClient {
       headers = new HashMap<>();
     }
     headers.put(HEADER_TENANT_NAME, tenantName);
-    HttpRequest httpRequest = new HttpRequest(basePath + url, headers, 
content, method);
-    return httpTransport.doRequest(httpRequest);
+    HttpRequest httpRequest = new HttpRequest(addressManager.address() + url, 
headers, content, method);
+
+    try {
+      return httpTransport.doRequest(httpRequest);
+    } catch (IOException e) {
+      LOGGER.warn("send request to {} failed and retry to {} once. ", 
addressManager.address(),
+          addressManager.nextAddress(), e);
+      httpRequest = new HttpRequest(addressManager.address() + url, headers, 
content, method);
+      try {
+        return httpTransport.doRequest(httpRequest);
+      } catch (IOException ioException) {
+        LOGGER.warn("retry to {} failed again, and change next address {}. ", 
addressManager.address()
+            , addressManager.nextAddress());
+        throw ioException;
+      }
+    }
   }
 
   public static class Builder {
-    private String host;
-
-    private int port;
-
-    private String projectName;
-
     private String tenantName;
 
-    private HttpTransport httpTransport = 
HttpTransportFactory.getDefaultHttpTransport();
-
-    public Builder() {
-      this.host = DEFAULT_HOST;
-      this.port = DEFAULT_PORT;
-      this.projectName = PROJECT_NAME;
-      this.tenantName = DEFAULT_HEADER_TENANT_NAME;
-    }
-
-    public String getProjectName() {
-      return projectName;
-    }
-
-    public Builder setProjectName(String projectName) {
-      if (projectName == null) {
-        projectName = PROJECT_NAME;
-      }
-      this.projectName = projectName;
-      return this;
-    }
-
-    public int getPort() {
-      return port;
-    }
+    private HttpTransport httpTransport;
 
-    public Builder setPort(int port) {
-      if (port <= 0) {
-        port = DEFAULT_PORT;
-      }
-      this.port = port;
-      return this;
-    }
+    private AddressManager addressManager;
 
-    public String getHost() {
-      return host;
+    public Builder() {
     }
 
-    public Builder setHost(String host) {
-      if (host == null) {
-        host = DEFAULT_HOST;
-      }
-      this.host = host;
+    public Builder setTenantName(String tenantName) {
+      this.tenantName = tenantName;
       return this;
     }
 
-    public HttpTransport getHttpTransport() {
-      return httpTransport;
-    }
-
     public Builder setHttpTransport(HttpTransport httpTransport) {
       this.httpTransport = httpTransport;
       return this;
     }
 
-    public Builder setTLSConf(TLSConfig tlsConfig) {
-      this.httpTransport = new TLSHttpsTransport(tlsConfig);
-      return this;
-    }
-
-    public Builder setTenantName(String tenantName) {
-      if (tenantName == null) {
-        tenantName = DEFAULT_HEADER_TENANT_NAME;
-      }
-      this.tenantName = tenantName;
+    public Builder setAddressManager(AddressManager addressManager) {
+      this.addressManager = addressManager;
       return this;
     }
 
     public ServiceCenterRawClient build() {
-      return new ServiceCenterRawClient(host, port, projectName, 
httpTransport, tenantName);
+      return new ServiceCenterRawClient(tenantName, httpTransport, 
addressManager);
     }
   }
 }
diff --git 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/Microservice.java
 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/Microservice.java
index 54a183c..9d69bfd 100755
--- 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/Microservice.java
+++ 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/Microservice.java
@@ -22,9 +22,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import com.fasterxml.jackson.annotation.JsonRootName;
-
-@JsonRootName("service")
 public class Microservice {
 
   private String serviceId;
diff --git 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/MicroserviceInstance.java
 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/MicroserviceInstance.java
index 3fd4c29..f2f7ab0 100755
--- 
a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/MicroserviceInstance.java
+++ 
b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/model/MicroserviceInstance.java
@@ -22,9 +22,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import com.fasterxml.jackson.annotation.JsonRootName;
-
-@JsonRootName("instance")
 public class MicroserviceInstance {
   // even disconnected from service center
   // instanceId will not be changed
diff --git 
a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java
 
b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java
index d843638..f7a3f7b 100755
--- 
a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java
+++ 
b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.service.center.client;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 import org.apache.servicecomb.http.client.common.HttpResponse;
 import org.apache.servicecomb.http.client.common.HttpTransport;
@@ -43,11 +44,10 @@ public class ServiceCenterRawClientTest {
 
     HttpTransport httpTransport = Mockito.mock(HttpTransport.class);
 
+    AddressManager addressManager = new AddressManager(PROJECT_NAME, 
Arrays.asList("http://127.0.0.1:30100";));
     ServiceCenterRawClient client = new ServiceCenterRawClient.Builder()
         .setHttpTransport(httpTransport)
-        .setHost(DEFAULT_HOST)
-        .setPort(DEFAULT_PORT)
-        .setProjectName(PROJECT_NAME)
+        .setAddressManager(addressManager)
         .setTenantName(TENANT_NAME)
         .build();
 
diff --git 
a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java
 
b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java
index 3cddf22..cbcb675 100644
--- 
a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java
+++ 
b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.demo.multiServiceCenterClient;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -25,6 +26,8 @@ import java.util.concurrent.TimeUnit;
 import org.apache.servicecomb.demo.CategorizedTestCase;
 import org.apache.servicecomb.demo.TestMgr;
 import org.apache.servicecomb.foundation.common.event.SimpleEventBus;
+import 
org.apache.servicecomb.http.client.common.HttpConfiguration.SSLProperties;
+import org.apache.servicecomb.service.center.client.AddressManager;
 import 
org.apache.servicecomb.service.center.client.DiscoveryEvents.InstanceChangedEvent;
 import org.apache.servicecomb.service.center.client.RegistrationEvents;
 import 
org.apache.servicecomb.service.center.client.RegistrationEvents.HeartBeatEvent;
@@ -59,7 +62,10 @@ public class RegistryClientTest implements 
CategorizedTestCase {
 
   @Override
   public void testRestTransport() throws Exception {
-    ServiceCenterClient serviceCenterClient = new 
ServiceCenterClient("127.0.0.1", 30100);
+    AddressManager addressManager = new AddressManager("default", 
Arrays.asList("http://127.0.0.1:30100";));
+    SSLProperties sslProperties = new SSLProperties();
+    sslProperties.setEnabled(false);
+    ServiceCenterClient serviceCenterClient = new 
ServiceCenterClient(addressManager, sslProperties, "default", null);
     EventBus eventBus = new SimpleEventBus();
     ServiceCenterRegistration serviceCenterRegistration = new 
ServiceCenterRegistration(serviceCenterClient, eventBus);
     Microservice microservice = new Microservice();
@@ -125,6 +131,9 @@ public class RegistryClientTest implements 
CategorizedTestCase {
     discoveryCounter.await(30000, TimeUnit.MILLISECONDS);
     TestMgr.check(instances != null, true);
     TestMgr.check(instances.size(), 1);
+    discovery.stop();
+    serviceCenterRegistration.stop();
+    
serviceCenterClient.deleteMicroserviceInstance(microservice.getServiceId(), 
microserviceInstance.getInstanceId());
   }
 
   @Subscribe

Reply via email to