This is an automated email from the ASF dual-hosted git repository.
hefengen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 7bc5b2cf09 [type:fix] fixing e2e chunk header error (#5593)
7bc5b2cf09 is described below
commit 7bc5b2cf09f0940a0696c8586a6d0fa186415b21
Author: aias00 <[email protected]>
AuthorDate: Wed Jul 10 18:48:10 2024 +0800
[type:fix] fixing e2e chunk header error (#5593)
* debug for fixing e2e chunck header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* debug for fixing e2e chunk header error
* ShenYu Admin Cluster, add ignore list properties
* ShenYu Admin Cluster, add ignore list properties
* debug for fixing e2e chunk header error
* fix cluster e2e failure
* fix cluster e2e failure
* fix cluster e2e failure
* fix cluster e2e failure
* fix cluster e2e failure
* fix cluster e2e failure
* fix cluster e2e failure
* fix cluster e2e failure
* fix cluster e2e failure
* Update ClusterProperties.java
* add restTemplate bean name
* add comment
---------
Co-authored-by: moremind <[email protected]>
---
.../shenyu/admin/config/ClusterConfiguration.java | 10 +-
.../admin/config/properties/ClusterProperties.java | 72 +++++++++-
.../listener/websocket/WebsocketCollector.java | 4 +-
.../mode/cluster/filter/ClusterForwardFilter.java | 50 +++++--
.../jdbc/ClusterSelectMasterServiceJdbcImpl.java | 10 +-
.../mode/cluster/service/ShenyuClusterService.java | 4 +-
shenyu-admin/src/main/resources/application.yml | 7 +
.../shenyu/alert/config/RestTemplateConfig.java | 2 +-
.../alert/strategy/AbstractAlertNotifyHandler.java | 2 +-
.../e2e/testcase/cluster/DividePluginCases.java | 3 +
.../e2e/testcase/cluster/DividePluginTest.java | 3 +
.../shenyu/e2e/client/admin/AdminClient.java | 160 +++++++++++----------
.../apache/shenyu/e2e/engine/ShenYuExtension.java | 2 +-
.../springcloud/cache/ServiceInstanceCache.java | 3 +
.../listener/SpringCloudHeartBeatListener.java | 3 +
.../websocket/client/ShenyuWebsocketClient.java | 6 +-
16 files changed, 240 insertions(+), 101 deletions(-)
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/ClusterConfiguration.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/ClusterConfiguration.java
index 9768c5cb3c..bcb7b1b982 100644
---
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/ClusterConfiguration.java
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/ClusterConfiguration.java
@@ -32,6 +32,8 @@ import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import
org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
/**
* The type Cluster configuration.
@@ -69,11 +71,15 @@ public class ClusterConfiguration {
/**
* Shenyu cluster forward filter.
*
+ * @param clusterProperties cluster properties
* @return the Shenyu cluster forward filter
*/
@Bean
- public ClusterForwardFilter clusterForwardFilter() {
- return new ClusterForwardFilter();
+ public ClusterForwardFilter clusterForwardFilter(final ClusterProperties
clusterProperties) {
+ SimpleClientHttpRequestFactory factory = new
SimpleClientHttpRequestFactory();
+ factory.setConnectTimeout(clusterProperties.getConnectionTimeout());
+ factory.setReadTimeout(clusterProperties.getReadTimeout());
+ return new ClusterForwardFilter(new RestTemplate(factory));
}
}
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/properties/ClusterProperties.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/properties/ClusterProperties.java
index 589b72d181..cc38863f3b 100644
---
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/properties/ClusterProperties.java
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/config/properties/ClusterProperties.java
@@ -17,6 +17,7 @@
package org.apache.shenyu.admin.config.properties;
+import com.google.common.collect.Lists;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
@@ -42,10 +43,25 @@ public class ClusterProperties {
*/
private String schema = "http";
+ /**
+ * the connectionTimeout.
+ */
+ private int connectionTimeout = 6000;
+
+ /**
+ * the readTimeout.
+ */
+ private int readTimeout = 6000;
+
/**
* cluster forward uri list.
*/
- private List<String> forwardList;
+ private List<String> forwardList = Lists.newArrayList();
+
+ /**
+ * cluster forward ignore uri list.
+ */
+ private List<String> ignoredList = Lists.newArrayList();
/**
* cluster select master task period.
@@ -111,6 +127,42 @@ public class ClusterProperties {
this.schema = schema;
}
+ /**
+ * Get connection timeout.
+ *
+ * @return connectionTimeout
+ */
+ public int getConnectionTimeout() {
+ return connectionTimeout;
+ }
+
+ /**
+ * Set connection timeout.
+ *
+ * @param connectionTimeout connectionTimeout
+ */
+ public void setConnectionTimeout(final int connectionTimeout) {
+ this.connectionTimeout = connectionTimeout;
+ }
+
+ /**
+ * Get readTimeout.
+ *
+ * @return readTimeout
+ */
+ public int getReadTimeout() {
+ return readTimeout;
+ }
+
+ /**
+ * Set readTimeout.
+ *
+ * @param readTimeout readTimeout
+ */
+ public void setReadTimeout(final int readTimeout) {
+ this.readTimeout = readTimeout;
+ }
+
/**
* Gets the value of forwardList.
*
@@ -129,6 +181,24 @@ public class ClusterProperties {
this.forwardList = forwardList;
}
+ /**
+ * Get the ignore list.
+ *
+ * @return the ignore list
+ */
+ public List<String> getIgnoredList() {
+ return ignoredList;
+ }
+
+ /**
+ * Set the ignore list.
+ *
+ * @param ignoredList the ignore list
+ */
+ public void setIgnoredList(final List<String> ignoredList) {
+ this.ignoredList = ignoredList;
+ }
+
/**
* Gets the select master task period.
*
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/websocket/WebsocketCollector.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/websocket/WebsocketCollector.java
index a5a54bc841..ab21de5d17 100644
---
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/websocket/WebsocketCollector.java
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/websocket/WebsocketCollector.java
@@ -99,7 +99,9 @@ public class WebsocketCollector {
}
if (Objects.equals(message, DataEventTypeEnum.RUNNING_MODE.name())) {
- LOG.info("websocket fetching running mode info...");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("websocket fetching running mode info...");
+ }
// check if this node is master
boolean isMaster = true;
String runningMode = RunningModeEnum.STANDALONE.name();
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/filter/ClusterForwardFilter.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/filter/ClusterForwardFilter.java
index 48c6dc1423..4a20722b58 100644
---
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/filter/ClusterForwardFilter.java
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/filter/ClusterForwardFilter.java
@@ -57,8 +57,7 @@ public class ClusterForwardFilter extends
OncePerRequestFilter {
private static final PathMatcher PATH_MATCHER = new AntPathMatcher();
- @Resource
- private RestTemplate restTemplate;
+ private final RestTemplate restTemplate;
@Resource
private ClusterSelectMasterService clusterSelectMasterService;
@@ -66,30 +65,59 @@ public class ClusterForwardFilter extends
OncePerRequestFilter {
@Resource
private ClusterProperties clusterProperties;
+ public ClusterForwardFilter(final RestTemplate restTemplate) {
+ this.restTemplate = restTemplate;
+ }
+
@Override
protected void doFilterInternal(@NotNull final HttpServletRequest request,
@NotNull final HttpServletResponse
response,
@NotNull final FilterChain filterChain)
throws ServletException, IOException {
String method = request.getMethod();
+
+ String uri = request.getRequestURI();
+ String requestContextPath = request.getContextPath();
+ String simpleUri = uri.replaceAll(requestContextPath, "");
+
if (StringUtils.equals(HttpMethod.OPTIONS.name(), method)) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("method is OPTIONS or GET, no forward :{}",
simpleUri);
+ }
filterChain.doFilter(request, response);
return;
}
if (clusterSelectMasterService.isMaster()) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("this node is master, no forward :{}", simpleUri);
+ }
filterChain.doFilter(request, response);
return;
}
// this node is not master
- String uri = request.getRequestURI();
- String requestContextPath = request.getContextPath();
- String replaced = uri.replaceAll(requestContextPath, "");
- boolean anyMatch = clusterProperties.getForwardList()
- .stream().anyMatch(x -> PATH_MATCHER.match(x, replaced));
- if (!anyMatch) {
+
+ // check whether the uri should be ignored
+ boolean shouldIgnore = clusterProperties.getIgnoredList()
+ .stream().anyMatch(x -> PATH_MATCHER.match(x, simpleUri));
+ if (shouldIgnore) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("shouldIgnore, no forward :{}", simpleUri);
+ }
filterChain.doFilter(request, response);
return;
}
+
+ // check whether the uri should be forwarded
+ boolean shouldForward = clusterProperties.getForwardList()
+ .stream().anyMatch(x -> PATH_MATCHER.match(x, simpleUri));
+ if (!shouldForward) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("!shouldForward, no forward :{}", simpleUri);
+ }
+ filterChain.doFilter(request, response);
+ return;
+ }
+
// cluster forward request to master
forwardRequest(request, response);
}
@@ -98,7 +126,9 @@ public class ClusterForwardFilter extends
OncePerRequestFilter {
final HttpServletResponse response) throws
IOException {
String targetUrl = getForwardingUrl(request);
- LOG.info("forwarding current uri: {} method: {} request to target url:
{}", request.getRequestURI(), request.getMethod(), targetUrl);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("forwarding current uri: {} method: {} request to target
url: {}", request.getRequestURI(), request.getMethod(), targetUrl);
+ }
// Create request entity
HttpHeaders headers = new HttpHeaders();
// Copy request headers
@@ -106,7 +136,7 @@ public class ClusterForwardFilter extends
OncePerRequestFilter {
HttpEntity<byte[]> requestEntity = new HttpEntity<>(getBody(request),
headers);
// Send request
ResponseEntity<byte[]> responseEntity =
restTemplate.exchange(targetUrl, HttpMethod.valueOf(request.getMethod()),
requestEntity, byte[].class);
-
+
// Set response status and headers
response.setStatus(responseEntity.getStatusCodeValue());
// Copy response headers
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/impl/jdbc/ClusterSelectMasterServiceJdbcImpl.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/impl/jdbc/ClusterSelectMasterServiceJdbcImpl.java
index 02854d6cf0..67ccece4c3 100644
---
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/impl/jdbc/ClusterSelectMasterServiceJdbcImpl.java
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/impl/jdbc/ClusterSelectMasterServiceJdbcImpl.java
@@ -33,6 +33,9 @@ import java.time.LocalDateTime;
import java.util.Objects;
import java.util.concurrent.locks.Lock;
+/**
+ * The cluster select master service jdbc impl.
+ */
public class ClusterSelectMasterServiceJdbcImpl implements
ClusterSelectMasterService {
private static final Logger LOG =
LoggerFactory.getLogger(ClusterSelectMasterServiceJdbcImpl.class);
@@ -92,7 +95,12 @@ public class ClusterSelectMasterServiceJdbcImpl implements
ClusterSelectMasterSe
@Override
public boolean checkMasterStatus() throws IllegalStateException {
if (masterFlag) {
- jdbcLockRegistry.renewLock(MASTER_LOCK_KEY);
+ try {
+ jdbcLockRegistry.renewLock(MASTER_LOCK_KEY);
+ } catch (IllegalStateException e) {
+ masterFlag = false;
+ throw e;
+ }
}
return masterFlag;
}
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/service/ShenyuClusterService.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/service/ShenyuClusterService.java
index c009d9e35b..0430202159 100644
---
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/service/ShenyuClusterService.java
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mode/cluster/service/ShenyuClusterService.java
@@ -97,7 +97,9 @@ public class ShenyuClusterService implements
ShenyuRunningModeService {
renewed = shenyuClusterSelectMasterService.checkMasterStatus();
if (renewed) {
- LOG.info("renew master success");
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("renew master success");
+ }
}
}
} catch (Exception e) {
diff --git a/shenyu-admin/src/main/resources/application.yml
b/shenyu-admin/src/main/resources/application.yml
index 5201bc1f8f..dd8bbdef7b 100755
--- a/shenyu-admin/src/main/resources/application.yml
+++ b/shenyu-admin/src/main/resources/application.yml
@@ -115,6 +115,13 @@ shenyu:
cluster:
enabled: false
type: jdbc
+ connectionTimeout: 15000
+ readTimeout: 15000
+ ignored-list:
+ - /selector/list/**
+ - /appAuth/list/**
+ - /plugin/list/**
+ - /rule/list/**
forward-list:
- /shenyu-client/**
- /configs/**
diff --git
a/shenyu-alert/src/main/java/org/apache/shenyu/alert/config/RestTemplateConfig.java
b/shenyu-alert/src/main/java/org/apache/shenyu/alert/config/RestTemplateConfig.java
index 1fb10db2d5..00cf7cf320 100644
---
a/shenyu-alert/src/main/java/org/apache/shenyu/alert/config/RestTemplateConfig.java
+++
b/shenyu-alert/src/main/java/org/apache/shenyu/alert/config/RestTemplateConfig.java
@@ -36,7 +36,7 @@ public class RestTemplateConfig {
* @param factory ClientHttpRequestFactory
* @return RestTemplate
*/
- @Bean
+ @Bean(name = "alterRestTemplate")
public RestTemplate restTemplate(final ClientHttpRequestFactory factory) {
RestTemplate restTemplate = new RestTemplate(factory);
restTemplate.setInterceptors(Collections.singletonList(new
HeaderRequestInterceptor()));
diff --git
a/shenyu-alert/src/main/java/org/apache/shenyu/alert/strategy/AbstractAlertNotifyHandler.java
b/shenyu-alert/src/main/java/org/apache/shenyu/alert/strategy/AbstractAlertNotifyHandler.java
index 67a43d4d2c..29e6f387a1 100644
---
a/shenyu-alert/src/main/java/org/apache/shenyu/alert/strategy/AbstractAlertNotifyHandler.java
+++
b/shenyu-alert/src/main/java/org/apache/shenyu/alert/strategy/AbstractAlertNotifyHandler.java
@@ -38,7 +38,7 @@ abstract class AbstractAlertNotifyHandler implements
AlertNotifyHandler {
@Resource
private TemplateEngine templateEngine;
- @Resource
+ @Resource(name = "alterRestTemplate")
private RestTemplate restTemplate;
protected String renderContent(final AlarmContent alert) {
diff --git
a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-cluster/src/test/java/org/apache/shenyue/e2e/testcase/cluster/DividePluginCases.java
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-cluster/src/test/java/org/apache/shenyue/e2e/testcase/cluster/DividePluginCases.java
index e91ab95dc8..6c040abc86 100644
---
a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-cluster/src/test/java/org/apache/shenyue/e2e/testcase/cluster/DividePluginCases.java
+++
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-cluster/src/test/java/org/apache/shenyue/e2e/testcase/cluster/DividePluginCases.java
@@ -42,6 +42,9 @@ import static
org.apache.shenyu.e2e.template.ResourceDataTemplate.newSelectorBui
import static
org.apache.shenyu.e2e.template.ResourceDataTemplate.newUpstreamsBuilder;
import static org.hamcrest.text.IsEmptyString.isEmptyOrNullString;
+/**
+ * Testing Cluster Divide plugin testcases.
+ */
public class DividePluginCases implements ShenYuScenarioProvider {
private static final String ANYTHING = "/anything";
diff --git
a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-cluster/src/test/java/org/apache/shenyue/e2e/testcase/cluster/DividePluginTest.java
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-cluster/src/test/java/org/apache/shenyue/e2e/testcase/cluster/DividePluginTest.java
index d40b23815d..82ec02eb56 100644
---
a/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-cluster/src/test/java/org/apache/shenyue/e2e/testcase/cluster/DividePluginTest.java
+++
b/shenyu-e2e/shenyu-e2e-case/shenyu-e2e-case-cluster/src/test/java/org/apache/shenyue/e2e/testcase/cluster/DividePluginTest.java
@@ -38,6 +38,9 @@ import org.junit.jupiter.api.BeforeEach;
import java.util.List;
import java.util.Objects;
+/**
+ * Testing Cluster Divide plugin.
+ */
@ShenYuTest(environments = {
@ShenYuTest.Environment(
serviceName = "shenyu-e2e-admin",
diff --git
a/shenyu-e2e/shenyu-e2e-client/src/main/java/org/apache/shenyu/e2e/client/admin/AdminClient.java
b/shenyu-e2e/shenyu-e2e-client/src/main/java/org/apache/shenyu/e2e/client/admin/AdminClient.java
index 97e4c1f16f..32db0cd87d 100644
---
a/shenyu-e2e/shenyu-e2e-client/src/main/java/org/apache/shenyu/e2e/client/admin/AdminClient.java
+++
b/shenyu-e2e/shenyu-e2e-client/src/main/java/org/apache/shenyu/e2e/client/admin/AdminClient.java
@@ -55,8 +55,8 @@ import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
@@ -71,38 +71,38 @@ import static
org.apache.shenyu.e2e.model.data.SearchCondition.QUERY_ALL;
*/
@ShenYuAdminClient
public class AdminClient extends BaseClient {
-
+
private static final Logger log =
LoggerFactory.getLogger(AdminClient.class);
-
+
private static final TypeReference<PaginatedResources<PluginDTO>>
PAGINATED_PLUGINS_TYPE_REFERENCE = new
TypeReference<PaginatedResources<PluginDTO>>() {
};
-
+
private static final TypeReference<SearchedResources<SelectorDTO>>
SEARCHED_SELECTORS_TYPE_REFERENCE = new
TypeReference<SearchedResources<SelectorDTO>>() {
};
-
+
private static final TypeReference<SearchedResources<RuleDTO>>
SEARCHED_RULES_TYPE_REFERENCE = new TypeReference<SearchedResources<RuleDTO>>()
{
};
-
+
private static final TypeReference<SearchedResources<FakeResourceDTO>>
FAKE_VALUE_TYPE = new TypeReference<SearchedResources<FakeResourceDTO>>() {
};
-
+
private static final TypeReference<List<MetaDataDTO>>
SEARCHED_METADATAS_TYPE_REFERENCE = new TypeReference<List<MetaDataDTO>>() {
};
-
+
private final MultiValueMap<String, String> basicAuth = new HttpHeaders();
-
+
private final RestTemplate template = new RestTemplate();
-
+
private final ObjectMapper mapper = new ObjectMapper();
-
+
private final String scenarioId;
-
+
private final String baseURL;
-
+
private String serviceName;
-
+
private final ImmutableMap<String, String> loginInfo;
-
+
public AdminClient(final String scenarioId, final String serviceName,
final String baseURL, final Properties properties) {
super(serviceName);
Preconditions.checkArgument(properties.containsKey("username"),
"Property username does not exist");
@@ -115,20 +115,19 @@ public class AdminClient extends BaseClient {
.put("password", properties.getProperty("password"))
.build();
}
-
+
/**
* Login to ShenYu Admin and cache the token.
*/
public void login() {
final String url = baseURL +
"/platform/login?userName={username}&password={password}";
- log.info("login, url:{}", url);
ResponseEntity<ShenYuResult> response = template.getForEntity(
url,
ShenYuResult.class,
loginInfo
);
ShenYuResult rst = assertAndGet(response, "login dashboard user
success");
-
+
String token = Assertions.assertDoesNotThrow(() ->
rst.toObject(LoginInfo.class).getToken(), "checking to cast common");
Assertions.assertNotNull(token, "checking token not null");
Assertions.assertNotEquals("", token, "checking token not empty");
@@ -136,7 +135,7 @@ public class AdminClient extends BaseClient {
Plugin.check(listPlugins());
}
-
+
/**
* List all plugins.
*
@@ -144,7 +143,7 @@ public class AdminClient extends BaseClient {
*/
public List<PluginDTO> listPlugins() {
List<PluginDTO> result = Lists.newArrayList();
-
+
int cur = 1;
int total;
do {
@@ -157,18 +156,18 @@ public class AdminClient extends BaseClient {
30
);
ShenYuResult rst = assertAndGet(response, "query success");
-
+
PaginatedResources<PluginDTO> pagination =
Assertions.assertDoesNotThrow(
() -> mapper.readValue(rst.getData().traverse(),
PAGINATED_PLUGINS_TYPE_REFERENCE),
- "checking cast to PaginatedResources<T>"
+ "checking cast to PaginatedResources<T>"
);
result.addAll(pagination.getDataList());
-
+
total = pagination.getPage().getTotalPage();
} while (++cur < total);
return result;
}
-
+
/**
* List all existence selectors.
*
@@ -180,7 +179,7 @@ public class AdminClient extends BaseClient {
.build();
return list("/selector/list/search", condition,
SEARCHED_SELECTORS_TYPE_REFERENCE, v -> v);
}
-
+
/**
* List all existence rules.
*
@@ -192,21 +191,22 @@ public class AdminClient extends BaseClient {
.build();
return list("/rule/list/search", condition,
SEARCHED_RULES_TYPE_REFERENCE, v -> v);
}
-
+
/**
* all meta data list.
+ *
* @return List
*/
public List<MetaDataDTO> listAllMetaData() {
return getMetaDataList("/meta-data/findAll",
SEARCHED_METADATAS_TYPE_REFERENCE, v -> v);
}
-
+
private <T extends ResourceDTO, OUT> List<OUT> list(final String uri,
final QueryCondition condition, final TypeReference<SearchedResources<T>>
valueType, final Mapper<T, OUT> mapper) {
List<OUT> result = Lists.newArrayList();
-
+
int curPage = 1;
int total;
-
+
do {
SearchedResources<T> resources = search(uri, curPage, 20,
condition, valueType);
resources.getList().stream()
@@ -214,10 +214,10 @@ public class AdminClient extends BaseClient {
.forEach(result::add);
total = resources.getPages();
} while (++curPage <= total);
-
+
return result;
}
-
+
private <T extends ResourceDTO, OUT> List<OUT> getMetaDataList(final
String uri, final TypeReference<List<T>> valueType, final Mapper<T, OUT>
mapper) {
List<OUT> result = Lists.newArrayList();
List<T> resources = getSearch(uri, valueType);
@@ -226,9 +226,10 @@ public class AdminClient extends BaseClient {
.forEach(result::add);
return result;
}
-
+
/**
* Fetch the selectors by the given conditions.
+ *
* @param keyword expected selectors included the word. return all if
absent.
* @param plugins expected selectors under specified plugins. return all
if absent.
* @return paginated info with list of {@link SelectorDTO}s
@@ -241,9 +242,10 @@ public class AdminClient extends BaseClient {
.build();
return search("/selector/list/search", condition,
SEARCHED_SELECTORS_TYPE_REFERENCE);
}
-
+
/**
* Fetch the selectors by the given conditions.
+ *
* @param keyword expected selectors included the word. return all if
absent.
* @param page page.
* @param pageSize size.
@@ -258,11 +260,11 @@ public class AdminClient extends BaseClient {
.build();
return search("/selector/list/search", page, pageSize, condition,
SEARCHED_SELECTORS_TYPE_REFERENCE);
}
-
+
/**
* Fetch the rules by the given conditions.
*
- * @param keyword expected selectors included the word. return all if
absent.
+ * @param keyword expected selectors included the word. return all if
absent.
* @param selectors expected selectors under specified plugins. return all
if absent.
* @return paginated info with list of {@link RuleDTO}s
*/
@@ -274,40 +276,41 @@ public class AdminClient extends BaseClient {
.build();
return search("/rule/list/search", condition,
SEARCHED_RULES_TYPE_REFERENCE);
}
-
+
private <T extends ResourceDTO> SearchedResources<T> search(final String
uri, final QueryCondition condition, final TypeReference<SearchedResources<T>>
valueType) {
return search(uri, 1, 10, condition, valueType);
}
-
+
private <T extends ResourceDTO> SearchedResources<T> search(final String
uri, final int pageNum, final int pageSize,
final
QueryCondition condition, final TypeReference<SearchedResources<T>> valueType) {
SearchCondition searchCondition = SearchCondition.builder()
- .pageNum(pageNum)
- .pageSize(pageSize)
- .condition(condition)
- .build();
-
+ .pageNum(pageNum)
+ .pageSize(pageSize)
+ .condition(condition)
+ .build();
+
HttpEntity<SearchCondition> entity = new HttpEntity<>(searchCondition,
basicAuth);
ResponseEntity<ShenYuResult> response = template.postForEntity(baseURL
+ uri, entity, ShenYuResult.class);
ShenYuResult rst = assertAndGet(response, "query success");
-
+
return Assertions.assertDoesNotThrow(
() -> mapper.readValue(rst.getData().traverse(), valueType),
- "checking cast to SearchedResources<T>"
+ "checking cast to SearchedResources<T>"
);
}
-
+
private <T extends ResourceDTO> List<T> getSearch(final String uri, final
TypeReference<List<T>> valueType) {
ResponseEntity<ShenYuResult> response = template.exchange(baseURL +
uri, HttpMethod.GET, new HttpEntity<>(basicAuth), ShenYuResult.class);
ShenYuResult rst = assertAndGet(response, "query success");
return Assertions.assertDoesNotThrow(
() -> mapper.readValue(rst.getData().traverse(), valueType),
- "checking cast to SearchedResources<T>"
+ "checking cast to SearchedResources<T>"
);
}
-
+
/**
* create selectorDTO.
+ *
* @param selector selector
* @return SelectorDTO
*/
@@ -316,9 +319,10 @@ public class AdminClient extends BaseClient {
Selectors.INSTANCE.put(selector.getName(), dto.getId());
return dto;
}
-
+
/**
* Create Rule.
+ *
* @param rule rule
* @return RuleDTO
*/
@@ -327,7 +331,7 @@ public class AdminClient extends BaseClient {
Rules.INSTANCE.put(rule.getName(), dto.getId());
return dto;
}
-
+
@SuppressWarnings("unchecked")
private <T extends ResourceData, R extends ResourceDTO> R create(final
String uri, final T data) {
log.info("trying to create resource({}) name: {}",
data.getClass().getSimpleName(), data.getName());
@@ -351,16 +355,17 @@ public class AdminClient extends BaseClient {
}
Assertions.assertNotNull(searchedResources, "checking
searchedResources object is non-null");
Assertions.assertEquals(1, searchedResources.getTotal(), "checking the
total hits of searching");
-
+
ResourceDTO created = searchedResources.getList().get(0);
Assertions.assertNotNull(created, "checking created object is
non-null");
log.info("create resource({}) successful. name: {}, id: {}",
data.getClass().getSimpleName(), data.getName(), created.getId());
return (R) created;
}
-
+
/**
* bindingData.
+ *
* @param bindingData bindingData
*/
public void bindingData(final BindingData bindingData) {
@@ -377,7 +382,7 @@ public class AdminClient extends BaseClient {
public void deleteSelectors(final List<String> ids) {
delete("/selector/batch", ids);
}
-
+
/**
* Delete selectors in batch.
*
@@ -386,7 +391,7 @@ public class AdminClient extends BaseClient {
public void deleteSelectors(final String... ids) {
delete("/selector/batch", Lists.newArrayList(ids));
}
-
+
/**
* Delete rules in batch.
*
@@ -395,14 +400,14 @@ public class AdminClient extends BaseClient {
public void deleteRules(final String... ids) {
delete("/rule/batch", Lists.newArrayList(ids));
}
-
+
/**
* Delete all selectors.
*/
public void deleteAllSelectors() {
deleteAll("/selector/batch");
}
-
+
/**
* Delete all rules under given id of selector.
*
@@ -412,70 +417,71 @@ public class AdminClient extends BaseClient {
List<String> ids = searchRules(null,
selectorId).getList().stream().map(RuleDTO::getId).collect(Collectors.toList());
deleteRules(ids.toArray(new String[]{}));
}
-
+
private void deleteAll(final String uri) {
Preconditions.checkArgument(uri.endsWith("/batch"), "uri[{}] must be
end with '/batch'", uri);
-
+
String listAllResourcesUrl = uri.replace("/batch", "") +
"/list/search";
List<String> ids = list(listAllResourcesUrl, QUERY_ALL,
FAKE_VALUE_TYPE, FakeResourceDTO::getId);
-
+
delete(uri, ids);
List<FakeResourceDTO> result = list(listAllResourcesUrl, QUERY_ALL,
FAKE_VALUE_TYPE, v -> v);
Assertions.assertEquals(0, result.size(), "resource list is empty
after deleted");
}
-
+
private void delete(final String uri, final List<String> ids) {
if (ids.isEmpty()) {
log.info("delete resources, effected size: 0, cause by: there is
not resources in ShenYuAdmin");
return;
}
-
+
HttpEntity<List<String>> entity = new HttpEntity<>(ids, basicAuth);
ResponseEntity<ShenYuResult> response = template.exchange(baseURL +
uri, HttpMethod.DELETE, entity, ShenYuResult.class);
ShenYuResult rst = assertAndGet(response, "delete success");
Integer deleted = Assertions.assertDoesNotThrow(() ->
rst.toObject(Integer.class), "checking to cast object");
Assertions.assertEquals(ids.size(), deleted, "checking deleted
records");
-
+
log.info("delete resources, effected size: {}, effected rows: {}",
ids.size(), ids);
}
-
+
/**
* Fetch Selector by given id.
+ *
* @param id of selector that needs to fetch
* @return {@link SelectorDTO}
*/
public SelectorDTO getSelector(final String id) {
return getResource("/selector", id, SelectorDTO.class);
}
-
+
private <T extends ResourceDTO> T getResource(final String uri, final
String id, final Class<T> valueType) {
ResponseEntity<ShenYuResult> response = template.exchange(baseURL +
uri + "/{id}", HttpMethod.GET, new HttpEntity<>(basicAuth), ShenYuResult.class,
id);
Assertions.assertEquals(HttpStatus.OK, response.getStatusCode(),
"checking http status");
-
+
ShenYuResult rst = response.getBody();
Assertions.assertNotNull(rst, "checking http response body");
-
+
if (rst.getCode() == 500) {
Assertions.assertTrue(rst.getMessage().contains("selector is not
existed"), "checking shenyu result message");
return null;
}
-
+
Assertions.assertEquals("detail success", rst.getMessage(), "checking
shenyu result message");
Assertions.assertEquals(200, rst.getCode(), "checking shenyu result
code");
return Assertions.assertDoesNotThrow(() -> rst.toObject(valueType),
"checking cast data to " + valueType.getSimpleName());
}
-
+
private ShenYuResult assertAndGet(final ResponseEntity<ShenYuResult>
response, final String message) {
Assertions.assertEquals(HttpStatus.OK, response.getStatusCode(),
"checking http status");
-
+
ShenYuResult rst = response.getBody();
Assertions.assertNotNull(rst, "checking http response body");
Assertions.assertEquals(200, rst.getCode(), "checking shenyu result
code");
Assertions.assertEquals(message, rst.getMessage(), "checking shenyu
result message");
-
+
return rst;
}
-
+
/**
* change plugin status.
*
@@ -485,7 +491,7 @@ public class AdminClient extends BaseClient {
public void changePluginStatus(final String id, final
MultiValueMap<String, String> formData) {
putResource("/plugin", id, PluginDTO.class, formData);
}
-
+
private <T extends ResourceDTO> T putResource(final String uri, final
String id, final Class<T> valueType, final MultiValueMap<String, String>
formData) {
HttpEntity<MultiValueMap<String, String>> requestEntity = new
HttpEntity<>(formData, basicAuth);
ResponseEntity<ShenYuResult> response = template.exchange(baseURL +
uri + "/" + id, HttpMethod.PUT, requestEntity, ShenYuResult.class);
@@ -494,7 +500,7 @@ public class AdminClient extends BaseClient {
Assertions.assertNotNull(rst, "checking http response body");
return Assertions.assertDoesNotThrow(() -> rst.toObject(valueType),
"checking cast data to " + valueType.getSimpleName());
}
-
+
/**
* change plugin status.
*
@@ -509,7 +515,7 @@ public class AdminClient extends BaseClient {
throw new RuntimeException(e);
}
}
-
+
private void putResourceByJson(final String uri, final String id, final
String json) {
basicAuth.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);
HttpEntity<String> requestEntity = new HttpEntity<>(json, basicAuth);
@@ -519,7 +525,7 @@ public class AdminClient extends BaseClient {
Assertions.assertNotNull(rst, "checking http response body");
basicAuth.remove("Content-Type");
}
-
+
/**
* sync all plugin.
*/
@@ -528,10 +534,10 @@ public class AdminClient extends BaseClient {
template.postForEntity(baseURL + "/plugin/syncPluginAll", entity,
ShenYuResult.class);
log.warn("admin syncPluginAll");
}
-
+
@FunctionalInterface
interface Mapper<I, O> extends Function<I, O> {
-
+
}
-
+
}
diff --git
a/shenyu-e2e/shenyu-e2e-engine/src/main/java/org/apache/shenyu/e2e/engine/ShenYuExtension.java
b/shenyu-e2e/shenyu-e2e-engine/src/main/java/org/apache/shenyu/e2e/engine/ShenYuExtension.java
index 0d6055ee05..e6e43d3c56 100644
---
a/shenyu-e2e/shenyu-e2e-engine/src/main/java/org/apache/shenyu/e2e/engine/ShenYuExtension.java
+++
b/shenyu-e2e/shenyu-e2e-engine/src/main/java/org/apache/shenyu/e2e/engine/ShenYuExtension.java
@@ -77,7 +77,7 @@ public class ShenYuExtension implements BeforeAllCallback,
ExecutionCondition, A
});
// FIXME check service is available
for (ShenYuTest.Environment environment : environments) {
- if (!SocketUtils.checkUrl(environment.service().baseUrl(),
10000)) {
+ if (!SocketUtils.checkUrl(environment.service().baseUrl(),
15000)) {
throw new AssertionFailedError(environment.serviceName() +
":" + environment.service().baseUrl() + " is not available");
//return
ConditionEvaluationResult.disabled(environment.serviceName() + ":" +
environment.service().baseUrl() + " is not available");
}
diff --git
a/shenyu-plugin/shenyu-plugin-proxy/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/cache/ServiceInstanceCache.java
b/shenyu-plugin/shenyu-plugin-proxy/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/cache/ServiceInstanceCache.java
index 1f3e40f680..4fb502e331 100644
---
a/shenyu-plugin/shenyu-plugin-proxy/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/cache/ServiceInstanceCache.java
+++
b/shenyu-plugin/shenyu-plugin-proxy/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/cache/ServiceInstanceCache.java
@@ -26,6 +26,9 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
+/**
+ * the Service Instance Cache.
+ */
public class ServiceInstanceCache {
private static final Map<String, List<ServiceInstance>>
SERVICE_INSTANCE_MAP = Maps.newConcurrentMap();
diff --git
a/shenyu-plugin/shenyu-plugin-proxy/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/listener/SpringCloudHeartBeatListener.java
b/shenyu-plugin/shenyu-plugin-proxy/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/listener/SpringCloudHeartBeatListener.java
index 57af0027b3..551521af5c 100644
---
a/shenyu-plugin/shenyu-plugin-proxy/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/listener/SpringCloudHeartBeatListener.java
+++
b/shenyu-plugin/shenyu-plugin-proxy/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/listener/SpringCloudHeartBeatListener.java
@@ -33,6 +33,9 @@ import org.springframework.context.ApplicationListener;
import java.util.List;
import java.util.Map;
+/**
+ * SpringCloud HeartBeat Listener.
+ */
public class SpringCloudHeartBeatListener implements
ApplicationListener<HeartbeatEvent> {
private static final Logger LOG =
LoggerFactory.getLogger(SpringCloudHeartBeatListener.class);
diff --git
a/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/client/ShenyuWebsocketClient.java
b/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/client/ShenyuWebsocketClient.java
index 13b04e8ef1..bf77c30325 100644
---
a/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/client/ShenyuWebsocketClient.java
+++
b/shenyu-sync-data-center/shenyu-sync-data-websocket/src/main/java/org/apache/shenyu/plugin/sync/data/websocket/client/ShenyuWebsocketClient.java
@@ -166,10 +166,6 @@ public final class ShenyuWebsocketClient extends
WebSocketClient {
}
this.masterUrl =
String.valueOf(jsonToMap.get(RunningModeConstants.MASTER_URL));
this.isConnectedToMaster =
Boolean.TRUE.equals(jsonToMap.get(RunningModeConstants.IS_MASTER));
- if (!isConnectedToMaster) {
- LOG.info("not connected to master, close now, master url:[{}],
current url:[{}]", masterUrl, this.getURI().toString());
- this.nowClose();
- }
} else {
handleResult(result);
}
@@ -210,7 +206,7 @@ public final class ShenyuWebsocketClient extends
WebSocketClient {
this.reconnectBlocking();
} else {
this.sendPing();
- send(DataEventTypeEnum.RUNNING_MODE.name());
+// send(DataEventTypeEnum.RUNNING_MODE.name());
LOG.debug("websocket send to [{}] ping message successful",
this.getURI());
}
} catch (Exception e) {