From 465ce1bc112866113bc43f5f6bfe004706ffb80a Mon Sep 17 00:00:00 2001 From: Haotian Zhang <928016560@qq.com> Date: Fri, 10 Feb 2023 16:26:45 +0800 Subject: [PATCH] fix:fix router parameter not checking bug. (#826) --- CHANGELOG.md | 1 + pom.xml | 2 +- .../cloud/polaris/util/OkHttpUtil.java | 65 +++++++++---------- ...arisRouterServiceInstanceListSupplier.java | 28 ++++---- .../endpoint/PolarisRouterEndpoint.java | 22 ++++--- spring-cloud-tencent-dependencies/pom.xml | 4 +- .../polaris/context/ServiceRuleManager.java | 7 +- 7 files changed, 68 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51bd7d9a1..14cf38591 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,3 +30,4 @@ - [fix:fix some compile output issues.](https://github.com/Tencent/spring-cloud-tencent/pull/814) - [Feature: upgrade framework version.](https://github.com/Tencent/spring-cloud-tencent/pull/815) - [fix:nacos & polaris discovery](https://github.com/Tencent/spring-cloud-tencent/pull/816) +- [fix:fix router parameter not checking bug.](https://github.com/Tencent/spring-cloud-tencent/pull/826) diff --git a/pom.xml b/pom.xml index 47f32a0e8..48e0fcac2 100644 --- a/pom.xml +++ b/pom.xml @@ -89,7 +89,7 @@ - 1.9.0-2021.0.5-SNAPSHOT + 1.9.0-2021.0.5 2021.0.5 diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/util/OkHttpUtil.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/util/OkHttpUtil.java index 77dd62f4a..1839a3101 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/util/OkHttpUtil.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/util/OkHttpUtil.java @@ -17,15 +17,18 @@ package com.tencent.cloud.polaris.util; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; import java.util.Map; -import java.util.Objects; +import java.util.concurrent.TimeUnit; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.Request; -import com.squareup.okhttp.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; + /** * okhttp util. * @@ -38,52 +41,46 @@ public final class OkHttpUtil { */ public final static Logger LOGGER = LoggerFactory.getLogger(OkHttpUtil.class); - /** - * client. - */ - private final static OkHttpClient HTTP_CLIENT = new OkHttpClient(); - private OkHttpUtil() { } /** * get request. - * @param url url + * @param path path * @param headers headers * @return response */ - public static boolean get(String url, Map headers) { + public static boolean get(String path, Map headers) { + HttpURLConnection conn = null; try { - Request.Builder builder = new Request.Builder(); - buildHeader(builder, headers); - Request request = builder.url(url).build(); - Response response = HTTP_CLIENT.newCall(request).execute(); + URL url = new java.net.URL(path); + conn = (HttpURLConnection) url.openConnection(); - if (response.isSuccessful() && Objects.nonNull(response.body())) { - String result = response.body().string(); - LOGGER.debug("exec get request, url: {} success, response data: {}", url, result); + conn.setRequestMethod("GET"); + conn.setConnectTimeout((int) TimeUnit.SECONDS.toMillis(2)); + conn.setReadTimeout((int) TimeUnit.SECONDS.toMillis(2)); + BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + StringBuffer buffer = new StringBuffer(); + String str; + while ((str = reader.readLine()) != null) { + buffer.append(str); + } + String responseBody = buffer.toString(); + if (conn.getResponseCode() == 200 && StringUtils.hasText(responseBody)) { + LOGGER.debug("exec get request, url: {} success, response data: {}", url, responseBody); return true; } } catch (Exception e) { - LOGGER.error("exec get request, url: {} failed!", url, e); + LOGGER.error("exec get request, url: {} failed!", path, e); + return false; } - return false; - } - - /** - * build header. - * @param builder builder - * @param headers headers - */ - private static void buildHeader(Request.Builder builder, Map headers) { - if (Objects.nonNull(headers) && headers.size() > 0) { - headers.forEach((k, v) -> { - if (Objects.nonNull(k) && Objects.nonNull(v)) { - builder.addHeader(k, v); - } - }); + finally { + if (null != conn) { + conn.disconnect(); + } } + return false; } } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java index b65a56303..b87b87e25 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java @@ -144,23 +144,25 @@ public class PolarisRouterServiceInstanceListSupplier extends DelegatingServiceI Flux> doRouter(Flux> allServers, PolarisRouterContext routerContext) { ServiceInstances serviceInstances = LoadBalancerUtils.transferServersToServiceInstances(allServers); - // filter instance by routers - ProcessRoutersRequest processRoutersRequest = buildProcessRoutersRequest(serviceInstances, routerContext); + List filteredInstances = new ArrayList<>(); + if (serviceInstances.getInstances().size() > 0) { + // filter instance by routers + ProcessRoutersRequest processRoutersRequest = buildProcessRoutersRequest(serviceInstances, routerContext); - // process request interceptors - processRouterRequestInterceptors(processRoutersRequest, routerContext); + // process request interceptors + processRouterRequestInterceptors(processRoutersRequest, routerContext); - // process router chain - ProcessRoutersResponse processRoutersResponse = routerAPI.processRouters(processRoutersRequest); + // process router chain + ProcessRoutersResponse processRoutersResponse = routerAPI.processRouters(processRoutersRequest); - // process response interceptors - processRouterResponseInterceptors(routerContext, processRoutersResponse); + // process response interceptors + processRouterResponseInterceptors(routerContext, processRoutersResponse); - // transfer polaris server to ServiceInstance - List filteredInstances = new ArrayList<>(); - ServiceInstances filteredServiceInstances = processRoutersResponse.getServiceInstances(); - for (Instance instance : filteredServiceInstances.getInstances()) { - filteredInstances.add(new PolarisServiceInstance(instance)); + // transfer polaris server to ServiceInstance + ServiceInstances filteredServiceInstances = processRoutersResponse.getServiceInstances(); + for (Instance instance : filteredServiceInstances.getInstances()) { + filteredInstances.add(new PolarisServiceInstance(instance)); + } } return Flux.fromIterable(Collections.singletonList(filteredInstances)); } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/endpoint/PolarisRouterEndpoint.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/endpoint/PolarisRouterEndpoint.java index 5326c8087..6fd47cf21 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/endpoint/PolarisRouterEndpoint.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/endpoint/PolarisRouterEndpoint.java @@ -36,6 +36,7 @@ import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.boot.actuate.endpoint.annotation.Selector; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; /** * Router actuator endpoint. @@ -54,20 +55,21 @@ public class PolarisRouterEndpoint { @ReadOperation public Map router(@Selector String dstService) { - List routerRules = serviceRuleManager.getServiceRouterRule(MetadataContext.LOCAL_NAMESPACE, - MetadataContext.LOCAL_SERVICE, dstService); - Map result = new HashMap<>(); - List rules = new LinkedList<>(); - result.put("routerRules", rules); + if (StringUtils.hasText(dstService)) { + List routerRules = serviceRuleManager.getServiceRouterRule(MetadataContext.LOCAL_NAMESPACE, + MetadataContext.LOCAL_SERVICE, dstService); + List rules = new LinkedList<>(); + result.put("routerRules", rules); - if (CollectionUtils.isEmpty(routerRules)) { - return result; - } + if (CollectionUtils.isEmpty(routerRules)) { + return result; + } - for (RoutingProto.Route route : routerRules) { - rules.add(parseRouterRule(route)); + for (RoutingProto.Route route : routerRules) { + rules.add(parseRouterRule(route)); + } } return result; diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index dfba9cb25..1e2e1dba5 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -70,10 +70,10 @@ - 1.9.0-2021.0.5-SNAPSHOT + 1.9.0-2021.0.5 - 1.10.2 + 1.10.5 31.0.1-jre 1.2.11 4.5.1 diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/ServiceRuleManager.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/ServiceRuleManager.java index 06d71f65c..6ace65e70 100644 --- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/ServiceRuleManager.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/ServiceRuleManager.java @@ -34,6 +34,8 @@ import com.tencent.polaris.client.flow.FlowControlParam; import com.tencent.polaris.client.flow.ResourcesResponse; import com.tencent.polaris.client.pb.RateLimitProto; import com.tencent.polaris.client.pb.RoutingProto; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * the manager of service governance rules. for example: rate limit rule, router rules. @@ -42,8 +44,8 @@ import com.tencent.polaris.client.pb.RoutingProto; */ public class ServiceRuleManager { + private static final Logger LOG = LoggerFactory.getLogger(ServiceRuleManager.class); private final SDKContext sdkContext; - private final FlowControlParam controlParam; public ServiceRuleManager(SDKContext sdkContext) { @@ -55,6 +57,7 @@ public class ServiceRuleManager { } public RateLimitProto.RateLimit getServiceRateLimitRule(String namespace, String service) { + LOG.debug("Get service rate limit rules with namespace:{} and service:{}.", namespace, service); ServiceEventKey serviceEventKey = new ServiceEventKey(new ServiceKey(namespace, service), ServiceEventKey.EventType.RATE_LIMITING); @@ -76,6 +79,8 @@ public class ServiceRuleManager { } public List getServiceRouterRule(String namespace, String sourceService, String dstService) { + LOG.debug("Get service router rules with namespace:{} and sourceService:{} and dstService:{}.", + namespace, sourceService, dstService); Set routerKeys = new HashSet<>(); ServiceEventKey dstSvcEventKey = new ServiceEventKey(new ServiceKey(namespace, dstService),