You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ya...@apache.org on 2020/03/09 16:15:05 UTC

[servicecomb-java-chassis] 16/19: [SCB-1691] support multiple TLS enabled sc clusters

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

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

commit bbd7702fbee7df950ef43d703f604f4b3fc90140
Author: yhs0092 <yh...@163.com>
AuthorDate: Mon Feb 17 09:19:31 2020 +0800

    [SCB-1691] support multiple TLS enabled sc clusters
    
    - RemoteServiceRegistry create ServiceRegistryClient by the constructor in ServiceRegistryConfig
    - AbstractClientPool accept ServiceRegistryConfig in constructor
    - Allow to specify registry client TLS and proxy config by custom tags
---
 .../client/http/AbstractClientPool.java            | 12 +++++--
 .../client/http/HttpClientPool.java                | 13 +++----
 .../client/http/WebsocketClientPool.java           | 11 +++---
 .../config/ServiceRegistryConfig.java              | 41 ++++++++++++++++++++++
 .../registry/RemoteServiceRegistry.java            |  3 +-
 .../client/http/TestHttpClientPool.java            | 24 ++++++++++---
 .../client/http/TestWebsocketClientPool.java       | 12 +++++--
 7 files changed, 94 insertions(+), 22 deletions(-)

diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/AbstractClientPool.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/AbstractClientPool.java
index 968d858..c709692 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/AbstractClientPool.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/AbstractClientPool.java
@@ -41,17 +41,23 @@ import io.vertx.core.http.HttpClientOptions;
 abstract class AbstractClientPool implements ClientPool {
   private static final Logger LOGGER = LoggerFactory.getLogger(AbstractClientPool.class);
 
+  private ServiceRegistryConfig serviceRegistryConfig;
+
   private HttpClientOptions httpClientOptions;
 
   private ClientPoolManager<HttpClientWithContext> clientMgr;
 
-  AbstractClientPool(HttpClientOptions httpClientOptions) {
-    this.httpClientOptions = httpClientOptions;
+  AbstractClientPool(ServiceRegistryConfig serviceRegistryConfig) {
+    this.serviceRegistryConfig = serviceRegistryConfig;
+    this.httpClientOptions = getHttpClientOptionsFromConfigurations(serviceRegistryConfig);
     create();
   }
 
   protected abstract boolean isWorker();
 
+  protected abstract HttpClientOptions getHttpClientOptionsFromConfigurations(
+      ServiceRegistryConfig serviceRegistryConfig);
+
   public HttpClientWithContext getClient() {
     return this.clientMgr.findThreadBindClientPool();
   }
@@ -64,7 +70,7 @@ abstract class AbstractClientPool implements ClientPool {
 
     // 这里面是同步接口,且好像直接在事件线程中用,保险起见,先使用独立的vertx实例
     VertxOptions vertxOptions = new VertxOptions()
-        .setAddressResolverOptions(AddressResolverConfig.getAddressResover(ServiceRegistryConfig.SSL_KEY))
+        .setAddressResolverOptions(AddressResolverConfig.getAddressResover(serviceRegistryConfig.getSslConfigTag()))
         .setEventLoopPoolSize(property.get());
     Vertx vertx = VertxUtils.getOrCreateVertxByName("registry", vertxOptions);
     clientMgr = new ClientPoolManager<>(vertx, new HttpClientPoolFactory(httpClientOptions));
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/HttpClientPool.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/HttpClientPool.java
index f4d28c8..962a81c 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/HttpClientPool.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/HttpClientPool.java
@@ -27,7 +27,7 @@ import io.vertx.core.http.HttpClientOptions;
 import io.vertx.core.http.HttpVersion;
 import io.vertx.core.net.ProxyOptions;
 
-final class HttpClientPool extends AbstractClientPool {
+class HttpClientPool extends AbstractClientPool {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientPool.class);
 
@@ -37,11 +37,11 @@ final class HttpClientPool extends AbstractClientPool {
   public static final HttpClientPool INSTANCE = new HttpClientPool();
 
   private HttpClientPool() {
-    super(getHttpClientOptionsFromConfigurations(ServiceRegistryConfig.INSTANCE));
+    super(ServiceRegistryConfig.INSTANCE);
   }
 
   HttpClientPool(ServiceRegistryConfig serviceRegistryConfig) {
-    super(getHttpClientOptionsFromConfigurations(serviceRegistryConfig));
+    super(serviceRegistryConfig);
   }
 
   @Override
@@ -49,7 +49,8 @@ final class HttpClientPool extends AbstractClientPool {
     return false;
   }
 
-  static HttpClientOptions getHttpClientOptionsFromConfigurations(ServiceRegistryConfig serviceRegistryConfig) {
+  @Override
+  protected HttpClientOptions getHttpClientOptionsFromConfigurations(ServiceRegistryConfig serviceRegistryConfig) {
     HttpVersion ver = serviceRegistryConfig.getHttpVersion();
     HttpClientOptions httpClientOptions = new HttpClientOptions();
     httpClientOptions.setProtocolVersion(ver);
@@ -61,7 +62,7 @@ final class HttpClientPool extends AbstractClientPool {
       proxy.setPort(serviceRegistryConfig.getProxyPort());
       proxy.setUsername(serviceRegistryConfig.getProxyUsername());
       proxy.setPassword(
-          Encryptions.decode(serviceRegistryConfig.getProxyPasswd(), ServiceRegistryConfig.PROXY_KEY));
+          Encryptions.decode(serviceRegistryConfig.getProxyPasswd(), serviceRegistryConfig.getProxyConfigTag()));
       httpClientOptions.setProxyOptions(proxy);
     }
     if (ver == HttpVersion.HTTP_2) {
@@ -70,7 +71,7 @@ final class HttpClientPool extends AbstractClientPool {
     }
     if (serviceRegistryConfig.isSsl()) {
       LOGGER.debug("service center client performs requests over TLS");
-      VertxTLSBuilder.buildHttpClientOptions(ServiceRegistryConfig.SSL_KEY, httpClientOptions);
+      VertxTLSBuilder.buildHttpClientOptions(serviceRegistryConfig.getSslConfigTag(), httpClientOptions);
     }
     return httpClientOptions;
   }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/WebsocketClientPool.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/WebsocketClientPool.java
index 38c17be..96ab64f 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/WebsocketClientPool.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/WebsocketClientPool.java
@@ -25,7 +25,7 @@ import org.slf4j.LoggerFactory;
 import io.vertx.core.http.HttpClientOptions;
 import io.vertx.core.http.HttpVersion;
 
-public final class WebsocketClientPool extends AbstractClientPool {
+public class WebsocketClientPool extends AbstractClientPool {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(WebsocketClientPool.class);
 
@@ -35,11 +35,11 @@ public final class WebsocketClientPool extends AbstractClientPool {
   public static final WebsocketClientPool INSTANCE = new WebsocketClientPool();
 
   private WebsocketClientPool() {
-    super(getHttpClientOptionsFromConfigurations(ServiceRegistryConfig.INSTANCE));
+    super(ServiceRegistryConfig.INSTANCE);
   }
 
   WebsocketClientPool(ServiceRegistryConfig serviceRegistryConfig) {
-    super(getHttpClientOptionsFromConfigurations(serviceRegistryConfig));
+    super(serviceRegistryConfig);
   }
 
   @Override
@@ -47,7 +47,8 @@ public final class WebsocketClientPool extends AbstractClientPool {
     return true;
   }
 
-  static HttpClientOptions getHttpClientOptionsFromConfigurations(ServiceRegistryConfig serviceRegistryConfig) {
+  @Override
+  protected HttpClientOptions getHttpClientOptionsFromConfigurations(ServiceRegistryConfig serviceRegistryConfig) {
     HttpVersion ver = serviceRegistryConfig.getHttpVersion();
     HttpClientOptions httpClientOptions = new HttpClientOptions();
     httpClientOptions.setProtocolVersion(ver);
@@ -59,7 +60,7 @@ public final class WebsocketClientPool extends AbstractClientPool {
     }
     if (serviceRegistryConfig.isSsl()) {
       LOGGER.debug("service center ws client performs requests over TLS");
-      VertxTLSBuilder.buildHttpClientOptions(ServiceRegistryConfig.SSL_KEY, httpClientOptions);
+      VertxTLSBuilder.buildHttpClientOptions(serviceRegistryConfig.getSslConfigTag(), httpClientOptions);
     }
     return httpClientOptions;
   }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
index d16d485..af1e5d7 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
@@ -19,10 +19,13 @@ package org.apache.servicecomb.serviceregistry.config;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Function;
 
 import org.apache.servicecomb.foundation.auth.AuthHeaderProvider;
 import org.apache.servicecomb.foundation.common.net.IpPort;
 import org.apache.servicecomb.serviceregistry.ServiceRegistry;
+import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
+import org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl;
 
 import io.vertx.core.http.HttpVersion;
 
@@ -141,8 +144,18 @@ public final class ServiceRegistryConfig {
 
   private String proxyPasswd;
 
+  private String sslConfigTag = SSL_KEY;
+
+  private String proxyConfigTag = PROXY_KEY;
+
   private List<AuthHeaderProvider> authHeaderProviders;
 
+  private Function<ServiceRegistry, ServiceRegistryClient> serviceRegistryClientConstructor =
+      serviceRegistry -> new ServiceRegistryClientImpl(this);
+
+  public ServiceRegistryConfig() {
+  }
+
   /**
    * Read the service registry related configurations and build the {@link ServiceRegistryConfig}
    * object. Since most of the service registry configurations are similar, this method may be
@@ -417,6 +430,24 @@ public final class ServiceRegistryConfig {
     return this;
   }
 
+  public String getSslConfigTag() {
+    return sslConfigTag;
+  }
+
+  public ServiceRegistryConfig setSslConfigTag(String sslConfigTag) {
+    this.sslConfigTag = sslConfigTag;
+    return this;
+  }
+
+  public String getProxyConfigTag() {
+    return proxyConfigTag;
+  }
+
+  public ServiceRegistryConfig setProxyConfigTag(String proxyConfigTag) {
+    this.proxyConfigTag = proxyConfigTag;
+    return this;
+  }
+
   public List<AuthHeaderProvider> getAuthHeaderProviders() {
     return authHeaderProviders;
   }
@@ -426,4 +457,14 @@ public final class ServiceRegistryConfig {
     this.authHeaderProviders = authHeaderProviders;
     return this;
   }
+
+  public ServiceRegistryConfig setServiceRegistryClientConstructor(
+      Function<ServiceRegistry, ServiceRegistryClient> serviceRegistryClientConstructor) {
+    this.serviceRegistryClientConstructor = serviceRegistryClientConstructor;
+    return this;
+  }
+
+  public ServiceRegistryClient createServiceRegistryClient(ServiceRegistry serviceRegistry) {
+    return this.serviceRegistryClientConstructor.apply(serviceRegistry);
+  }
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java
index a53e4ac..d68a46e 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/registry/RemoteServiceRegistry.java
@@ -24,7 +24,6 @@ import java.util.concurrent.TimeUnit;
 import org.apache.servicecomb.foundation.common.concurrency.SuppressedRunnableWrapper;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
-import org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl;
 import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig;
 import org.apache.servicecomb.serviceregistry.definition.MicroserviceDefinition;
 import org.slf4j.Logger;
@@ -68,7 +67,7 @@ public class RemoteServiceRegistry extends AbstractServiceRegistry {
 
   @Override
   protected ServiceRegistryClient createServiceRegistryClient() {
-    return new ServiceRegistryClientImpl(serviceRegistryConfig);
+    return serviceRegistryConfig.createServiceRegistryClient(this);
   }
 
   @Override
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestHttpClientPool.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestHttpClientPool.java
index ba74331..4b57d61 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestHttpClientPool.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestHttpClientPool.java
@@ -46,7 +46,11 @@ public class TestHttpClientPool {
     ArchaiusUtils.setProperty(ServiceRegistryConfig.PROXY_USERNAME, "user");
     ArchaiusUtils.setProperty(ServiceRegistryConfig.PROXY_PASSWD, "pass");
 
-    HttpClientOptions httpClientOptions = HttpClientPool.getHttpClientOptionsFromConfigurations(
+    HttpClientOptions httpClientOptions = new HttpClientPool(ServiceRegistryConfig.buildFromConfiguration()) {
+      @Override
+      public void create() {
+      }
+    }.getHttpClientOptionsFromConfigurations(
         ServiceRegistryConfig.buildFromConfiguration());
 
     Assert.assertEquals(
@@ -64,7 +68,11 @@ public class TestHttpClientPool {
   public void createHttpClientOptions_noProxy() {
     ArchaiusUtils.setProperty(ServiceRegistryConfig.PROXY_ENABLE, "false");
 
-    HttpClientOptions httpClientOptions = HttpClientPool.getHttpClientOptionsFromConfigurations(
+    HttpClientOptions httpClientOptions = new HttpClientPool(ServiceRegistryConfig.buildFromConfiguration()) {
+      @Override
+      public void create() {
+      }
+    }.getHttpClientOptionsFromConfigurations(
         ServiceRegistryConfig.buildFromConfiguration());
 
     Assert.assertNull(httpClientOptions.getProxyOptions());
@@ -74,7 +82,11 @@ public class TestHttpClientPool {
   public void createHttpClientOptions_http2() {
     ArchaiusUtils.setProperty("servicecomb.service.registry.client.httpVersion", HttpVersion.HTTP_2.name());
 
-    HttpClientOptions httpClientOptions = HttpClientPool.getHttpClientOptionsFromConfigurations(
+    HttpClientOptions httpClientOptions = new HttpClientPool(ServiceRegistryConfig.buildFromConfiguration()) {
+      @Override
+      public void create() {
+      }
+    }.getHttpClientOptionsFromConfigurations(
         ServiceRegistryConfig.buildFromConfiguration());
 
     Assert.assertEquals(HttpVersion.HTTP_2, httpClientOptions.getProtocolVersion());
@@ -83,7 +95,11 @@ public class TestHttpClientPool {
 
   @Test
   public void createHttpClientOptions_notHttp2() {
-    HttpClientOptions httpClientOptions = HttpClientPool.getHttpClientOptionsFromConfigurations(
+    HttpClientOptions httpClientOptions = new HttpClientPool(ServiceRegistryConfig.buildFromConfiguration()) {
+      @Override
+      public void create() {
+      }
+    }.getHttpClientOptionsFromConfigurations(
         ServiceRegistryConfig.buildFromConfiguration());
 
     Assert.assertEquals(HttpVersion.HTTP_1_1, httpClientOptions.getProtocolVersion());
diff --git a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestWebsocketClientPool.java b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestWebsocketClientPool.java
index 9ac4039..93c0453 100644
--- a/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestWebsocketClientPool.java
+++ b/service-registry/src/test/java/org/apache/servicecomb/serviceregistry/client/http/TestWebsocketClientPool.java
@@ -41,7 +41,11 @@ public class TestWebsocketClientPool {
   public void createHttpClientOptions_http2() {
     ArchaiusUtils.setProperty("servicecomb.service.registry.client.httpVersion", HttpVersion.HTTP_2.name());
 
-    HttpClientOptions httpClientOptions = WebsocketClientPool.getHttpClientOptionsFromConfigurations(
+    HttpClientOptions httpClientOptions = new WebsocketClientPool(ServiceRegistryConfig.buildFromConfiguration()) {
+      @Override
+      public void create() {
+      }
+    }.getHttpClientOptionsFromConfigurations(
         ServiceRegistryConfig.buildFromConfiguration());
 
     Assert.assertEquals(HttpVersion.HTTP_2, httpClientOptions.getProtocolVersion());
@@ -50,7 +54,11 @@ public class TestWebsocketClientPool {
 
   @Test
   public void createHttpClientOptions_notHttp2() {
-    HttpClientOptions httpClientOptions = WebsocketClientPool.getHttpClientOptionsFromConfigurations(
+    HttpClientOptions httpClientOptions = new WebsocketClientPool(ServiceRegistryConfig.buildFromConfiguration()) {
+      @Override
+      public void create() {
+      }
+    }.getHttpClientOptionsFromConfigurations(
         ServiceRegistryConfig.buildFromConfiguration());
 
     Assert.assertEquals(HttpVersion.HTTP_1_1, httpClientOptions.getProtocolVersion());