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
The following commit(s) were added to refs/heads/master by this push:
new a7c0d69 [SCB-2386] Optimiza AZ affinity logic (#2721)
a7c0d69 is described below
commit a7c0d6999ba9a1e3313a38f6f560315a39e837dc
Author: zyl <[email protected]>
AuthorDate: Tue Feb 22 09:30:13 2022 +0800
[SCB-2386] Optimiza AZ affinity logic (#2721)
---
.../config/center/client/AddressManager.java | 4 ++-
.../http/client/common/AbstractAddressManager.java | 19 ++++++--------
.../client/common/AbstractAddressManagerTest.java | 11 +++++++-
.../ConfigCenterConfigurationSourceImplTest.java | 30 +++++++++++++++++++---
.../config/center/client/AddressManagerTest.java | 6 +++--
.../config/ServiceRegistryConfig.java | 11 ++++++++
.../config/ServiceRegistryConfigBuilder.java | 15 ++++++++---
.../serviceregistry/refresh/AddressManager.java | 18 +++++++++++++
.../refresh/ClassificationAddress.java | 8 ++++++
9 files changed, 100 insertions(+), 22 deletions(-)
diff --git
a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/AddressManager.java
b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/AddressManager.java
index b939657..1f4b24c 100644
---
a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/AddressManager.java
+++
b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/AddressManager.java
@@ -20,6 +20,7 @@ package org.apache.servicecomb.config.center.client;
import java.util.List;
import org.apache.servicecomb.http.client.common.AbstractAddressManager;
+import org.apache.servicecomb.http.client.common.URLEndPoint;
import org.apache.servicecomb.http.client.event.RefreshEndpointEvent;
import com.google.common.eventbus.EventBus;
@@ -33,7 +34,8 @@ public class AddressManager extends AbstractAddressManager {
}
@Override
- public String joinProject(String address) {
+ protected String normalizeUri(String endpoint) {
+ String address = new URLEndPoint(endpoint).toString();
return formatAddress(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 f8fb59a..61ee576 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
@@ -90,12 +90,13 @@ public class AbstractAddressManager {
public AbstractAddressManager(List<String> addresses) {
this.addresses.addAll(addresses);
+ this.defaultAddress.addAll(addresses);
}
public AbstractAddressManager(String projectName, List<String> addresses) {
this.projectName = StringUtils.isEmpty(projectName) ? DEFAULT_PROJECT :
projectName;
this.addresses = this.transformAddress(addresses);
- this.defaultAddress = this.addresses;
+ this.defaultAddress.addAll(this.addresses);
}
@VisibleForTesting
@@ -154,7 +155,7 @@ public class AbstractAddressManager {
private String getAvailableZoneAddress() {
List<String> addresses = getAvailableZoneIpPorts();
if (!addresses.isEmpty()) {
- return joinProject(getCurrentAddress(addresses));
+ return getCurrentAddress(addresses);
}
return getInitAddress();
}
@@ -177,10 +178,6 @@ public class AbstractAddressManager {
}
}
- protected String joinProject(String address) {
- return address;
- }
-
private List<String> getAvailableZoneIpPorts() {
List<String> results = new ArrayList<>();
if (!availableZone.isEmpty()) {
@@ -214,11 +211,11 @@ public class AbstractAddressManager {
}
public void recordFailState(String address) {
- if (!recodeStatus.containsKey(address)) {
- recodeStatus.put(address, 1);
- return;
- }
synchronized (lock) {
+ if (!recodeStatus.containsKey(address)) {
+ recodeStatus.put(address, 1);
+ return;
+ }
int number = recodeStatus.get(address) + 1;
if (number < ISOLATION_THRESHOLD) {
recodeStatus.put(address, number);
@@ -251,7 +248,7 @@ public class AbstractAddressManager {
}
}
- private boolean telnetTest(String address) {
+ protected boolean telnetTest(String address) {
URI ipPort = parseIpPortFromURI(address);
try (Socket s = new Socket()) {
s.connect(new InetSocketAddress(ipPort.getHost(), ipPort.getPort()),
3000);
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 3bfa3bc..d2005a5 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
@@ -298,7 +298,7 @@ public class AbstractAddressManagerTest {
}
@Test
- void normalizeUri() {
+ public void normalizeIPV4Test() {
String uri =
addressManager1.normalizeUri("rest://127.0.0.1:30100?sslEnabled=true");
Assert.assertEquals("https://127.0.0.1:30100", uri);
@@ -308,4 +308,13 @@ public class AbstractAddressManagerTest {
uri = addressManager1.normalizeUri("rest://127.0.0.1:30100");
Assert.assertEquals("http://127.0.0.1:30100", uri);
}
+
+ @Test
+ public void normalizeIPV6Test() {
+ String uri =
addressManager1.normalizeUri("rest://[2008::7:957f:b2d6:1af4:a1f8]:30100?sslEnabled=true");
+ Assert.assertEquals("https://[2008::7:957f:b2d6:1af4:a1f8]:30100", uri);
+
+ uri =
addressManager1.normalizeUri("rest://[2008::7:957f:b2d6:1af4:a1f8]:30100");
+ Assert.assertEquals("http://[2008::7:957f:b2d6:1af4:a1f8]:30100", uri);
+ }
}
\ No newline at end of file
diff --git
a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java
b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java
index c53d41d..40dbec8 100644
---
a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java
+++
b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java
@@ -19,17 +19,22 @@ package org.apache.servicecomb.config;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.apache.servicecomb.config.center.client.AddressManager;
import org.apache.servicecomb.foundation.common.event.EventManager;
+import org.apache.servicecomb.http.client.event.RefreshEndpointEvent;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
+import mockit.Deencapsulation;
+
class ConfigCenterConfigurationSourceImplTest {
@Test
- void configKieAddressManagerTest() {
+ void configAddressManagerTest() {
List<String> addresses = new ArrayList<>();
addresses.add("http://127.0.0.1:30103");
addresses.add("http://127.0.0.2:30103");
@@ -37,12 +42,29 @@ class ConfigCenterConfigurationSourceImplTest {
Assert.assertNotNull(addressManager);
String address = addressManager.address();
- Assert.assertEquals("http://127.0.0.2:30103/v3/test",address);
+ Assert.assertEquals("http://127.0.0.2:30103/v3/test", address);
address = addressManager.address();
- Assert.assertEquals("http://127.0.0.1:30103/v3/test",address);
+ Assert.assertEquals("http://127.0.0.1:30103/v3/test", address);
addressManager = new AddressManager(null, addresses,
EventManager.getEventBus());
address = addressManager.address();
- Assert.assertEquals("http://127.0.0.2:30103/v3/default",address);
+ Assert.assertEquals("http://127.0.0.2:30103/v3/default", address);
+ }
+
+ @Test
+ void onRefreshEndpointEventTest() {
+ List<String> addresses = new ArrayList<>();
+ addresses.add("http://127.0.0.1:30103");
+ List<String> addressAZ = new ArrayList<>();
+ addressAZ.add("rest://127.0.0.1:30100?sslEnabled=true");
+ Map<String, List<String>> zoneAndRegion = new HashMap<>();
+ zoneAndRegion.put("sameZone", addressAZ);
+ zoneAndRegion.put("sameRegion", new ArrayList<>());
+ RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion,
"CseConfigCenter");
+ AddressManager addressManager = new AddressManager("test", addresses,
EventManager.getEventBus());
+ addressManager.onRefreshEndpointEvent(event);
+
+ List<String> availableAZ = Deencapsulation.getField(addressManager,
"availableZone");
+ Assert.assertEquals("https://127.0.0.1:30100/v3/test", availableAZ.get(0));
}
}
\ No newline at end of file
diff --git
a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/AddressManagerTest.java
b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/AddressManagerTest.java
index a0c4228..cda67d3 100644
---
a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/AddressManagerTest.java
+++
b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/AddressManagerTest.java
@@ -70,9 +70,11 @@ class AddressManagerTest {
addressManager1.refreshEndpoint(event, "CseConfigCenter");
List<String> availableZone = Deencapsulation.getField(addressManager1,
"availableZone");
- Assert.assertEquals("http://127.0.0.3:30100", availableZone.get(0));
+ Assert.assertEquals("http://127.0.0.3:30100/v3/project",
availableZone.get(0));
List<String> availableRegion = Deencapsulation.getField(addressManager1,
"availableRegion");
- Assert.assertEquals("http://127.0.0.4:30100", availableRegion.get(0));
+ Assert.assertEquals("http://127.0.0.4:30100/v3/project",
availableRegion.get(0));
+
+ Assert.assertEquals("http://127.0.0.3:30100/v3/project",
addressManager1.address());
}
}
\ No newline at end of file
diff --git
a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
index 2afec72..4e5b3a8 100644
---
a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
+++
b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java
@@ -95,6 +95,8 @@ public class ServiceRegistryConfig {
private boolean registryAutoDiscovery;
+ private boolean registryAutoRefresh;
+
private int resendHeartBeatTimes;
private boolean alwaysOverrideSchema;
@@ -281,6 +283,15 @@ public class ServiceRegistryConfig {
return this;
}
+ public boolean isRegistryAutoRefresh() {
+ return registryAutoRefresh;
+ }
+
+ public ServiceRegistryConfig setRegistryAutoRefresh(boolean
registryAutoRefresh) {
+ this.registryAutoRefresh = registryAutoRefresh;
+ return this;
+ }
+
public int getResendHeartBeatTimes() {
return resendHeartBeatTimes;
}
diff --git
a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
index e996c43..1ebb721 100644
---
a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
+++
b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java
@@ -62,6 +62,7 @@ class ServiceRegistryConfigBuilder {
.setHeartbeatInterval(getHeartbeatInterval())
.setInstancePullInterval(getInstancePullInterval())
.setRegistryAutoDiscovery(isRegistryAutoDiscovery())
+ .setRegistryAutoRefresh(isRegistryAutoRefresh())
.setResendHeartBeatTimes(getResendHeartBeatTimes())
.setAlwaysOverrideSchema(isAlwaysOverrideSchema())
.setIgnoreSwaggerDifference(isIgnoreSwaggerDifference())
@@ -153,9 +154,9 @@ class ServiceRegistryConfigBuilder {
public int getIdleWatchTimeout() {
// watch idle timeout based on SC PING/PONG interval. SC default value is
30.
DynamicIntProperty property =
- DynamicPropertyFactory.getInstance()
-
.getIntProperty("servicecomb.service.registry.client.timeout.watch",
- ServiceRegistryConfig.DEFAULT_TIMEOUT_IN_SECONDS *
2);
+ DynamicPropertyFactory.getInstance()
+
.getIntProperty("servicecomb.service.registry.client.timeout.watch",
+ ServiceRegistryConfig.DEFAULT_TIMEOUT_IN_SECONDS * 2);
int timeout = property.get();
return timeout < 1 ? ServiceRegistryConfig.DEFAULT_TIMEOUT_IN_SECONDS * 2
: timeout;
}
@@ -205,6 +206,14 @@ class ServiceRegistryConfigBuilder {
return property.get();
}
+ public boolean isRegistryAutoRefresh() {
+ DynamicBooleanProperty property =
+ DynamicPropertyFactory.getInstance()
+ .getBooleanProperty("servicecomb.service.registry.autoRefresh",
+ false);
+ return property.get();
+ }
+
public int getResendHeartBeatTimes() {
DynamicIntProperty property =
DynamicPropertyFactory.getInstance()
diff --git
a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/AddressManager.java
b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/AddressManager.java
index fd1ce16..8851c95 100644
---
a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/AddressManager.java
+++
b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/AddressManager.java
@@ -17,6 +17,9 @@
package org.apache.servicecomb.serviceregistry.refresh;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
@@ -24,11 +27,14 @@ import org.apache.servicecomb.foundation.common.net.IpPort;
import org.apache.servicecomb.foundation.common.net.URIEndpointObject;
import org.apache.servicecomb.http.client.common.AbstractAddressManager;
import org.apache.servicecomb.http.client.event.RefreshEndpointEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
public class AddressManager extends AbstractAddressManager {
+ private static final Logger LOGGER =
LoggerFactory.getLogger(AddressManager.class);
private static final String URI_SPLIT = ":";
@@ -46,6 +52,18 @@ public class AddressManager extends AbstractAddressManager {
return new URIEndpointObject(endpoint).toString();
}
+ @Override
+ protected boolean telnetTest(String address) {
+ IpPort ipPort = transformIpPort(address);
+ try (Socket s = new Socket()) {
+ s.connect(new InetSocketAddress(ipPort.getHostOrIp(), ipPort.getPort()),
3000);
+ return true;
+ } catch (IOException e) {
+ LOGGER.warn("ping endpoint {} failed, It will be quarantined again.",
address);
+ }
+ return false;
+ }
+
private IpPort transformIpPort(String address) {
String[] result = StringUtils.split(address, URI_SPLIT);
return new IpPort(result[0], Integer.valueOf(result[1]));
diff --git
a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ClassificationAddress.java
b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ClassificationAddress.java
index 80af0f7..1b7666f 100644
---
a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ClassificationAddress.java
+++
b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ClassificationAddress.java
@@ -59,6 +59,8 @@ public class ClassificationAddress {
private String defaultTransport = "rest";
+ private boolean isAutoRefresh;
+
private DataCenterInfo dataCenterInfo;
InstanceCacheManager instanceCacheManager;
@@ -70,6 +72,7 @@ public class ClassificationAddress {
public ClassificationAddress(ServiceRegistryConfig serviceRegistryConfig,
InstanceCacheManager instanceCacheManager) {
this.defaultTransport = serviceRegistryConfig.getTransport();
this.defaultIpPort = serviceRegistryConfig.getIpPort();
+ this.isAutoRefresh = serviceRegistryConfig.isRegistryAutoRefresh();
this.instanceCacheManager = instanceCacheManager;
this.maxRetryTimes = defaultIpPort.size();
ServiceCenterEventBus.getEventBus().register(this);
@@ -85,6 +88,11 @@ public class ClassificationAddress {
@Subscribe
public void onMicroserviceCacheRefreshed(MicroserviceCacheRefreshedEvent
event) {
+ //if isAutoRefresh is false, it will not be refresh.
+ if (!isAutoRefresh) {
+ return;
+ }
+
List<MicroserviceCache> microserviceCaches = event.getMicroserviceCaches();
if (null == microserviceCaches || microserviceCaches.isEmpty()) {
return;