From d85c670aec916aaa868b0617738f1d29cb69c53b Mon Sep 17 00:00:00 2001 From: "chen.ma" Date: Tue, 30 Nov 2021 20:08:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E4=BC=98=E9=9B=85?= =?UTF-8?q?=E5=81=9C=E6=9C=BA=E6=97=B6,=20=E8=AF=B7=E6=B1=82=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=AB=AF=E5=88=A0=E9=99=A4=E9=85=8D=E7=BD=AE=E7=BC=93?= =?UTF-8?q?=E5=AD=98.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hippo4j/common/constant/Constants.java | 2 ++ .../config/controller/ConfigController.java | 12 +++++++ .../config/service/ConfigCacheService.java | 31 +++++++++++++++++-- .../controller/ApplicationController.java | 2 +- .../hippo4j/starter/core/DiscoveryClient.java | 31 +++++++++++++++---- 5 files changed, 68 insertions(+), 10 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 4114600e..437618b6 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 @@ -16,6 +16,8 @@ public class Constants { public static final String NAMESPACE = "namespace"; + public static final String GROUP_KEY = "groupKey"; + public static final String DEFAULT_NAMESPACE_ID = "public"; public static final String NULL = ""; diff --git a/hippo4j-config/src/main/java/cn/hippo4j/config/controller/ConfigController.java b/hippo4j-config/src/main/java/cn/hippo4j/config/controller/ConfigController.java index 2ad3eeab..620d5d3b 100644 --- a/hippo4j-config/src/main/java/cn/hippo4j/config/controller/ConfigController.java +++ b/hippo4j-config/src/main/java/cn/hippo4j/config/controller/ConfigController.java @@ -2,12 +2,14 @@ package cn.hippo4j.config.controller; import cn.hippo4j.config.model.ConfigAllInfo; import cn.hippo4j.config.model.ConfigInfoBase; +import cn.hippo4j.config.service.ConfigCacheService; import cn.hippo4j.config.service.ConfigServletInner; import cn.hippo4j.config.toolkit.Md5ConfigUtil; import cn.hippo4j.config.service.biz.ConfigService; import cn.hippo4j.common.constant.Constants; import cn.hippo4j.common.web.base.Result; import cn.hippo4j.common.web.base.Results; +import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import org.springframework.util.StringUtils; @@ -72,4 +74,14 @@ public class ConfigController { configServletInner.doPollingConfig(request, response, clientMd5Map, probeModify.length()); } + @PostMapping("/remove/config/cache") + public Result removeConfigCache(@RequestBody Map bodyMap) { + String groupKey = bodyMap.get(Constants.GROUP_KEY); + if (StrUtil.isNotBlank(groupKey)) { + ConfigCacheService.removeConfigCache(groupKey); + } + + return Results.success(); + } + } diff --git a/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigCacheService.java b/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigCacheService.java index 9f0c3936..1ba1bebf 100644 --- a/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigCacheService.java +++ b/hippo4j-config/src/main/java/cn/hippo4j/config/service/ConfigCacheService.java @@ -10,7 +10,9 @@ import cn.hippo4j.config.event.LocalDataChangeEvent; import cn.hippo4j.config.model.CacheItem; import cn.hippo4j.config.model.ConfigAllInfo; import cn.hippo4j.config.toolkit.MapUtil; +import com.alibaba.fastjson.JSON; import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import java.util.List; @@ -25,10 +27,19 @@ import java.util.concurrent.ConcurrentHashMap; * @author chen.ma * @date 2021/6/24 21:19 */ +@Slf4j public class ConfigCacheService { - static ConfigService configService = null; + private static ConfigService configService = null; + /** + * TODO: 数据结构、客户端停机时 remove 操作待重构 + *

+ * key: message-produce+dynamic-threadpool-example+prescription+192.168.20.227:8088 + * val: + * key: 192.168.20.227:8088 + * val: {@link CacheItem} + */ private static final ConcurrentHashMap> CACHE = new ConcurrentHashMap(); public static boolean isUpdateData(String groupKey, String md5, String ip) { @@ -43,7 +54,7 @@ public class ConfigCacheService { * @param ip * @return */ - private static String getContentMd5IsNullPut(String groupKey, String ip) { + private synchronized static String getContentMd5IsNullPut(String groupKey, String ip) { Map cacheItemMap = Optional.ofNullable(CACHE.get(groupKey)).orElse(Maps.newHashMap()); CacheItem cacheItem = null; @@ -92,7 +103,7 @@ public class ConfigCacheService { } } - public static CacheItem makeSure(String groupKey, String ip) { + public synchronized static CacheItem makeSure(String groupKey, String ip) { Map ipCacheItemMap = CACHE.get(groupKey); CacheItem item = ipCacheItemMap.get(ip); if (null != item) { @@ -114,4 +125,18 @@ public class ConfigCacheService { return returnStrCacheItemMap; } + /** + * Remove config cache. + * + * @param groupKey 租户 + 项目 + IP + */ + public synchronized static void removeConfigCache(String groupKey) { + // 模糊搜索 + List identificationList = MapUtil.parseMapForFilter(CACHE, groupKey); + for (String cacheMapKey : identificationList) { + Map removeCacheItem = CACHE.remove(cacheMapKey); + log.info("Remove invalidated config cache. config info :: {}", JSON.toJSONString(removeCacheItem)); + } + } + } diff --git a/hippo4j-discovery/src/main/java/cn/hippo4j/discovery/controller/ApplicationController.java b/hippo4j-discovery/src/main/java/cn/hippo4j/discovery/controller/ApplicationController.java index 514f4932..4aec2e9e 100644 --- a/hippo4j-discovery/src/main/java/cn/hippo4j/discovery/controller/ApplicationController.java +++ b/hippo4j-discovery/src/main/java/cn/hippo4j/discovery/controller/ApplicationController.java @@ -54,7 +54,7 @@ public class ApplicationController { @PostMapping("/remove") public Result remove(@RequestBody InstanceInfo instanceInfo) { - instanceRegistry.remove(instanceInfo); + instanceRegistry.remove(instanceInfo); return Results.success(); } diff --git a/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/DiscoveryClient.java b/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/DiscoveryClient.java index c88d3993..c62b256c 100644 --- a/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/DiscoveryClient.java +++ b/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/core/DiscoveryClient.java @@ -8,13 +8,18 @@ import cn.hippo4j.common.web.exception.ErrorCodeEnum; import cn.hippo4j.starter.remote.HttpAgent; import cn.hippo4j.starter.toolkit.thread.ThreadFactoryBuilder; import cn.hippo4j.starter.toolkit.thread.ThreadPoolBuilder; +import cn.hutool.core.text.StrBuilder; import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.DisposableBean; +import java.util.Map; import java.util.Optional; import java.util.concurrent.*; +import static cn.hippo4j.common.constant.Constants.GROUP_KEY; + /** * Discovery client. * @@ -88,15 +93,29 @@ public class DiscoveryClient implements DisposableBean { @Override public void destroy() throws Exception { log.info("{}{} - destroy service...", PREFIX, appPathIdentifier); - String urlPath = Constants.BASE_PATH + "/apps/remove/"; - Result removeResult; + String removeConfigCacheUrlPath = Constants.CONFIG_CONTROLLER_PATH + "/remove/config/cache"; + Result removeConfigCacheResult; + try { + String groupKeyIp = StrBuilder.create().append(instanceInfo.getGroupKey()).append(Constants.GROUP_KEY_DELIMITER).append(instanceInfo.getIdentify()).toString(); + Map bodyMap = Maps.newHashMap(); + bodyMap.put(GROUP_KEY, groupKeyIp); + removeConfigCacheResult = httpAgent.httpPostByDiscovery(removeConfigCacheUrlPath, bodyMap); + if (removeConfigCacheResult.isSuccess()) { + log.info("{}{} - remove config cache success.", PREFIX, appPathIdentifier); + } + } catch (Throwable ex) { + log.error("{}{} - remove config cache fail.", PREFIX, appPathIdentifier, ex); + } + + String removeNodeUrlPath = Constants.BASE_PATH + "/apps/remove/"; + Result removeNodeResult; try { - removeResult = httpAgent.httpPostByDiscovery(urlPath, instanceInfo); - if (removeResult.isSuccess()) { - log.info("{}{} - destroy service success...", PREFIX, appPathIdentifier); + removeNodeResult = httpAgent.httpPostByDiscovery(removeNodeUrlPath, instanceInfo); + if (removeNodeResult.isSuccess()) { + log.info("{}{} - destroy service success.", PREFIX, appPathIdentifier); } } catch (Throwable ex) { - log.error("{}{} - destroy service fail...", PREFIX, appPathIdentifier); + log.error("{}{} - destroy service fail.", PREFIX, appPathIdentifier, ex); } Optional.ofNullable(scheduler).ifPresent((each) -> each.shutdown());