From f4b4e9b546e208b4956dfa5642bcb70f8cde7a31 Mon Sep 17 00:00:00 2001 From: yangzl Date: Sat, 2 Nov 2024 21:01:02 +0800 Subject: [PATCH] fix(apollo-biz): Fix the parsing logic of configuration override values and add value validity verification --- .../framework/apollo/biz/config/BizConfig.java | 18 ++++++++++-------- .../deployment/distributed-deployment-guide.md | 2 +- .../deployment/distributed-deployment-guide.md | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/config/BizConfig.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/config/BizConfig.java index cca14620c09..437b9223046 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/config/BizConfig.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/config/BizConfig.java @@ -30,7 +30,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; +import java.util.function.Predicate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -115,12 +115,12 @@ public int itemValueLengthLimit() { public Map appIdValueLengthLimitOverride() { String appIdValueLengthOverrideString = getValue("appid.value.length.limit.override"); - return parseOverrideConfig(appIdValueLengthOverrideString, appIdValueLengthOverrideTypeReference); + return parseOverrideConfig(appIdValueLengthOverrideString, appIdValueLengthOverrideTypeReference, value -> value > 0); } public Map namespaceValueLengthLimitOverride() { String namespaceValueLengthOverrideString = getValue("namespace.value.length.limit.override"); - return parseOverrideConfig(namespaceValueLengthOverrideString, namespaceValueLengthOverrideTypeReference); + return parseOverrideConfig(namespaceValueLengthOverrideString, namespaceValueLengthOverrideTypeReference, value -> value > 0); } public boolean isNamespaceNumLimitEnabled() { @@ -201,7 +201,7 @@ public int releaseHistoryRetentionSize() { public Map releaseHistoryRetentionSizeOverride() { String overrideString = getValue("apollo.release-history.retention.size.override"); - return parseOverrideConfig(overrideString, releaseHistoryRetentionSizeOverrideTypeReference); + return parseOverrideConfig(overrideString, releaseHistoryRetentionSizeOverrideTypeReference, value -> value > 0); } public int releaseMessageCacheScanInterval() { @@ -255,14 +255,16 @@ public String getAdminServiceAccessTokens() { return getValue("admin-service.access.tokens"); } - private Map parseOverrideConfig(String configValue, Type typeReference) { + private Map parseOverrideConfig(String configValue, Type typeReference, Predicate valueFilter) { Map result = Maps.newHashMap(); if (!Strings.isNullOrEmpty(configValue)) { try { Map parsed = GSON.fromJson(configValue, typeReference); - result = parsed.entrySet().stream() - .filter(e -> e.getValue() != null && ((Integer) e.getValue()) > 0) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + for (Map.Entry entry : parsed.entrySet()) { + if (entry.getValue() != null && valueFilter.test(entry.getValue())) { + result.put(entry.getKey(), entry.getValue()); + } + } } catch (Exception e) { logger.error("Invalid override config value: {}", configValue, e); } diff --git a/docs/en/deployment/distributed-deployment-guide.md b/docs/en/deployment/distributed-deployment-guide.md index aa3296995ef..91afbe7a4fb 100644 --- a/docs/en/deployment/distributed-deployment-guide.md +++ b/docs/en/deployment/distributed-deployment-guide.md @@ -1543,7 +1543,7 @@ The default configuration is 20000. This configuration is used to override the configuration of `item.value.length.limit` to control the maximum length limit of the value at the appId granularity. The configured value is in a json format, and the key of the json is appId. The format is as follows: ``` -appid.value.length.limit.override = {appId-demo1:200,aappId-demo2:300} +appid.value.length.limit.override = {"appId-demo1":200,"appId-demo2":300} ``` The above configuration specifies that the maximum length limit of the value in all namespaces under `appId-demo1` is 200, and the maximum length limit of the value in all namespaces under `appId-demo2` is 300 diff --git a/docs/zh/deployment/distributed-deployment-guide.md b/docs/zh/deployment/distributed-deployment-guide.md index 284d234a0d0..89473a8a0c2 100644 --- a/docs/zh/deployment/distributed-deployment-guide.md +++ b/docs/zh/deployment/distributed-deployment-guide.md @@ -1484,7 +1484,7 @@ http://5.5.5.5:8080/eureka/,http://6.6.6.6:8080/eureka/ #### 3.2.5.1 appid.value.length.limit.override - appId 维度的配置项 value 最大长度限制 此配置用来覆盖 `item.value.length.limit` 的配置,做到控制 appId 粒度下的 value 最大长度限制,配置的值是一个 json 格式,json 的 key 为 appId,格式如下: ``` -appid.value.length.limit.override = {appId-demo1:200,aappId-demo2:300} +appid.value.length.limit.override = {"appId-demo1":200,"appId-demo2":300} ``` 以上配置指定了 `appId-demo1` 下的所有 namespace 中的 value 最大长度限制为 200,`appId-demo2` 下的所有 namespace 中的 value 最大长度限制为 300