diff --git a/threadpool/server/config/src/main/java/cn/hippo4j/config/service/ConfigCacheService.java b/threadpool/server/config/src/main/java/cn/hippo4j/config/service/ConfigCacheService.java index b598747a..a7f0c89d 100644 --- a/threadpool/server/config/src/main/java/cn/hippo4j/config/service/ConfigCacheService.java +++ b/threadpool/server/config/src/main/java/cn/hippo4j/config/service/ConfigCacheService.java @@ -27,6 +27,7 @@ import cn.hippo4j.common.toolkit.JSONUtil; import cn.hippo4j.common.toolkit.Joiner; import cn.hippo4j.common.toolkit.MapUtil; import cn.hippo4j.common.toolkit.Md5Util; +import cn.hippo4j.common.toolkit.IncrementalMd5Util; import cn.hippo4j.common.toolkit.StringUtil; import cn.hippo4j.config.event.LocalDataChangeEvent; import cn.hippo4j.config.model.CacheItem; @@ -70,7 +71,30 @@ public class ConfigCacheService { private static final ConcurrentHashMap> CLIENT_CONFIG_CACHE = new ConcurrentHashMap(); public static boolean isUpdateData(String groupKey, String md5, String clientIdentify) { + // Default to version 1 for backward compatibility + return isUpdateData(groupKey, md5, clientIdentify, 1); + } + + /** + * Check if data needs update with version support + * + * @param groupKey group key + * @param md5 client MD5 + * @param clientIdentify client identifier + * @param clientVersion client version + * @return true if data is up to date + */ + public static boolean isUpdateData(String groupKey, String md5, String clientIdentify, int clientVersion) { String contentMd5 = ConfigCacheService.getContentMd5IsNullPut(groupKey, clientIdentify); + if (clientVersion >= 2) { + String[] params = groupKey.split(GROUP_KEY_DELIMITER_TRANSLATION); + ConfigAllInfo config = configService.findConfigRecentInfo(params); + if (config != null) { + String incrementalMd5 = IncrementalMd5Util.getVersionedMd5(config, clientVersion); + return Objects.equals(incrementalMd5, md5); + } + } + // Fallback to full MD5 comparison for version 1 clients return Objects.equals(contentMd5, md5); } diff --git a/threadpool/server/config/src/main/java/cn/hippo4j/config/toolkit/Md5ConfigUtil.java b/threadpool/server/config/src/main/java/cn/hippo4j/config/toolkit/Md5ConfigUtil.java index ef9d66de..67e58efa 100644 --- a/threadpool/server/config/src/main/java/cn/hippo4j/config/toolkit/Md5ConfigUtil.java +++ b/threadpool/server/config/src/main/java/cn/hippo4j/config/toolkit/Md5ConfigUtil.java @@ -72,9 +72,10 @@ public class Md5ConfigUtil { */ public static List compareMd5(HttpServletRequest request, Map clientMd5Map) { List changedGroupKeys = new ArrayList(); + int clientVersion = getClientVersion(request); clientMd5Map.forEach((key, val) -> { String clientIdentify = RequestUtil.getClientIdentify(request); - boolean isUpdateData = ConfigCacheService.isUpdateData(key, val, clientIdentify); + boolean isUpdateData = ConfigCacheService.isUpdateData(key, val, clientIdentify,clientVersion); if (!isUpdateData) { changedGroupKeys.add(key); } @@ -82,6 +83,25 @@ public class Md5ConfigUtil { return changedGroupKeys; } + /** + * Get client protocol version from request header + * + * @param request HTTP request + * @return client protocol version, default to 1 for backward compatibility + */ + private static int getClientVersion(HttpServletRequest request) { + String versionHeader = request.getHeader("X-Hippo4j-Protocol-Version"); + if (versionHeader != null && !versionHeader.isEmpty()) { + try { + return Integer.parseInt(versionHeader); + } catch (NumberFormatException e) { + // Default to version 1 for backward compatibility + return 1; + } + } + return 1; + } + public static Map getClientMd5Map(String configKeysString) { Map md5Map = new HashMap(CLIENT_MD5_MAP_INIT_SIZE); if (null == configKeysString || "".equals(configKeysString)) {