Add versioned updates on the server

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

@ -17,17 +17,12 @@
package cn.hippo4j.config.service; package cn.hippo4j.config.service;
import cn.hippo4j.common.toolkit.*;
import cn.hippo4j.core.config.ApplicationContextHolder; import cn.hippo4j.core.config.ApplicationContextHolder;
import cn.hippo4j.common.constant.Constants; import cn.hippo4j.common.constant.Constants;
import cn.hippo4j.common.extension.design.AbstractSubjectCenter; import cn.hippo4j.common.extension.design.AbstractSubjectCenter;
import cn.hippo4j.common.extension.design.Observer; import cn.hippo4j.common.extension.design.Observer;
import cn.hippo4j.common.extension.design.ObserverMessage; 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.event.LocalDataChangeEvent;
import cn.hippo4j.config.model.CacheItem; import cn.hippo4j.config.model.CacheItem;
import cn.hippo4j.config.model.ConfigAllInfo; 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(); private static final ConcurrentHashMap<String, Map<String, CacheItem>> CLIENT_CONFIG_CACHE = new ConcurrentHashMap();
public static boolean isUpdateData(String groupKey, String md5, String clientIdentify) { 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); 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); return Objects.equals(contentMd5, md5);
} }

@ -72,9 +72,10 @@ public class Md5ConfigUtil {
*/ */
public static List<String> compareMd5(HttpServletRequest request, Map<String, String> clientMd5Map) { public static List<String> compareMd5(HttpServletRequest request, Map<String, String> clientMd5Map) {
List<String> changedGroupKeys = new ArrayList(); List<String> changedGroupKeys = new ArrayList();
int clientVersion = getClientVersion(request);
clientMd5Map.forEach((key, val) -> { clientMd5Map.forEach((key, val) -> {
String clientIdentify = RequestUtil.getClientIdentify(request); String clientIdentify = RequestUtil.getClientIdentify(request);
boolean isUpdateData = ConfigCacheService.isUpdateData(key, val, clientIdentify); boolean isUpdateData = ConfigCacheService.isUpdateData(key, val, clientIdentify,clientVersion);
if (!isUpdateData) { if (!isUpdateData) {
changedGroupKeys.add(key); changedGroupKeys.add(key);
} }
@ -82,6 +83,25 @@ public class Md5ConfigUtil {
return changedGroupKeys; 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) { public static Map<String, String> getClientMd5Map(String configKeysString) {
Map<String, String> md5Map = new HashMap(CLIENT_MD5_MAP_INIT_SIZE); Map<String, String> md5Map = new HashMap(CLIENT_MD5_MAP_INIT_SIZE);
if (null == configKeysString || "".equals(configKeysString)) { if (null == configKeysString || "".equals(configKeysString)) {

Loading…
Cancel
Save