Skip to content

Commit 95f63c0

Browse files
authored
[#4678] optimized sc/kie/config-center isolation address check logic (#4680) (#4681)
1 parent bc4db8e commit 95f63c0

File tree

11 files changed

+106
-61
lines changed

11 files changed

+106
-61
lines changed

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

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.servicecomb.http.client.common.HttpResponse;
3131
import org.apache.servicecomb.http.client.common.HttpTransport;
3232
import org.apache.servicecomb.http.client.common.HttpUtils;
33+
import org.apache.servicecomb.http.client.utils.ServiceCombServiceAvailableUtils;
3334
import org.slf4j.Logger;
3435
import org.slf4j.LoggerFactory;
3536

@@ -49,6 +50,8 @@ public class ConfigCenterClient implements ConfigCenterOperation {
4950

5051
public static final String DARK_LAUNCH = "darklaunch@";
5152

53+
private static final String ADDRESS_CHECK_PATH = "/v3/default/configuration/health?mode=readiness";
54+
5255
private final HttpTransport httpTransport;
5356

5457
private final ConfigCenterAddressManager addressManager;
@@ -133,25 +136,8 @@ public QueryConfigurationsResponse queryConfigurations(QueryConfigurationsReques
133136
}
134137

135138
@Override
136-
public void checkAddressAvailable(QueryConfigurationsRequest request, String address) {
137-
String dimensionsInfo = buildDimensionsInfo(request, true);
138-
try {
139-
String uri = address + "/configuration/items?dimensionsInfo="
140-
+ HttpUtils.encodeURLParam(dimensionsInfo) + "&revision=" + request.getRevision();
141-
142-
Map<String, String> headers = new HashMap<>();
143-
headers.put("x-environment", request.getEnvironment());
144-
HttpRequest httpRequest = new HttpRequest(uri, headers, null,
145-
HttpRequest.GET);
146-
147-
HttpResponse httpResponse = httpTransport.doRequest(httpRequest);
148-
if (httpResponse.getStatusCode() == HttpStatus.SC_NOT_MODIFIED
149-
|| httpResponse.getStatusCode() == HttpStatus.SC_OK) {
150-
addressManager.recoverIsolatedAddress(address);
151-
}
152-
} catch (Exception e) {
153-
LOGGER.error("check config center isolation address {} available error!", address);
154-
}
139+
public void checkAddressAvailable(String address) {
140+
ServiceCombServiceAvailableUtils.checkAddressAvailable(addressManager, address, httpTransport, ADDRESS_CHECK_PATH);
155141
}
156142

157143
private String buildDimensionsInfo(QueryConfigurationsRequest request, boolean withVersion) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public void run() {
103103
return;
104104
}
105105
for (String address : isolationAddresses) {
106-
configCenterClient.checkAddressAvailable(queryConfigurationsRequest, address);
106+
configCenterClient.checkAddressAvailable(address);
107107
}
108108
}
109109
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ public interface ConfigCenterOperation {
3434
/**
3535
* Check config center isolation address available
3636
*
37-
* @param request queryConfigurationsRequest
3837
* @param address isolation address
3938
*/
40-
void checkAddressAvailable(QueryConfigurationsRequest request, String address);
39+
void checkAddressAvailable(String address);
4140
}

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

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import com.google.common.eventbus.EventBus;
2121

22-
import java.io.IOException;
2322
import java.io.StringReader;
2423
import java.nio.charset.StandardCharsets;
2524
import java.util.Collections;
@@ -45,6 +44,7 @@
4544
import org.apache.servicecomb.http.client.common.HttpResponse;
4645
import org.apache.servicecomb.http.client.common.HttpTransport;
4746
import org.apache.servicecomb.http.client.common.HttpUtils;
47+
import org.apache.servicecomb.http.client.utils.ServiceCombServiceAvailableUtils;
4848
import org.slf4j.Logger;
4949
import org.slf4j.LoggerFactory;
5050
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
@@ -54,6 +54,8 @@ public class KieClient implements KieConfigOperation {
5454

5555
private static final Logger LOGGER = LoggerFactory.getLogger(KieClient.class);
5656

57+
private static final String ADDRESS_CHECK_PATH = "/v1/health";
58+
5759
protected HttpTransport httpTransport;
5860

5961
protected String revision = "0";
@@ -115,18 +117,8 @@ public ConfigurationsResponse queryConfigurations(ConfigurationsRequest request,
115117
}
116118

117119
@Override
118-
public void checkAddressAvailable(ConfigurationsRequest request, String address) {
119-
String url = buildUrl(request, address);
120-
HttpRequest httpRequest = new HttpRequest(url, null, null, HttpRequest.GET);
121-
try {
122-
HttpResponse httpResponse = httpTransport.doRequest(httpRequest);
123-
if (httpResponse.getStatusCode() == HttpStatus.SC_NOT_MODIFIED
124-
|| httpResponse.getStatusCode() == HttpStatus.SC_OK) {
125-
addressManager.recoverIsolatedAddress(address);
126-
}
127-
} catch (IOException e) {
128-
LOGGER.error("check kie config isolation address {} available error!", address);
129-
}
120+
public void checkAddressAvailable(String address) {
121+
ServiceCombServiceAvailableUtils.checkAddressAvailable(addressManager, address, httpTransport, ADDRESS_CHECK_PATH);
130122
}
131123

132124
private String buildUrl(ConfigurationsRequest request, String currentAddress) {

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ protected void initTaskPool(String taskName) {
125125
public void startConfigKieManager() {
126126
this.configurationsRequests.forEach((t) ->
127127
this.startTask(new PollConfigurationTask(0, t)));
128-
schedulerCheckAddressAvailable("kie-addr-check", new CheckKieAddressTask(configurationsRequests.get(0)),
128+
schedulerCheckAddressAvailable("kie-addr-check", new CheckKieAddressTask(),
129129
kieConfiguration.getRefreshIntervalInMillis());
130130
}
131131

@@ -163,20 +163,14 @@ public void execute() {
163163
}
164164

165165
class CheckKieAddressTask implements Runnable {
166-
ConfigurationsRequest configurationsRequest;
167-
168-
public CheckKieAddressTask(ConfigurationsRequest configurationsRequest) {
169-
this.configurationsRequest = configurationsRequest;
170-
}
171-
172166
@Override
173167
public void run() {
174168
List<String> isolationAddresses = kieAddressManager.getIsolationAddresses();
175169
if (isolationAddresses.isEmpty()) {
176170
return;
177171
}
178172
for (String address : isolationAddresses) {
179-
configKieClient.checkAddressAvailable(this.configurationsRequest, address);
173+
configKieClient.checkAddressAvailable(address);
180174
}
181175
}
182176
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ public interface KieConfigOperation {
3535
/**
3636
* Check kie isolation address available
3737
*
38-
* @param configurationsRequest configurationsRequest
3938
* @param address isolation address
4039
*/
41-
void checkAddressAvailable(ConfigurationsRequest configurationsRequest, String address);
40+
void checkAddressAvailable(String address);
4241
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,8 @@ private List<String> getZoneOrRegionAddress() {
194194
return results;
195195
}
196196

197-
public void recoverIsolatedAddress(String address) {
198-
recordSuccessState(address);
197+
public void recordSuccessState(String address) {
198+
resetFailureStatus(address);
199199
if (addressAutoRefreshed) {
200200
if (isolationZoneAddress.remove(address)) {
201201
LOGGER.warn("restore same region address [{}]", address);
@@ -217,7 +217,7 @@ public void recoverIsolatedAddress(String address) {
217217
}
218218
}
219219

220-
public void recordSuccessState(String address) {
220+
public void resetFailureStatus(String address) {
221221
addressFailureStatus.put(address, 0);
222222
}
223223

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.servicecomb.http.client.utils;
19+
20+
import org.apache.http.HttpStatus;
21+
import org.apache.servicecomb.http.client.common.AbstractAddressManager;
22+
import org.apache.servicecomb.http.client.common.HttpRequest;
23+
import org.apache.servicecomb.http.client.common.HttpResponse;
24+
import org.apache.servicecomb.http.client.common.HttpTransport;
25+
import org.slf4j.Logger;
26+
import org.slf4j.LoggerFactory;
27+
28+
import java.io.IOException;
29+
import java.net.InetSocketAddress;
30+
import java.net.Socket;
31+
import java.net.URI;
32+
import java.net.URISyntaxException;
33+
34+
public class ServiceCombServiceAvailableUtils {
35+
private static final Logger LOGGER = LoggerFactory.getLogger(ServiceCombServiceAvailableUtils.class);
36+
37+
public static void checkAddressAvailable(AbstractAddressManager addressManager, String address,
38+
HttpTransport httpTransport, String path) {
39+
String formatUrl = addressManager.formatUrl(path, true, address);
40+
HttpRequest httpRequest = new HttpRequest(formatUrl, null, null, HttpRequest.GET);
41+
try {
42+
HttpResponse response = httpTransport.doRequest(httpRequest);
43+
if (response.getStatusCode() == HttpStatus.SC_OK) {
44+
addressManager.recordSuccessState(address);
45+
return;
46+
}
47+
48+
// old server does not provide the check api, using TCP checks whether the server is ready.
49+
if (response.getStatusCode() == HttpStatus.SC_NOT_FOUND && telnetCheckAddress(address)) {
50+
LOGGER.warn("[{}] path does not provide, tcp check address ready!", path);
51+
addressManager.recordSuccessState(address);
52+
}
53+
} catch (IOException e) {
54+
LOGGER.error("check isolation address [{}] available error!", address);
55+
}
56+
}
57+
58+
private static boolean telnetCheckAddress(String address) {
59+
URI ipPort = parseIpPortFromURI(address);
60+
if (ipPort == null) {
61+
return false;
62+
}
63+
try (Socket s = new Socket()) {
64+
s.connect(new InetSocketAddress(ipPort.getHost(), ipPort.getPort()), 3000);
65+
return true;
66+
} catch (IOException e) {
67+
LOGGER.warn("ping endpoint {} failed, It will be quarantined again.", address);
68+
}
69+
return false;
70+
}
71+
72+
private static URI parseIpPortFromURI(String address) {
73+
try {
74+
return new URI(address);
75+
} catch (URISyntaxException e) {
76+
LOGGER.error("build uri error with address [{}].", address);
77+
return null;
78+
}
79+
}
80+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public void recordStateTest() throws ExecutionException {
101101
Assertions.assertEquals("http://127.0.0.3:30100", addressManager.address());
102102

103103
// test fail 2 times ,it will not be isolated
104-
addressManager.recordSuccessState(address);
104+
addressManager.resetFailureStatus(address);
105105
Assertions.assertEquals("http://127.0.0.3:30100", addressManager.address());
106106

107107
// test recodeStatus times
@@ -115,7 +115,7 @@ public void recordStateTest() throws ExecutionException {
115115
Assertions.assertEquals("http://127.0.0.4:30100", addressManager.address());
116116

117117
// test restore isolation
118-
addressManager.recoverIsolatedAddress("http://127.0.0.3:30100");
118+
addressManager.recordSuccessState("http://127.0.0.3:30100");
119119
Assertions.assertEquals("http://127.0.0.3:30100", addressManager.address());
120120
Assertions.assertEquals("http://127.0.0.3:30100", addressManager.address());
121121
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ public void checkIsolationAddressAvailable() {
561561
return;
562562
}
563563
for (String address : isolationAddresses) {
564-
httpClient.checkAddressAvailable("/registry/microservices", null, null, address);
564+
httpClient.checkAddressAvailable(address);
565565
}
566566
}
567567
}

0 commit comments

Comments
 (0)