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:14:55 UTC

[servicecomb-java-chassis] 06/19: [SCB-1691] add RestClientUtil for multiple ServiceRegistryClient instance situation

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 096a43b6a6412caf5836ecdb88fb2caf1c1e5c73
Author: yhs0092 <yh...@163.com>
AuthorDate: Wed Jan 15 09:22:59 2020 +0800

    [SCB-1691] add RestClientUtil for multiple ServiceRegistryClient instance situation
    
    the legacy RestUtils is preserved for compatibility and marked deprecated
---
 .../http/{RestUtils.java => RestClientUtil.java}   | 51 +++++++++++++---------
 .../serviceregistry/client/http/RestUtils.java     |  5 +++
 .../config/ServiceRegistryConfig.java              | 14 ++++++
 .../config/ServiceRegistryConfigBuilder.java       |  9 +++-
 4 files changed, 57 insertions(+), 22 deletions(-)

diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RestUtils.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RestClientUtil.java
similarity index 81%
copy from service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RestUtils.java
copy to service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RestClientUtil.java
index 42d1e03..568ab57 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RestUtils.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RestClientUtil.java
@@ -22,8 +22,8 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.UnknownHostException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
-import java.util.ServiceLoader;
 
 import org.apache.servicecomb.foundation.auth.AuthHeaderProvider;
 import org.apache.servicecomb.foundation.auth.SignRequest;
@@ -40,8 +40,8 @@ import io.vertx.core.http.CaseInsensitiveHeaders;
 import io.vertx.core.http.HttpClientRequest;
 import io.vertx.core.http.HttpMethod;
 
