Skip to content

Commit 1383912

Browse files
authored
[#4687] fixed service center isolated address cannot be restored problem (#4688)
1 parent 9d349af commit 1383912

File tree

7 files changed

+94
-3
lines changed

7 files changed

+94
-3
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public static void checkAddressAvailable(AbstractAddressManager addressManager,
5555
}
5656
}
5757

58-
private static boolean telnetCheckAddress(String address) {
58+
public static boolean telnetCheckAddress(String address) {
5959
URI ipPort = parseIpPortFromURI(address);
6060
if (ipPort == null) {
6161
return false;
@@ -71,7 +71,8 @@ private static boolean telnetCheckAddress(String address) {
7171

7272
private static URI parseIpPortFromURI(String address) {
7373
try {
74-
return new URI(address);
74+
String newAddress = address.startsWith("http") ? address : "https://" + address;
75+
return new URI(newAddress);
7576
} catch (URISyntaxException e) {
7677
LOGGER.error("build uri error with address [{}].", address);
7778
return null;

service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/IpPortManager.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,16 @@ public IpPort getAvailableAddress() {
8888
public void recordState(String address) {
8989
addressManger.recordFailState(address);
9090
}
91+
92+
public void recordSuccessState(String address) {
93+
addressManger.recordSuccessState(address);
94+
}
95+
96+
public List<String> getIsolationAddresses() {
97+
return addressManger.getIsolationAddresses();
98+
}
99+
100+
public IpPort transformIpPort(String address) {
101+
return addressManger.transformIpPort(address);
102+
}
91103
}

service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/ServiceRegistryClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,9 @@ MicroserviceInstances findServiceInstances(String consumerId, String appId, Stri
181181
* @return whether this operation success
182182
*/
183183
boolean updateMicroserviceInstanceStatus(String microserviceId, String instanceId, MicroserviceInstanceStatus status);
184+
185+
/**
186+
* Check service center isolation addresses
187+
*/
188+
void checkIsolationAddressAvailable();
184189
}

service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.apache.servicecomb.foundation.common.net.IpPort;
3636
import org.apache.servicecomb.foundation.common.utils.JsonUtils;
3737
import org.apache.servicecomb.foundation.vertx.AsyncResultCallback;
38+
import org.apache.servicecomb.http.client.utils.ServiceCombServiceAvailableUtils;
3839
import org.apache.servicecomb.registry.api.event.MicroserviceInstanceChangedEvent;
3940
import org.apache.servicecomb.registry.api.registry.FindInstancesResponse;
4041
import org.apache.servicecomb.registry.api.registry.Framework;
@@ -90,6 +91,8 @@ public final class ServiceRegistryClientImpl implements ServiceRegistryClient {
9091

9192
private static final String ERR_SCHEMA_NOT_EXISTS = "400016";
9293

94+
private static final String ADDRESS_CHECK_PATH = "/v4/default/registry/health/readiness";
95+
9396
private final IpPortManager ipPortManager;
9497

9598
// key是本进程的微服务id和服务管理中心的id
@@ -275,11 +278,13 @@ private Handler<RestResponse> syncHandlerForInstances(CountDownLatch countDownLa
275278
switch (response.statusCode()) {
276279
case 304:
277280
mInstances.setNeedRefresh(false);
281+
ipPortManager.recordSuccessState(requestContext.getIpPort().toString());
278282
break;
279283
case 200:
280284
mInstances
281285
.setInstancesResponse(JsonUtils.readValue(bodyBuffer.getBytes(), FindInstancesResponse.class));
282286
mInstances.setNeedRefresh(true);
287+
ipPortManager.recordSuccessState(requestContext.getIpPort().toString());
283288
break;
284289
case 400: {
285290
@SuppressWarnings("unchecked")
@@ -289,6 +294,7 @@ private Handler<RestResponse> syncHandlerForInstances(CountDownLatch countDownLa
289294
mInstances.setNeedRefresh(false);
290295
}
291296
LOGGER.warn("failed to findInstances: " + bodyBuffer);
297+
ipPortManager.recordState(requestContext.getIpPort().toString());
292298
}
293299
break;
294300
default:
@@ -965,6 +971,47 @@ public boolean updateMicroserviceInstanceStatus(String microserviceId, String in
965971
return false;
966972
}
967973

974+
@Override
975+
public void checkIsolationAddressAvailable() {
976+
Holder<GetAllServicesResponse> holder = new Holder<>();
977+
List<String> isolationAddresses = ipPortManager.getIsolationAddresses();
978+
for (String address : isolationAddresses) {
979+
CountDownLatch countDownLatch = new CountDownLatch(1);
980+
restClientUtil.get(ipPortManager.transformIpPort(address),
981+
ADDRESS_CHECK_PATH,
982+
new RequestParam(),
983+
addressSyncHandler(countDownLatch, GetAllServicesResponse.class, holder));
984+
try {
985+
countDownLatch.await();
986+
if (holder.statusCode == 200) {
987+
ipPortManager.recordSuccessState(address);
988+
return;
989+
}
990+
if (holder.statusCode == 404 && ServiceCombServiceAvailableUtils.telnetCheckAddress(address)) {
991+
ipPortManager.recordSuccessState(address);
992+
return;
993+
}
994+
} catch (Exception e) {
995+
LOGGER.error("check service center isolation address [{}] failed", address);
996+
}
997+
}
998+
}
999+
1000+
public <T> Handler<RestResponse> addressSyncHandler(CountDownLatch countDownLatch, Class<T> cls,
1001+
Holder<T> holder) {
1002+
return restResponse -> {
1003+
HttpClientResponse response = restResponse.getResponse();
1004+
if (response == null) {
1005+
countDownLatch.countDown();
1006+
holder.setStatusCode(500);
1007+
return;
1008+
}
1009+
holder.setStatusCode(response.statusCode());
1010+
sendUnAuthorizedEvent(response);
1011+
countDownLatch.countDown();
1012+
};
1013+
}
1014+
9681015
@Subscribe
9691016
public void onMicroserviceHeartbeatTask(MicroserviceInstanceHeartbeatTask event) {
9701017
if (HeartbeatResult.SUCCESS.equals(event.getHeartbeatResult())) {

service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ protected String normalizeUri(String endpoint) {
4545
return new URIEndpointObject(endpoint).toString();
4646
}
4747

48-
private IpPort transformIpPort(String address) {
48+
public IpPort transformIpPort(String address) {
4949
URI uri = URI.create(URI_PREFIX + address);
5050
return new IpPort(uri.getHost(), uri.getPort());
5151
}

service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/task/MicroserviceInstanceRegisterTask.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
*/
1717
package org.apache.servicecomb.serviceregistry.task;
1818

19+
import java.util.concurrent.Executors;
20+
import java.util.concurrent.ScheduledExecutorService;
21+
import java.util.concurrent.TimeUnit;
22+
1923
import org.apache.commons.lang3.StringUtils;
2024
import org.apache.servicecomb.registry.RegistrationManager;
2125
import org.apache.servicecomb.registry.api.registry.Microservice;
@@ -36,13 +40,18 @@ public class MicroserviceInstanceRegisterTask extends AbstractRegisterTask {
3640

3741
private final MicroserviceInstance microserviceInstance;
3842

43+
private final ScheduledExecutorService addrCheckExecutor;
44+
45+
private boolean isAddrCheckInit = false;
46+
3947
public MicroserviceInstanceRegisterTask(EventBus eventBus, ServiceRegistryConfig serviceRegistryConfig,
4048
ServiceRegistryClient srClient,
4149
Microservice microservice) {
4250
super(eventBus, srClient, microservice);
4351

4452
this.serviceRegistryConfig = serviceRegistryConfig;
4553
this.microserviceInstance = microservice.getInstance();
54+
this.addrCheckExecutor = Executors.newScheduledThreadPool(1, (t) -> new Thread(t, "sc-addr-check"));
4655
}
4756

4857
@Subscribe
@@ -90,6 +99,18 @@ protected boolean doRegister() {
9099
microserviceInstance.getEndpoints(),
91100
microserviceInstance.getHealthCheck().getTTL());
92101

102+
if (!isAddrCheckInit) {
103+
addrCheckExecutor.scheduleWithFixedDelay(new CheckAddressTask(), 0,
104+
serviceRegistryConfig.getHeartbeatInterval(), TimeUnit.SECONDS);
105+
isAddrCheckInit = true;
106+
}
93107
return true;
94108
}
109+
110+
class CheckAddressTask implements Runnable {
111+
@Override
112+
public void run() {
113+
srClient.checkIsolationAddressAvailable();
114+
}
115+
}
95116
}

service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/client/LocalServiceRegistryClientImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,4 +458,9 @@ public boolean updateMicroserviceInstanceStatus(String microserviceId, String in
458458
microserviceInstance.setStatus(status);
459459
return true;
460460
}
461+
462+
@Override
463+
public void checkIsolationAddressAvailable() {
464+
// NOT SUPPORT
465+
}
461466
}

0 commit comments

Comments
 (0)