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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2ec1cc016 [#4678] optimized sc/kie/config-center isolation address 
check logic (#4680)
2ec1cc016 is described below

commit 2ec1cc016eaf1ee095782ea90e2b75a3fbffa944
Author: Alex <[email protected]>
AuthorDate: Sat Jan 18 15:14:05 2025 +0800

    [#4678] optimized sc/kie/config-center isolation address check logic (#4680)
---
 .../config/center/client/ConfigCenterClient.java   | 24 ++-----
 .../config/center/client/ConfigCenterManager.java  |  2 +-
 .../center/client/ConfigCenterOperation.java       |  3 +-
 .../servicecomb/config/kie/client/KieClient.java   | 18 ++---
 .../config/kie/client/KieConfigManager.java        | 10 +--
 .../config/kie/client/KieConfigOperation.java      |  3 +-
 .../http/client/common/AbstractAddressManager.java |  6 +-
 .../utils/ServiceCombServiceAvailableUtils.java    | 80 ++++++++++++++++++++++
 .../client/common/AbstractAddressManagerTest.java  |  4 +-
 .../service/center/client/ServiceCenterClient.java |  2 +-
 .../center/client/ServiceCenterRawClient.java      | 15 ++--
 11 files changed, 106 insertions(+), 61 deletions(-)

diff --git 
a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java
 
b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java
index 4232c3db5..00889cbf6 100644
--- 
a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java
+++ 
b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java
@@ -30,6 +30,7 @@ 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.HttpUtils;
+import 
org.apache.servicecomb.http.client.utils.ServiceCombServiceAvailableUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,6 +50,8 @@ public class ConfigCenterClient implements 
ConfigCenterOperation {
 
   public static final String DARK_LAUNCH = "darklaunch@";
 
+  private static final String ADDRESS_CHECK_PATH = 
"/v3/default/configuration/health?mode=readiness";
+
   private final HttpTransport httpTransport;
 
   private final ConfigCenterAddressManager addressManager;
@@ -133,25 +136,8 @@ public class ConfigCenterClient implements 
ConfigCenterOperation {
   }
 
   @Override
-  public void checkAddressAvailable(QueryConfigurationsRequest request, String 
address) {
-    String dimensionsInfo = buildDimensionsInfo(request, true);
-    try {
-      String uri = address + "/configuration/items?dimensionsInfo="
-          + HttpUtils.encodeURLParam(dimensionsInfo) + "&revision=" + 
request.getRevision();
-
-      Map<String, String> headers = new HashMap<>();
-      headers.put("x-environment", request.getEnvironment());
-      HttpRequest httpRequest = new HttpRequest(uri, headers, null,
-          HttpRequest.GET);
-
-      HttpResponse httpResponse = httpTransport.doRequest(httpRequest);
-      if (httpResponse.getStatusCode() == HttpStatus.SC_NOT_MODIFIED
-          || httpResponse.getStatusCode() == HttpStatus.SC_OK) {
-        addressManager.recoverIsolatedAddress(address);
-      }
-    } catch (Exception e) {
-      LOGGER.error("check config center isolation address {} available 
error!", address);
-    }
+  public void checkAddressAvailable(String address) {
+    ServiceCombServiceAvailableUtils.checkAddressAvailable(addressManager, 
address, httpTransport, ADDRESS_CHECK_PATH);
   }
 
   private String buildDimensionsInfo(QueryConfigurationsRequest request, 
boolean withVersion) {
diff --git 
a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java
 
b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java
index 66ee21621..6dadab7b1 100644
--- 
a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java
+++ 
b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java
@@ -105,7 +105,7 @@ public class ConfigCenterManager extends AbstractTask {
         return;
       }
       for (String address : isolationAddresses) {
-        configCenterClient.checkAddressAvailable(queryConfigurationsRequest, 
address);
+        configCenterClient.checkAddressAvailable(address);
       }
     }
   }
diff --git 
a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterOperation.java
 
b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterOperation.java
index 43b30c748..919e9f30c 100644
--- 
a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterOperation.java
+++ 
b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterOperation.java
@@ -34,8 +34,7 @@ public interface ConfigCenterOperation {
   /**
    * Check config center isolation address available
    *
-   * @param request queryConfigurationsRequest
    * @param address isolation address
    */
-  void checkAddressAvailable(QueryConfigurationsRequest request, String 
address);
+  void checkAddressAvailable(String address);
 }
diff --git 
a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
 
b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
index b44ed0b1a..49f81989a 100644
--- 
a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
+++ 
b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
@@ -19,7 +19,6 @@ package org.apache.servicecomb.config.kie.client;
 
 import com.google.common.eventbus.EventBus;
 
-import java.io.IOException;
 import java.io.StringReader;
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
@@ -45,6 +44,7 @@ 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.HttpUtils;
+import 
org.apache.servicecomb.http.client.utils.ServiceCombServiceAvailableUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
@@ -54,6 +54,8 @@ public class KieClient implements KieConfigOperation {
 
   private static final Logger LOGGER = 
LoggerFactory.getLogger(KieClient.class);
 
+  private static final String ADDRESS_CHECK_PATH = "/v1/health";
+
   protected HttpTransport httpTransport;
 
   protected String revision = "0";
@@ -115,18 +117,8 @@ public class KieClient implements KieConfigOperation {
   }
 
   @Override
-  public void checkAddressAvailable(ConfigurationsRequest request, String 
address) {
-    String url = buildUrl(request, address);
-    HttpRequest httpRequest = new HttpRequest(url, null, null, 
HttpRequest.GET);
-    try {
-      HttpResponse httpResponse = httpTransport.doRequest(httpRequest);
-      if (httpResponse.getStatusCode() == HttpStatus.SC_NOT_MODIFIED
-          || httpResponse.getStatusCode() == HttpStatus.SC_OK) {
-        addressManager.recoverIsolatedAddress(address);
-      }
-    } catch (IOException e) {
-      LOGGER.error("check kie config isolation address {} available error!", 
address);
-    }
+  public void checkAddressAvailable(String address) {
+    ServiceCombServiceAvailableUtils.checkAddressAvailable(addressManager, 
address, httpTransport, ADDRESS_CHECK_PATH);
   }
 
   private String buildUrl(ConfigurationsRequest request, String 
currentAddress) {
diff --git 
a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java
 
b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java
index d6ed9ca0e..c2222a6a1 100644
--- 
a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java
+++ 
b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java
@@ -124,7 +124,7 @@ public class KieConfigManager extends AbstractTask {
   public void startConfigKieManager() {
     this.configurationsRequests.forEach((t) ->
         this.startTask(new PollConfigurationTask(0, t)));
-    schedulerCheckAddressAvailable("kie-addr-check", new 
CheckKieAddressTask(configurationsRequests.get(0)),
+    schedulerCheckAddressAvailable("kie-addr-check", new CheckKieAddressTask(),
         kieConfiguration.getRefreshIntervalInMillis());
   }
 
@@ -164,12 +164,6 @@ public class KieConfigManager extends AbstractTask {
   }
 
   class CheckKieAddressTask implements Runnable {
-    ConfigurationsRequest configurationsRequest;
-
-    public CheckKieAddressTask(ConfigurationsRequest configurationsRequest) {
-      this.configurationsRequest = configurationsRequest;
-    }
-
     @Override
     public void run() {
       List<String> isolationAddresses = 
kieAddressManager.getIsolationAddresses();
@@ -177,7 +171,7 @@ public class KieConfigManager extends AbstractTask {
         return;
       }
       for (String address : isolationAddresses) {
-        configKieClient.checkAddressAvailable(this.configurationsRequest, 
address);
+        configKieClient.checkAddressAvailable(address);
       }
     }
   }
diff --git 
a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigOperation.java
 
b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigOperation.java
index 44f66137f..135ad0c22 100644
--- 
a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigOperation.java
+++ 
b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigOperation.java
@@ -35,8 +35,7 @@ public interface KieConfigOperation {
   /**
    * Check kie isolation address available
    *
-   * @param configurationsRequest configurationsRequest
    * @param address isolation address
    */
-  void checkAddressAvailable(ConfigurationsRequest configurationsRequest, 
String address);
+  void checkAddressAvailable(String address);
 }
diff --git 
a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java
 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java
index 5c4bc71dc..ae94e5d5f 100644
--- 
a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java
+++ 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java
@@ -194,8 +194,8 @@ public class AbstractAddressManager {
     return results;
   }
 
-  public void recoverIsolatedAddress(String address) {
-    recordSuccessState(address);
+  public void recordSuccessState(String address) {
+    resetFailureStatus(address);
     if (addressAutoRefreshed) {
       if (isolationZoneAddress.remove(address)) {
         LOGGER.warn("restore same region address [{}]", address);
@@ -217,7 +217,7 @@ public class AbstractAddressManager {
     }
   }
 
-  public void recordSuccessState(String address) {
+  public void resetFailureStatus(String address) {
     addressFailureStatus.put(address, 0);
   }
 
diff --git 
a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/utils/ServiceCombServiceAvailableUtils.java
 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/utils/ServiceCombServiceAvailableUtils.java
new file mode 100644
index 000000000..9139e65f9
--- /dev/null
+++ 
b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/utils/ServiceCombServiceAvailableUtils.java
@@ -0,0 +1,80 @@
+/*
+ * 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.utils;
+
+import org.apache.http.HttpStatus;
+import org.apache.servicecomb.http.client.common.AbstractAddressManager;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+public class ServiceCombServiceAvailableUtils {
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(ServiceCombServiceAvailableUtils.class);
+
+  public static void checkAddressAvailable(AbstractAddressManager 
addressManager, String address,
+      HttpTransport httpTransport, String path) {
+    String formatUrl = addressManager.formatUrl(path, true, address);
+    HttpRequest httpRequest = new HttpRequest(formatUrl, null, null, 
HttpRequest.GET);
+    try {
+      HttpResponse response = httpTransport.doRequest(httpRequest);
+      if (response.getStatusCode() == HttpStatus.SC_OK) {
+        addressManager.recordSuccessState(address);
+        return;
+      }
+
+      // old server does not provide the check api, using TCP checks whether 
the server is ready.
+      if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND && 
telnetCheckAddress(address)) {
+        LOGGER.warn("[{}] path does not provide, tcp check address ready!", 
path);
+        addressManager.recordSuccessState(address);
+      }
+    } catch (IOException e) {
+      LOGGER.error("check isolation address [{}] available error!", address);
+    }
+  }
+
+  private static boolean telnetCheckAddress(String address) {
+    URI ipPort = parseIpPortFromURI(address);
+    if (ipPort == null) {
+      return false;
+    }
+    try (Socket s = new Socket()) {
+      s.connect(new InetSocketAddress(ipPort.getHost(), ipPort.getPort()), 
3000);
+      return true;
+    } catch (IOException e) {
+      LOGGER.warn("ping endpoint {} failed, It will be quarantined again.", 
address);
+    }
+    return false;
+  }
+
+  private static URI parseIpPortFromURI(String address) {
+    try {
+      return new URI(address);
+    } catch (URISyntaxException e) {
+      LOGGER.error("build uri error with address [{}].", address);
+      return null;
+    }
+  }
+}
diff --git 
a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java
 
b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java
index 83406ec74..b831d0324 100644
--- 
a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java
+++ 
b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java
@@ -101,7 +101,7 @@ public class AbstractAddressManagerTest {
     Assertions.assertEquals("http://127.0.0.3:30100";, 
addressManager.address());
 
     // test fail 2 times ,it will not be isolated
-    addressManager.recordSuccessState(address);
+    addressManager.resetFailureStatus(address);
     Assertions.assertEquals("http://127.0.0.3:30100";, 
addressManager.address());
 
     // test recodeStatus times
@@ -115,7 +115,7 @@ public class AbstractAddressManagerTest {
     Assertions.assertEquals("http://127.0.0.4:30100";, 
addressManager.address());
 
     // test restore isolation
-    addressManager.recoverIsolatedAddress("http://127.0.0.3:30100";);
+    addressManager.recordSuccessState("http://127.0.0.3:30100";);
     Assertions.assertEquals("http://127.0.0.3:30100";, 
addressManager.address());
     Assertions.assertEquals("http://127.0.0.3:30100";, 
addressManager.address());
   }
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 a238d118d..446f97493 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
@@ -562,7 +562,7 @@ public class ServiceCenterClient implements 
ServiceCenterOperation {
       return;
     }
     for (String address : isolationAddresses) {
-      httpClient.checkAddressAvailable("/registry/microservices", null, null, 
address);
+      httpClient.checkAddressAvailable(address);
     }
   }
 }
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 e95240bb3..a8dc9963b 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,6 +24,7 @@ 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.utils.ServiceCombServiceAvailableUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,6 +33,8 @@ public class ServiceCenterRawClient {
 
   private static final String HEADER_TENANT_NAME = "x-domain-name";
 
+  private static final String ADDRESS_CHECK_PATH = 
"/v4/default/registry/health/readiness";
+
   private final String tenantName;
 
   private final HttpTransport httpTransport;
@@ -93,16 +96,8 @@ public class ServiceCenterRawClient {
     }
   }
 
-  public void checkAddressAvailable(String url, Map<String, String> headers, 
String content,
-      String address) {
-    String formatUrl = addressManager.formatUrl(url, false, address);
-    HttpRequest httpRequest = buildHttpRequest(formatUrl, headers, content, 
HttpRequest.GET);
-    try {
-      httpTransport.doRequest(httpRequest);
-      addressManager.recoverIsolatedAddress(address);
-    } catch (IOException e) {
-      LOGGER.error("check service center isolation address {} available 
error!", address);
-    }
+  public void checkAddressAvailable(String address) {
+    ServiceCombServiceAvailableUtils.checkAddressAvailable(addressManager, 
address, httpTransport, ADDRESS_CHECK_PATH);
   }
 
   private HttpRequest buildHttpRequest(String url, Map<String, String> 
headers, String content, String method) {

Reply via email to