From 4bdf66a62ad0ec30d06083b658935bfe7a245760 Mon Sep 17 00:00:00 2001 From: yangzl Date: Thu, 17 Oct 2024 20:30:21 +0800 Subject: [PATCH] feat: add determine single namespace item num limit logic (#5227) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add determine single namespace item num limit logic * fix: 1. Added switch control function on and off 2. Add unit tests and usage documentation 3. Update the CHANGES.md 4. Function and code style optimization * fix:Added license headers * fix:Optimize CHANGES.md、unit tests、usage documentation * fix:unit tests * fix:unit tests --- CHANGES.md | 2 +- .../controller/ItemController.java | 14 +- .../apollo/biz/config/BizConfig.java | 11 ++ .../apollo/biz/repository/ItemRepository.java | 3 + .../apollo/biz/service/ItemService.java | 4 + .../apollo/biz/service/ItemSetService.java | 21 ++- .../biz/service/ItemSetServiceTest.java | 147 ++++++++++++++++++ .../src/test/resources/sql/itemset-test.sql | 25 +++ doc/images/item-num-limit-enabled.png | Bin 0 -> 32141 bytes doc/images/item-num-limit.png | Bin 0 -> 30680 bytes docs/en/portal/apollo-user-guide.md | 12 ++ docs/zh/portal/apollo-user-guide.md | 16 ++ 12 files changed, 249 insertions(+), 6 deletions(-) create mode 100644 apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemSetServiceTest.java create mode 100644 apollo-biz/src/test/resources/sql/itemset-test.sql create mode 100644 doc/images/item-num-limit-enabled.png create mode 100644 doc/images/item-num-limit.png diff --git a/CHANGES.md b/CHANGES.md index f151343137f..167134551db 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,6 @@ Apollo 2.4.0 * [Fix link namespace published items show missing some items](https://github.com/apolloconfig/apollo/pull/5240) * [Feature: Add limit and whitelist for namespace count per appid+cluster](https://github.com/apolloconfig/apollo/pull/5228) * [Feature support the observe status access-key for pre-check and logging only](https://github.com/apolloconfig/apollo/pull/5236) - +* [Feature add limit for items count per namespace](https://github.com/apolloconfig/apollo/pull/5227) ------------------ All issues and pull requests are [here](https://github.com/apolloconfig/apollo/milestone/15?closed=1) diff --git a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java index f628748d2fa..db1c3e1d1cb 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java +++ b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/ItemController.java @@ -17,6 +17,7 @@ package com.ctrip.framework.apollo.adminservice.controller; import com.ctrip.framework.apollo.adminservice.aop.PreAcquireNamespaceLock; +import com.ctrip.framework.apollo.biz.config.BizConfig; import com.ctrip.framework.apollo.biz.entity.Commit; import com.ctrip.framework.apollo.biz.entity.Item; import com.ctrip.framework.apollo.biz.entity.Namespace; @@ -58,13 +59,14 @@ public class ItemController { private final NamespaceService namespaceService; private final CommitService commitService; private final ReleaseService releaseService; + private final BizConfig bizConfig; - - public ItemController(final ItemService itemService, final NamespaceService namespaceService, final CommitService commitService, final ReleaseService releaseService) { + public ItemController(final ItemService itemService, final NamespaceService namespaceService, final CommitService commitService, final ReleaseService releaseService, final BizConfig bizConfig) { this.itemService = itemService; this.namespaceService = namespaceService; this.commitService = commitService; this.releaseService = releaseService; + this.bizConfig = bizConfig; } @PreAcquireNamespaceLock @@ -78,6 +80,14 @@ public ItemDTO create(@PathVariable("appId") String appId, if (managedEntity != null) { throw BadRequestException.itemAlreadyExists(entity.getKey()); } + + if (bizConfig.isItemNumLimitEnabled()) { + int itemCount = itemService.findNonEmptyItemCount(entity.getNamespaceId()); + if (itemCount >= bizConfig.itemNumLimit()) { + throw new BadRequestException("The maximum number of items (" + bizConfig.itemNumLimit() + ") for this namespace has been reached. Current item count is " + itemCount + "."); + } + } + entity = itemService.save(entity); dto = BeanUtils.transform(ItemDTO.class, entity); commitService.createCommit(appId, clusterName, namespaceName, new ConfigChangeContentBuilder().createItem(entity).build(), 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 fe26e81bc45..37fe1ed0c6f 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 @@ -41,6 +41,8 @@ public class BizConfig extends RefreshableConfig { private static final int DEFAULT_MAX_NAMESPACE_NUM = 200; + private static final int DEFAULT_MAX_ITEM_NUM = 1000; + private static final int DEFAULT_APPNAMESPACE_CACHE_REBUILD_INTERVAL = 60; //60s private static final int DEFAULT_GRAY_RELEASE_RULE_SCAN_INTERVAL = 60; //60s private static final int DEFAULT_APPNAMESPACE_CACHE_SCAN_INTERVAL = 1; //1s @@ -117,6 +119,15 @@ public Set namespaceNumLimitWhite() { return Sets.newHashSet(getArrayProperty("namespace.num.limit.white", new String[0])); } + public boolean isItemNumLimitEnabled() { + return getBooleanProperty("item.num.limit.enabled", false); + } + + public int itemNumLimit() { + int limit = getIntProperty("item.num.limit", DEFAULT_MAX_ITEM_NUM); + return checkInt(limit, 5, Integer.MAX_VALUE, DEFAULT_MAX_ITEM_NUM); + } + public Map namespaceValueLengthLimitOverride() { String namespaceValueLengthOverrideString = getValue("namespace.value.length.limit.override"); Map namespaceValueLengthOverride = Maps.newHashMap(); diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java index c866b902814..55da734b810 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/ItemRepository.java @@ -64,4 +64,7 @@ public interface ItemRepository extends PagingAndSortingRepository { @Query("update Item set IsDeleted = true, DeletedAt = ROUND(UNIX_TIMESTAMP(NOW(4))*1000), DataChange_LastModifiedBy = ?2 where NamespaceId = ?1 and IsDeleted = false") int deleteByNamespaceId(long namespaceId, String operator); + @Query("select count(*) from Item where namespaceId = :namespaceId and key <>''") + int countByNamespaceIdAndFilterKeyEmpty(@Param("namespaceId") long namespaceId); + } diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java index 3c0d23c1b62..0fd9199ab65 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemService.java @@ -135,6 +135,10 @@ public List findItemsModifiedAfterDate(long namespaceId, Date date) { return itemRepository.findByNamespaceIdAndDataChangeLastModifiedTimeGreaterThan(namespaceId, date); } + public int findNonEmptyItemCount(long namespaceId) { + return itemRepository.countByNamespaceIdAndFilterKeyEmpty(namespaceId); + } + public Page findItemsByKey(String key, Pageable pageable) { return itemRepository.findByKey(key, pageable); } diff --git a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemSetService.java b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemSetService.java index f1559d2643d..dca6089de10 100644 --- a/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemSetService.java +++ b/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/ItemSetService.java @@ -16,6 +16,7 @@ */ package com.ctrip.framework.apollo.biz.service; +import com.ctrip.framework.apollo.biz.config.BizConfig; import com.ctrip.framework.apollo.biz.entity.Audit; import com.ctrip.framework.apollo.biz.entity.Item; import com.ctrip.framework.apollo.biz.entity.Namespace; @@ -25,6 +26,7 @@ import com.ctrip.framework.apollo.common.exception.BadRequestException; import com.ctrip.framework.apollo.common.exception.NotFoundException; import com.ctrip.framework.apollo.common.utils.BeanUtils; +import com.ctrip.framework.apollo.core.utils.StringUtils; import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -38,20 +40,23 @@ public class ItemSetService { private final CommitService commitService; private final ItemService itemService; private final NamespaceService namespaceService; + private final BizConfig bizConfig; public ItemSetService( final AuditService auditService, final CommitService commitService, final ItemService itemService, - final NamespaceService namespaceService) { + final NamespaceService namespaceService, + final BizConfig bizConfig) { this.auditService = auditService; this.commitService = commitService; this.itemService = itemService; this.namespaceService = namespaceService; + this.bizConfig = bizConfig; } @Transactional - public ItemChangeSets updateSet(Namespace namespace, ItemChangeSets changeSets){ + public ItemChangeSets updateSet(Namespace namespace, ItemChangeSets changeSets) { return updateSet(namespace.getAppId(), namespace.getClusterName(), namespace.getNamespaceName(), changeSets); } @@ -64,6 +69,16 @@ public ItemChangeSets updateSet(String appId, String clusterName, throw NotFoundException.namespaceNotFound(appId, clusterName, namespaceName); } + if (bizConfig.isItemNumLimitEnabled()) { + int itemCount = itemService.findNonEmptyItemCount(namespace.getId()); + int createItemCount = (int) changeSet.getCreateItems().stream().filter(item -> !StringUtils.isEmpty(item.getKey())).count(); + int deleteItemCount = (int) changeSet.getDeleteItems().stream().filter(item -> !StringUtils.isEmpty(item.getKey())).count(); + itemCount = itemCount + createItemCount - deleteItemCount; + if (itemCount > bizConfig.itemNumLimit()) { + throw new BadRequestException("The maximum number of items (" + bizConfig.itemNumLimit() + ") for this namespace has been reached. Current item count is " + itemCount + "."); + } + } + String operator = changeSet.getDataChangeLastModifiedBy(); ConfigChangeContentBuilder configChangeContentBuilder = new ConfigChangeContentBuilder(); @@ -84,7 +99,7 @@ public ItemChangeSets updateSet(String appId, String clusterName, if (configChangeContentBuilder.hasContent()) { commitService.createCommit(appId, clusterName, namespaceName, configChangeContentBuilder.build(), - changeSet.getDataChangeLastModifiedBy()); + changeSet.getDataChangeLastModifiedBy()); } return changeSet; diff --git a/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemSetServiceTest.java b/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemSetServiceTest.java new file mode 100644 index 00000000000..e1dce5a16ba --- /dev/null +++ b/apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/ItemSetServiceTest.java @@ -0,0 +1,147 @@ +/* + * Copyright 2024 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.biz.service; + +import static org.mockito.Mockito.when; + +import com.ctrip.framework.apollo.biz.AbstractIntegrationTest; +import com.ctrip.framework.apollo.biz.config.BizConfig; +import com.ctrip.framework.apollo.biz.entity.Item; +import com.ctrip.framework.apollo.biz.entity.Namespace; +import com.ctrip.framework.apollo.common.dto.ItemChangeSets; +import com.ctrip.framework.apollo.common.dto.ItemDTO; +import com.ctrip.framework.apollo.common.exception.BadRequestException; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.jdbc.Sql; + +public class ItemSetServiceTest extends AbstractIntegrationTest { + + @MockBean + private BizConfig bizConfig; + + @Autowired + private ItemService itemService; + @Autowired + private NamespaceService namespaceService; + + @Autowired + private ItemSetService itemSetService; + + @Test + @Sql(scripts = "/sql/itemset-test.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + public void testUpdateSetWithoutItemNumLimit() { + + when(bizConfig.itemKeyLengthLimit()).thenReturn(128); + when(bizConfig.itemValueLengthLimit()).thenReturn(20000); + + when(bizConfig.isItemNumLimitEnabled()).thenReturn(false); + when(bizConfig.itemNumLimit()).thenReturn(5); + + Namespace namespace = namespaceService.findOne(1L); + + ItemChangeSets changeSets = new ItemChangeSets(); + changeSets.addCreateItem(buildNormalItem(0L, namespace.getId(), "k6", "v6", "test item num limit", 6)); + changeSets.addCreateItem(buildNormalItem(0L, namespace.getId(), "k7", "v7", "test item num limit", 7)); + + try { + itemSetService.updateSet(namespace, changeSets); + } catch (Exception e) { + Assert.fail(); + } + + int size = itemService.findNonEmptyItemCount(namespace.getId()); + Assert.assertEquals(7, size); + + } + + @Test + @Sql(scripts = "/sql/itemset-test.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + public void testUpdateSetWithItemNumLimit() { + + when(bizConfig.itemKeyLengthLimit()).thenReturn(128); + when(bizConfig.itemValueLengthLimit()).thenReturn(20000); + + when(bizConfig.isItemNumLimitEnabled()).thenReturn(true); + when(bizConfig.itemNumLimit()).thenReturn(5); + + Namespace namespace = namespaceService.findOne(1L); + Item item9901 = itemService.findOne(9901); + Item item9902 = itemService.findOne(9902); + + ItemChangeSets changeSets = new ItemChangeSets(); + changeSets.addUpdateItem(buildNormalItem(item9901.getId(), item9901.getNamespaceId(), item9901.getKey(), item9901.getValue() + " update", item9901.getComment(), item9901.getLineNum())); + changeSets.addDeleteItem(buildNormalItem(item9902.getId(), item9902.getNamespaceId(), item9902.getKey(), item9902.getValue() + " update", item9902.getComment(), item9902.getLineNum())); + changeSets.addCreateItem(buildNormalItem(0L, item9901.getNamespaceId(), "k6", "v6", "test item num limit", 6)); + changeSets.addCreateItem(buildNormalItem(0L, item9901.getNamespaceId(), "k7", "v7", "test item num limit", 7)); + + try { + itemSetService.updateSet(namespace, changeSets); + Assert.fail(); + } catch (Exception e) { + Assert.assertTrue(e instanceof BadRequestException); + } + + int size = itemService.findNonEmptyItemCount(namespace.getId()); + Assert.assertEquals(5, size); + + } + + @Test + @Sql(scripts = "/sql/itemset-test.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + public void testUpdateSetWithItemNumLimit2() { + + when(bizConfig.itemKeyLengthLimit()).thenReturn(128); + when(bizConfig.itemValueLengthLimit()).thenReturn(20000); + + when(bizConfig.isItemNumLimitEnabled()).thenReturn(true); + when(bizConfig.itemNumLimit()).thenReturn(5); + + Namespace namespace = namespaceService.findOne(1L); + Item item9901 = itemService.findOne(9901); + Item item9902 = itemService.findOne(9902); + + ItemChangeSets changeSets = new ItemChangeSets(); + changeSets.addUpdateItem(buildNormalItem(item9901.getId(), item9901.getNamespaceId(), item9901.getKey(), item9901.getValue() + " update", item9901.getComment(), item9901.getLineNum())); + changeSets.addDeleteItem(buildNormalItem(item9902.getId(), item9902.getNamespaceId(), item9902.getKey(), item9902.getValue() + " update", item9902.getComment(), item9902.getLineNum())); + changeSets.addCreateItem(buildNormalItem(0L, item9901.getNamespaceId(), "k6", "v6", "test item num limit", 6)); + + try { + itemSetService.updateSet(namespace, changeSets); + } catch (Exception e) { + Assert.fail(); + } + + int size = itemService.findNonEmptyItemCount(namespace.getId()); + Assert.assertEquals(5, size); + + } + + + private ItemDTO buildNormalItem(Long id, Long namespaceId, String key, String value, String comment, int lineNum) { + ItemDTO item = new ItemDTO(key, value, comment, lineNum); + item.setId(id); + item.setNamespaceId(namespaceId); + return item; + } + +} diff --git a/apollo-biz/src/test/resources/sql/itemset-test.sql b/apollo-biz/src/test/resources/sql/itemset-test.sql new file mode 100644 index 00000000000..4a57e307b9d --- /dev/null +++ b/apollo-biz/src/test/resources/sql/itemset-test.sql @@ -0,0 +1,25 @@ +-- +-- Copyright 2024 Apollo Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +INSERT INTO "Namespace" (`Id`, `AppId`, `ClusterName`, `NamespaceName`, `IsDeleted`, `DataChange_CreatedBy`, `DataChange_LastModifiedBy`)VALUES(1,'testApp', 'default', 'application', 0, 'apollo', 'apollo'); + +INSERT INTO "Item" (`Id`, `NamespaceId`, "Key", "Type", "Value", `Comment`, `LineNum`) + VALUES + (9901, 1, 'k1', 0, 'v1', '', 1), + (9902, 1, 'k2', 2, 'v2', '', 2), + (9903, 1, 'k3', 0, 'v3', '', 3), + (9904, 1, 'k4', 0, 'v4', '', 4), + (9905, 1, 'k5', 0, 'v5', '', 5); diff --git a/doc/images/item-num-limit-enabled.png b/doc/images/item-num-limit-enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..efe924fa7d8691deb24fe414b2ca14e9f6540b65 GIT binary patch literal 32141 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

VAljTH$)zr!-U9==YK667o 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 literal 0 HcmV?d00001 diff --git a/doc/images/item-num-limit.png b/doc/images/item-num-limit.png new file mode 100644 index 0000000000000000000000000000000000000000..fc76e712aff05d6c0efe55c8bf72082f8e18dc65 GIT binary patch literal 30680 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