-final class RestUtils {
-  private static final Logger LOGGER = LoggerFactory.getLogger(RestUtils.class);
+final class RestClientUtil {
+  private static final Logger LOGGER = LoggerFactory.getLogger(RestClientUtil.class);
 
   private static final String HEADER_CONTENT_TYPE = "Content-Type";
 
@@ -49,22 +49,31 @@ final class RestUtils {
 
   private static final String HEADER_TENANT_NAME = "x-domain-name";
 
-  private static final ServiceLoader<AuthHeaderProvider> authHeaderProviders =
-      ServiceLoader.load(AuthHeaderProvider.class);
+  private List<AuthHeaderProvider> authHeaderProviders;
 
-  private RestUtils() {
+  private int requestTimeout;
+
+  private String tenantName;
+
+  private HttpClientPool httpClientPool;
+
+  RestClientUtil(ServiceRegistryConfig serviceRegistryConfig) {
+    this.authHeaderProviders = serviceRegistryConfig.getAuthHeaderProviders();
+    this.requestTimeout = serviceRegistryConfig.getRequestTimeout();
+    this.tenantName = serviceRegistryConfig.getTenantName();
+    this.httpClientPool = new HttpClientPool(serviceRegistryConfig);
   }
 
-  public static void httpDo(RequestContext requestContext, Handler<RestResponse> responseHandler) {
+  public void httpDo(RequestContext requestContext, Handler<RestResponse> responseHandler) {
     if (requestContext.getParams().getTimeout() != 0) {
       httpDo(requestContext.getParams().getTimeout(), requestContext, responseHandler);
       return;
     }
-    httpDo(ServiceRegistryConfig.INSTANCE.getRequestTimeout(), requestContext, responseHandler);
+    httpDo(requestTimeout, requestContext, responseHandler);
   }
 
-  public static void httpDo(long timeout, RequestContext requestContext, Handler<RestResponse> responseHandler) {
-    HttpClientWithContext vertxHttpClient = HttpClientPool.INSTANCE.getClient();
+  public void httpDo(long timeout, RequestContext requestContext, Handler<RestResponse> responseHandler) {
+    HttpClientWithContext vertxHttpClient = httpClientPool.getClient();
     vertxHttpClient.runOnContext(httpClient -> {
       IpPort ipPort = requestContext.getIpPort();
       HttpMethod httpMethod = requestContext.getMethod();
@@ -146,7 +155,7 @@ final class RestUtils {
     });
   }
 
-  public static RequestContext createRequestContext(HttpMethod method, IpPort ipPort, String uri,
+  public RequestContext createRequestContext(HttpMethod method, IpPort ipPort, String uri,
       RequestParam requestParam) {
     RequestContext requestContext = new RequestContext();
     requestContext.setMethod(method);
@@ -156,7 +165,7 @@ final class RestUtils {
     return requestContext;
   }
 
-  public static SignRequest createSignRequest(String method, IpPort ipPort, RequestParam requestParam, String url,
+  public SignRequest createSignRequest(String method, IpPort ipPort, RequestParam requestParam, String url,
       Map<String, String> headers) {
     SignRequest signReq = new SignRequest();
     StringBuilder endpoint = new StringBuilder("https://" + ipPort.getHostOrIp());
@@ -176,44 +185,44 @@ final class RestUtils {
     return signReq;
   }
 
-  public static void addDefaultHeaders(HttpClientRequest request) {
+  public void addDefaultHeaders(HttpClientRequest request) {
     request.headers().addAll(getDefaultHeaders());
   }
 
-  private static Map<String, String> defaultHeaders() {
+  private Map<String, String> defaultHeaders() {
     Map<String, String> headers = new HashMap<>();
     headers.put(HEADER_CONTENT_TYPE, "application/json");
     headers.put(HEADER_USER_AGENT, "cse-serviceregistry-client/1.0.0");
-    headers.put(HEADER_TENANT_NAME, ServiceRegistryConfig.INSTANCE.getTenantName());
+    headers.put(HEADER_TENANT_NAME, tenantName);
 
     return headers;
   }
 
-  public static MultiMap getDefaultHeaders() {
+  public MultiMap getDefaultHeaders() {
     return new CaseInsensitiveHeaders().addAll(defaultHeaders());
   }
 
-  public static void get(IpPort ipPort, String uri, RequestParam requestParam,
+  public void get(IpPort ipPort, String uri, RequestParam requestParam,
       Handler<RestResponse> responseHandler) {
     httpDo(createRequestContext(HttpMethod.GET, ipPort, uri, requestParam), responseHandler);
   }
 
-  public static void post(IpPort ipPort, String uri, RequestParam requestParam,
+  public void post(IpPort ipPort, String uri, RequestParam requestParam,
       Handler<RestResponse> responseHandler) {
     httpDo(createRequestContext(HttpMethod.POST, ipPort, uri, requestParam), responseHandler);
   }
 
-  public static void put(IpPort ipPort, String uri, RequestParam requestParam,
+  public void put(IpPort ipPort, String uri, RequestParam requestParam,
       Handler<RestResponse> responseHandler) {
     httpDo(createRequestContext(HttpMethod.PUT, ipPort, uri, requestParam), responseHandler);
   }
 
-  public static void delete(IpPort ipPort, String uri, RequestParam requestParam,
+  public void delete(IpPort ipPort, String uri, RequestParam requestParam,
       Handler<RestResponse> responseHandler) {
     httpDo(createRequestContext(HttpMethod.DELETE, ipPort, uri, requestParam), responseHandler);
   }
 
-  public static Map<String, String> getSignAuthHeaders(SignRequest signReq) {
+  public Map<String, String> getSignAuthHeaders(SignRequest signReq) {
     Map<String, String> headers = new HashMap<>();
     authHeaderProviders.forEach(provider -> headers.putAll(provider.getSignAuthHeaders(signReq)));
     return headers;
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RestUtils.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RestUtils.java
index 42d1e03..b902611 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RestUtils.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/client/http/RestUtils.java
@@ -40,6 +40,11 @@ import io.vertx.core.http.CaseInsensitiveHeaders;
 import io.vertx.core.http.HttpClientRequest;
 import io.vertx.core.http.HttpMethod;
 
+/**
+ * This class is designed following singleton pattern, but it's not suitable for multi sc cluster occasion.
+ * @deprecated consider to use {@link RestClientUtil} instead.
+ */
+@Deprecated
 final class RestUtils {
   private static final Logger LOGGER = LoggerFactory.getLogger(RestUtils.class);
 
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 1596077..d16d485 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
@@ -18,7 +18,9 @@
 package org.apache.servicecomb.serviceregistry.config;
 
 import java.util.ArrayList;
+import java.util.List;
 
+import org.apache.servicecomb.foundation.auth.AuthHeaderProvider;
 import org.apache.servicecomb.foundation.common.net.IpPort;
 import org.apache.servicecomb.serviceregistry.ServiceRegistry;
 
@@ -139,6 +141,8 @@ public final class ServiceRegistryConfig {
 
   private String proxyPasswd;
 
+  private List<AuthHeaderProvider> authHeaderProviders;
+
   /**
    * 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
@@ -412,4 +416,14 @@ public final class ServiceRegistryConfig {
     this.proxyPasswd = proxyPasswd;
     return this;
   }
+
+  public List<AuthHeaderProvider> getAuthHeaderProviders() {
+    return authHeaderProviders;
+  }
+
+  public ServiceRegistryConfig setAuthHeaderProviders(
+      List<AuthHeaderProvider> authHeaderProviders) {
+    this.authHeaderProviders = authHeaderProviders;
+    return this;
+  }
 }
diff --git a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
index 95f2b6c..1651532 100644
--- a/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
+++ b/service-registry/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
@@ -25,8 +25,10 @@ import java.util.Objects;
 import org.apache.servicecomb.config.ConfigUtil;
 import org.apache.servicecomb.deployment.Deployment;
 import org.apache.servicecomb.deployment.DeploymentProvider;
+import org.apache.servicecomb.foundation.auth.AuthHeaderProvider;
 import org.apache.servicecomb.foundation.common.net.IpPort;
 import org.apache.servicecomb.foundation.common.net.NetUtils;
+import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -76,7 +78,8 @@ class ServiceRegistryConfigBuilder {
         .setProxyHost(getProxyHost())
         .setProxyPort(getProxyPort())
         .setProxyUsername(getProxyUsername())
-        .setProxyPasswd(getProxyPasswd());
+        .setProxyPasswd(getProxyPasswd())
+        .setAuthHeaderProviders(getAuthHeaderProviders());
   }
 
   public HttpVersion getHttpVersion() {
@@ -292,6 +295,10 @@ class ServiceRegistryConfigBuilder {
     return getProperty(null, ServiceRegistryConfig.PROXY_PASSWD);
   }
 
+  public List<AuthHeaderProvider> getAuthHeaderProviders() {
+    return SPIServiceUtils.getAllService(AuthHeaderProvider.class);
+  }
+
   private String getProperty(String defaultValue, String... keys) {
     String property = null;
     for (String key : keys) {