From b5d72c77e58d348afa538a7212c50ee91dbbb849 Mon Sep 17 00:00:00 2001 From: "chen.ma" Date: Wed, 29 Dec 2021 20:29:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9E=81=E7=AB=AF=E6=83=85=E5=86=B5=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E7=BA=BF=E7=A8=8B=E6=B1=A0=E5=8F=98=E6=9B=B4=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E4=BC=9A=E9=87=8D=E5=A4=8D=E8=AF=B7=E6=B1=82.=20(#47)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hippo4j/common/constant/Constants.java | 2 + .../config/service/ConfigServletInner.java | 48 +++++++++++++++++-- .../cn/hippo4j/starter/core/ClientWorker.java | 2 + 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/constant/Constants.java b/hippo4j-common/src/main/java/cn/hippo4j/common/constant/Constants.java index 0527ce78..bd0cb5b7 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/constant/Constants.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/constant/Constants.java @@ -62,6 +62,8 @@ public class Constants { public static final String LISTENING_CONFIGS = "Listening-Configs"; + public static final String WEIGHT_CONFIGS = "Weight-Configs"; + public static final String GROUP_KEY_DELIMITER = "+"; public static final String GROUP_KEY_DELIMITER_TRANSLATION = "\\+"; diff --git a/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigServletInner.java b/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigServletInner.java index 568b3bf2..fcd3606d 100644 --- a/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigServletInner.java +++ b/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigServletInner.java @@ -1,12 +1,17 @@ package cn.hippo4j.config.service; -import org.springframework.beans.factory.annotation.Autowired; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map; +import static cn.hippo4j.common.constant.Constants.WEIGHT_CONFIGS; + /** * Config servlet inner. * @@ -14,17 +19,52 @@ import java.util.Map; * @date 2021/6/22 23:13 */ @Service +@RequiredArgsConstructor public class ConfigServletInner { - @Autowired - private LongPollingService longPollingService; + @NonNull + private final LongPollingService longPollingService; + + private final Cache deWeightCache = CacheBuilder.newBuilder() + .maximumSize(1024) + .build(); + /** + * 轮询配置. + * + * @param request + * @param response + * @param clientMd5Map + * @param probeRequestSize + * @return + */ public String doPollingConfig(HttpServletRequest request, HttpServletResponse response, Map clientMd5Map, int probeRequestSize) { - if (LongPollingService.isSupportLongPolling(request)) { + if (LongPollingService.isSupportLongPolling(request) && weightVerification(request)) { longPollingService.addLongPollingClient(request, response, clientMd5Map, probeRequestSize); return HttpServletResponse.SC_OK + ""; } + return HttpServletResponse.SC_OK + ""; } + /** + * 校验复请求是否重. + *

+ * 有使用者提出在公司环境部署时, 会出现相同的请求重复调用. + * 此问题属于极其个别场景. 由于复现不出, 所以先以这种方式解决问题. + * + * @param request + * @return + */ + private boolean weightVerification(HttpServletRequest request) { + String clientIdentify = request.getParameter(WEIGHT_CONFIGS); + Long timeVal = deWeightCache.getIfPresent(clientIdentify); + if (timeVal == null) { + deWeightCache.put(clientIdentify, System.currentTimeMillis()); + return true; + } + + return false; + } + } diff --git a/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/ClientWorker.java b/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/ClientWorker.java index 4381d2ac..54a0057c 100644 --- a/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/ClientWorker.java +++ b/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/ClientWorker.java @@ -8,6 +8,7 @@ import cn.hippo4j.common.web.base.Result; import cn.hippo4j.starter.remote.HttpAgent; import cn.hippo4j.starter.remote.ServerHealthCheck; import cn.hippo4j.starter.toolkit.thread.ThreadFactoryBuilder; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -155,6 +156,7 @@ public class ClientWorker { public List checkUpdateTpIds(String probeUpdateString, boolean isInitializingCacheList) { Map params = new HashMap(2); params.put(PROBE_MODIFY_REQUEST, probeUpdateString); + params.put(WEIGHT_CONFIGS, IdUtil.simpleUUID()); Map headers = new HashMap(2); headers.put(LONG_PULLING_TIMEOUT, "" + timeout);