Add versioned updates on the server

pull/1608/head
mingri31164 7 months ago
parent a859434a0f
commit 952e33ad70

@ -17,17 +17,12 @@
package cn.hippo4j.config.service;
import cn.hippo4j.common.toolkit.*;
import cn.hippo4j.core.config.ApplicationContextHolder;
import cn.hippo4j.common.constant.Constants;
import cn.hippo4j.common.extension.design.AbstractSubjectCenter;
import cn.hippo4j.common.extension.design.Observer;
import cn.hippo4j.common.extension.design.ObserverMessage;
import cn.hippo4j.common.toolkit.CollectionUtil;
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.StringUtil;
import cn.hippo4j.config.event.LocalDataChangeEvent;
import cn.hippo4j.config.model.CacheItem;
import cn.hippo4j.config.model.ConfigAllInfo;
@ -70,7 +65,30 @@ public class ConfigCacheService {
private static final ConcurrentHashMap<String, Map<String, CacheItem>> 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);
}

@ -72,9 +72,10 @@ public class Md5ConfigUtil {
*/
public static List<String> compareMd5(HttpServletRequest request, Map<String, String> clientMd5Map) {
List<String> 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<String, String> getClientMd5Map(String configKeysString) {
Map<String, String> md5Map = new HashMap(CLIENT_MD5_MAP_INIT_SIZE);
if (null == configKeysString || "".equals(configKeysString)) {

Loading…
Cancel
Save