Skip to content

Commit 59d393c

Browse files
committed
change to address set datacenter info
1 parent 6896f91 commit 59d393c

File tree

21 files changed

+137
-132
lines changed

21 files changed

+137
-132
lines changed

clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828

2929
public class ConfigCenterAddressManager extends AbstractAddressManager {
3030

31-
public ConfigCenterAddressManager(String projectName, List<String> addresses, List<String> sameSideAddresses,
32-
List<String> diffSideAddresses, EventBus eventBus) {
33-
super(projectName, addresses, sameSideAddresses, diffSideAddresses);
31+
public ConfigCenterAddressManager(String projectName, List<String> addresses, String ownRegion,
32+
String ownAvailableZone, EventBus eventBus) {
33+
super(projectName, addresses, ownRegion, ownAvailableZone);
3434
eventBus.register(this);
3535
}
3636

clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@
2727

2828
public class KieAddressManager extends AbstractAddressManager {
2929

30-
public KieAddressManager(List<String> addresses, List<String> sameSideAddresses, List<String> diffSideAddresses,
31-
EventBus eventBus) {
32-
super(addresses, sameSideAddresses, diffSideAddresses);
30+
public KieAddressManager(List<String> addresses, String ownRegion, String ownAvailableZone, EventBus eventBus) {
31+
super(addresses, ownRegion, ownAvailableZone);
3332
eventBus.register(this);
3433
}
3534

clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class KieAddressManagerTest {
4040
public void kieAddressManagerTest() throws NoSuchFieldException, IllegalAccessException {
4141
addresses.add("http://127.0.0.1:30103");
4242
addresses.add("https://127.0.0.2:30103");
43-
addressManager1 = new KieAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus());
43+
addressManager1 = new KieAddressManager(addresses, "", "", new EventBus());
4444
Field addressManagerField = addressManager1.getClass().getSuperclass().getDeclaredField("index");
4545
addressManagerField.setAccessible(true);
4646
addressManagerField.set(addressManager1, 0);
@@ -64,7 +64,7 @@ public void onRefreshEndpointEvent() {
6464
Map<String, List<String>> zoneAndRegion = new HashMap<>();
6565
zoneAndRegion.put("sameZone", addressAZ);
6666
zoneAndRegion.put("sameRegion", addressRG);
67-
addressManager1 = new KieAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus());
67+
addressManager1 = new KieAddressManager(addresses, "", "", new EventBus());
6868
RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "KIE");
6969
addressManager1.refreshEndpoint(event, "KIE");
7070

clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,8 @@
2929

3030
public class DashboardAddressManager extends AbstractAddressManager {
3131

32-
public DashboardAddressManager(List<String> addresses, List<String> sameSideAddresses,
33-
List<String> diffSideAddresses, EventBus eventBus) {
34-
super(addresses, sameSideAddresses, diffSideAddresses);
32+
public DashboardAddressManager(List<String> addresses, String ownRegion, String ownAvailableZone, EventBus eventBus) {
33+
super(addresses, ownRegion, ownAvailableZone);
3534
eventBus.register(this);
3635
}
3736

clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class AddressManagerTest {
4141
public void kieAddressManagerTest() throws IllegalAccessException, NoSuchFieldException {
4242
addresses.add("http://127.0.0.1:30103");
4343
addresses.add("https://127.0.0.2:30103");
44-
addressManager1 = new DashboardAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus());
44+
addressManager1 = new DashboardAddressManager(addresses, "", "", new EventBus());
4545
Field addressManagerField = addressManager1.getClass().getSuperclass().getDeclaredField("index");
4646
addressManagerField.setAccessible(true);
4747
addressManagerField.set(addressManager1, 0);
@@ -65,7 +65,7 @@ public void onRefreshEndpointEvent() {
6565
Map<String, List<String>> zoneAndRegion = new HashMap<>();
6666
zoneAndRegion.put("sameZone", addressAZ);
6767
zoneAndRegion.put("sameRegion", addressRG);
68-
addressManager1 = new DashboardAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus());
68+
addressManager1 = new DashboardAddressManager(addresses, "", "", new EventBus());
6969
RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "CseMonitoring");
7070
addressManager1.refreshEndpoint(event, "CseMonitoring");
7171

clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java

Lines changed: 52 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.servicecomb.http.client.event.RefreshEndpointEvent;
3131
import org.slf4j.Logger;
3232
import org.slf4j.LoggerFactory;
33+
import org.springframework.util.CollectionUtils;
3334

3435
import com.google.common.annotations.VisibleForTesting;
3536
import com.google.common.eventbus.EventBus;
@@ -43,6 +44,10 @@ public class AbstractAddressManager {
4344

4445
private static final String V3_PREFIX = "/v3/";
4546

47+
private static final String ZONE = "availableZone";
48+
49+
private static final String REGION = "region";
50+
4651
private static final int ISOLATION_THRESHOLD = 3;
4752

4853
private volatile List<String> addresses = new ArrayList<>();
@@ -75,59 +80,61 @@ public class AbstractAddressManager {
7580

7681
private EventBus eventBus;
7782

78-
private List<String> sameSideAddresses = new ArrayList<>();
79-
80-
private final List<String> isolationSameSideAddresses = new ArrayList<>();
81-
82-
private List<String> diffSideAddresses = new ArrayList<>();
83-
84-
private final List<String> isolationDiffSideAddresses = new ArrayList<>();
85-
86-
public AbstractAddressManager(List<String> addresses, List<String> sameSideAddresses,
87-
List<String> diffSideAddresses) {
83+
public AbstractAddressManager(List<String> addresses, String ownRegion, String ownAvailableZone) {
8884
this.projectName = DEFAULT_PROJECT;
89-
initAddresses(addresses, sameSideAddresses, diffSideAddresses);
85+
parseAndInitAddresses(addresses, ownRegion, ownAvailableZone, false);
9086
this.index = !addresses.isEmpty() ? getRandomIndex() : 0;
9187
}
9288

93-
private void initAddresses(List<String> addresses, List<String> sameSideAddresses, List<String> diffSideAddresses) {
94-
if (addresses != null) {
95-
this.addresses.addAll(addresses);
96-
this.defaultAddress.addAll(addresses);
89+
/**
90+
* address support config with region/availableZone info, to enable engine affinity calls during startup
91+
* address may be like:
92+
* https://192.168.20.13:30110?region=region1&availableZone=az
93+
* https://192.168.20.13:30100?region=region1&availableZone=az
94+
* When address have no datacenter information, roundRobin using address
95+
*
96+
* @param addresses engine addresses
97+
* @param ownRegion microservice region
98+
* @param ownAvailableZone microservice zone
99+
* @param isFormat is need format
100+
*/
101+
private void parseAndInitAddresses(List<String> addresses, String ownRegion, String ownAvailableZone,
102+
boolean isFormat) {
103+
if (CollectionUtils.isEmpty(addresses)) {
104+
return;
97105
}
98-
if (sameSideAddresses != null) {
99-
this.sameSideAddresses.addAll(sameSideAddresses);
100-
this.defaultAddress.addAll(sameSideAddresses);
106+
List<String> tesmpList = new ArrayList<>();
107+
addressAutoRefreshed = addresses.stream().anyMatch(addr -> addr.contains(ZONE) || addr.contains(REGION));
108+
for (String address : addresses) {
109+
// Compatible IpPortManager init address is 127.0.0.1:30100
110+
if (!address.startsWith("http")) {
111+
tesmpList.add(address);
112+
continue;
113+
}
114+
URLEndPoint endpoint = new URLEndPoint(address);
115+
tesmpList.add(endpoint.toString());
116+
buildAffinityAddress(endpoint, ownRegion, ownAvailableZone);
101117
}
102-
if (diffSideAddresses != null) {
103-
this.diffSideAddresses.addAll(diffSideAddresses);
104-
this.defaultAddress.addAll(diffSideAddresses);
118+
this.addresses.addAll(isFormat ? this.transformAddress(tesmpList) : tesmpList);
119+
this.defaultAddress.addAll(isFormat ? this.transformAddress(tesmpList) : tesmpList);
120+
}
121+
122+
private void buildAffinityAddress(URLEndPoint endpoint, String ownRegion, String ownAvailableZone) {
123+
if (addressAutoRefreshed) {
124+
if (regionAndAZMatch(ownRegion, ownAvailableZone, endpoint.getFirst(REGION), endpoint.getFirst(ZONE))) {
125+
availableZone.add(endpoint.toString());
126+
} else {
127+
availableRegion.add(endpoint.toString());
128+
}
105129
}
106130
}
107131

108-
public AbstractAddressManager(String projectName, List<String> addresses, List<String> sameSideAddresses,
109-
List<String> diffSideAddresses) {
132+
public AbstractAddressManager(String projectName, List<String> addresses, String ownRegion, String ownAvailableZone) {
110133
this.projectName = StringUtils.isEmpty(projectName) ? DEFAULT_PROJECT : projectName;
111-
initAddressesWithFormat(addresses, sameSideAddresses, diffSideAddresses);
134+
parseAndInitAddresses(addresses, ownRegion, ownAvailableZone, true);
112135
this.index = !addresses.isEmpty() ? getRandomIndex() : 0;
113136
}
114137

115-
private void initAddressesWithFormat(List<String> addresses, List<String> sameSideAddresses,
116-
List<String> diffSideAddresses) {
117-
if (addresses != null) {
118-
this.addresses = this.transformAddress(addresses);
119-
this.defaultAddress.addAll(addresses);
120-
}
121-
if (sameSideAddresses != null) {
122-
this.sameSideAddresses = this.transformAddress(sameSideAddresses);
123-
this.defaultAddress.addAll(sameSideAddresses);
124-
}
125-
if (diffSideAddresses != null) {
126-
this.diffSideAddresses = this.transformAddress(diffSideAddresses);
127-
this.defaultAddress.addAll(diffSideAddresses);
128-
}
129-
}
130-
131138
private int getRandomIndex() {
132139
return random.nextInt(addresses.size());
133140
}
@@ -196,15 +203,9 @@ public String address() {
196203
}
197204

198205
private String getDefaultAddress() {
199-
if (!sameSideAddresses.isEmpty()) {
200-
return getCurrentAddress(sameSideAddresses);
201-
}
202206
if (!addresses.isEmpty()) {
203207
return getCurrentAddress(addresses);
204208
}
205-
if (!diffSideAddresses.isEmpty()) {
206-
return getCurrentAddress(diffSideAddresses);
207-
}
208209
LOGGER.warn("all addresses are isolation, please check server status.");
209210
// when all addresses are isolation, it will use all default address for polling.
210211
return getCurrentAddress(defaultAddress);
@@ -262,17 +263,6 @@ public void recordSuccessState(String address) {
262263
LOGGER.warn("restore default address [{}]", address);
263264
addresses.add(address);
264265
}
265-
if (isolationSameSideAddresses.remove(address)) {
266-
LOGGER.warn("restore same side server address [{}]", address);
267-
if (eventBus != null && sameSideAddresses.isEmpty()) {
268-
eventBus.post(new EngineConnectChangedEvent());
269-
}
270-
sameSideAddresses.add(address);
271-
}
272-
if (isolationDiffSideAddresses.remove(address)) {
273-
LOGGER.warn("restore different side server address [{}]", address);
274-
diffSideAddresses.add(address);
275-
}
276266
}
277267

278268
public void resetFailureStatus(String address) {
@@ -308,17 +298,6 @@ void removeAddress(String address) {
308298
LOGGER.warn("isolation default address [{}]", address);
309299
defaultIsolationAddress.add(address);
310300
}
311-
if (sameSideAddresses.remove(address)) {
312-
LOGGER.warn("isolation same side server address [{}]", address);
313-
isolationSameSideAddresses.add(address);
314-
if (eventBus != null && sameSideAddresses.isEmpty() && !diffSideAddresses.isEmpty()) {
315-
eventBus.post(new EngineConnectChangedEvent());
316-
}
317-
}
318-
if (diffSideAddresses.remove(address)) {
319-
LOGGER.warn("isolation different side server address [{}]", address);
320-
isolationDiffSideAddresses.add(address);
321-
}
322301
return;
323302
}
324303
if (availableZone.remove(address)) {
@@ -341,8 +320,6 @@ public void setEventBus(EventBus eventBus) {
341320

342321
public List<String> getIsolationAddresses() {
343322
List<String> isolationAddresses = new ArrayList<>(defaultIsolationAddress);
344-
isolationAddresses.addAll(isolationSameSideAddresses);
345-
isolationAddresses.addAll(isolationDiffSideAddresses);
346323
isolationAddresses.addAll(isolationZoneAddress);
347324
isolationAddresses.addAll(isolationRegionAddress);
348325
return isolationAddresses;
@@ -369,4 +346,9 @@ private boolean isAddressHostSame(String address, String host) {
369346
}
370347
return false;
371348
}
349+
350+
private boolean regionAndAZMatch(String ownRegion, String ownAvailableZone, String engineRegion,
351+
String engineAvailableZone) {
352+
return ownRegion.equalsIgnoreCase(engineRegion) && ownAvailableZone.equals(engineAvailableZone);
353+
}
372354
}

clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ public class AbstractAddressManagerTest {
4646
public void setUp() throws NoSuchFieldException, IllegalAccessException {
4747
addresses.add("http://127.0.0.1:30103");
4848
addresses.add("https://127.0.0.2:30103");
49-
addressManager1 = new AbstractAddressManager(addresses, new ArrayList<>(), new ArrayList<>());
50-
addressManager2 = new AbstractAddressManager("project", addresses, new ArrayList<>(), new ArrayList<>());
51-
addressManager3 = new AbstractAddressManager(null, addresses, new ArrayList<>(), new ArrayList<>());
49+
addressManager1 = new AbstractAddressManager(addresses, "", "");
50+
addressManager2 = new AbstractAddressManager("project", addresses, "", "");
51+
addressManager3 = new AbstractAddressManager(null, addresses, "", "");
5252
Field addressManagerField = addressManager1.getClass().getDeclaredField("index");
5353
addressManagerField.setAccessible(true);
5454
addressManagerField.set(addressManager1, 0);
@@ -88,8 +88,7 @@ public void recordStateTest() throws ExecutionException {
8888
zoneAndRegion.put("sameZone", addressAZ);
8989
zoneAndRegion.put("sameRegion", addressRG);
9090
RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "TEST");
91-
AbstractAddressManager addressManager = new AbstractAddressManager(addresses, new ArrayList<>(),
92-
new ArrayList<>()) {};
91+
AbstractAddressManager addressManager = new AbstractAddressManager(addresses, "", "") {};
9392

9493
addressManager.refreshEndpoint(event, "TEST");
9594

@@ -125,7 +124,7 @@ public void recordStateTest() throws ExecutionException {
125124
@Test
126125
public void testMultipleThread() throws Exception {
127126

128-
AbstractAddressManager addressManager = new AbstractAddressManager(addresses, new ArrayList<>(), new ArrayList<>());
127+
AbstractAddressManager addressManager = new AbstractAddressManager(addresses, "", "");
129128
String address = "http://127.0.0.3:30100";
130129

131130
CountDownLatch latch = new CountDownLatch(2);
@@ -310,7 +309,7 @@ public void compareAndGetAddressTest() {
310309
testAddr.add("https://192.168.20.160:30100");
311310
testAddr.add("https://127.0.0.1:30100");
312311
testAddr.add("https://127.0.0.3:30100");
313-
AbstractAddressManager manager = new AbstractAddressManager(testAddr, new ArrayList<>(), new ArrayList<>());
312+
AbstractAddressManager manager = new AbstractAddressManager(testAddr, "", "");
314313
Assertions.assertTrue(manager.compareAndGetAddress("192.168.20.16").isEmpty());
315314
Assertions.assertEquals("https://192.168.20.160:30100", manager.compareAndGetAddress("192.168.20.160"));
316315
}

clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
import com.google.common.eventbus.Subscribe;
2727

2828
public class ServiceCenterAddressManager extends AbstractAddressManager {
29-
public ServiceCenterAddressManager(String projectName, List<String> addresses, List<String> sameSideAddresses,
30-
List<String> diffSideAddresses, EventBus eventBus) {
31-
super(projectName, addresses, sameSideAddresses, diffSideAddresses);
29+
public ServiceCenterAddressManager(String projectName, List<String> addresses, String ownRegion,
30+
String ownAvailableZone, EventBus eventBus) {
31+
super(projectName, addresses, ownRegion, ownAvailableZone);
3232
eventBus.register(this);
3333
}
3434

clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ class ServiceCenterAddressManagerTest {
4141
@Test
4242
public void getUrlPrefix() {
4343
addresses.add("http://127.0.0.1:30103");
44-
addressManager1 = new ServiceCenterAddressManager("project", addresses, new ArrayList<>(),
45-
new ArrayList<>(), new EventBus());
44+
addressManager1 = new ServiceCenterAddressManager("project", addresses, "", "", new EventBus());
4645

4746
Assertions.assertNotNull(addressManager1);
4847

@@ -56,8 +55,7 @@ public void getUrlPrefix() {
5655
@Test
5756
public void formatUrlTest() {
5857
addresses.add("http://127.0.0.1:30103");
59-
addressManager1 = new ServiceCenterAddressManager("project", addresses, new ArrayList<>(),
60-
new ArrayList<>(), new EventBus());
58+
addressManager1 = new ServiceCenterAddressManager("project", addresses, "", "", new EventBus());
6159
Assertions.assertNotNull(addressManager1);
6260

6361
String address = addressManager1.address();
@@ -78,8 +76,7 @@ public void onRefreshEndpointEvent() {
7876
Map<String, List<String>> zoneAndRegion = new HashMap<>();
7977
zoneAndRegion.put("sameZone", addressAZ);
8078
zoneAndRegion.put("sameRegion", addressRG);
81-
addressManager1 = new ServiceCenterAddressManager("project", addresses, new ArrayList<>(),
82-
new ArrayList<>(), new EventBus());
79+
addressManager1 = new ServiceCenterAddressManager("project", addresses, "", "", new EventBus());
8380
RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "SERVICECENTER");
8481
addressManager1.refreshEndpoint(event, "SERVICECENTER");
8582

clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
package org.apache.servicecomb.service.center.client;
1919

2020
import java.io.IOException;
21-
import java.util.ArrayList;
2221
import java.util.Arrays;
2322

2423
import org.apache.servicecomb.http.client.common.HttpResponse;
@@ -43,7 +42,7 @@ public void TestDefaultParameter() throws IOException {
4342

4443
HttpTransport httpTransport = Mockito.mock(HttpTransport.class);
4544
ServiceCenterAddressManager addressManager = new ServiceCenterAddressManager(PROJECT_NAME,
46-
Arrays.asList("http://127.0.0.1:30100"), new ArrayList<>(), new ArrayList<>(), new EventBus());
45+
Arrays.asList("http://127.0.0.1:30100"), "", "", new EventBus());
4746
ServiceCenterRawClient client = new ServiceCenterRawClient.Builder()
4847
.setHttpTransport(httpTransport)
4948
.setAddressManager(addressManager)

0 commit comments

Comments
 (0)