From 832b20a83ef5f3c0e0d9ea7f2ea0825796df9e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=99=93=E4=B8=9C?= <763795151@qq.com> Date: Mon, 9 Jan 2023 22:11:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E9=99=90=E6=B5=81?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../beans/dto/QueryClientQuotaDTO.java | 17 ++++++++++ .../console/beans/vo/ClientQuotaEntityVO.java | 29 +++++++++++++++-- .../controller/ClientQuotaController.java | 28 +++++++++++++++++ .../console/service/ClientQuotaService.java | 5 ++- .../service/impl/ClientQuotaServiceImpl.java | 31 ++++++++++++++----- .../console/scala/ClientQuotaConsoleTest.java | 2 +- 6 files changed, 100 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/xuxd/kafka/console/beans/dto/QueryClientQuotaDTO.java create mode 100644 src/main/java/com/xuxd/kafka/console/controller/ClientQuotaController.java diff --git a/src/main/java/com/xuxd/kafka/console/beans/dto/QueryClientQuotaDTO.java b/src/main/java/com/xuxd/kafka/console/beans/dto/QueryClientQuotaDTO.java new file mode 100644 index 0000000..3fb0070 --- /dev/null +++ b/src/main/java/com/xuxd/kafka/console/beans/dto/QueryClientQuotaDTO.java @@ -0,0 +1,17 @@ +package com.xuxd.kafka.console.beans.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author: xuxd + * @date: 2023/1/9 21:53 + **/ +@Data +public class QueryClientQuotaDTO { + + private List types; + + private List names; +} diff --git a/src/main/java/com/xuxd/kafka/console/beans/vo/ClientQuotaEntityVO.java b/src/main/java/com/xuxd/kafka/console/beans/vo/ClientQuotaEntityVO.java index a1559eb..a4dc5ec 100644 --- a/src/main/java/com/xuxd/kafka/console/beans/vo/ClientQuotaEntityVO.java +++ b/src/main/java/com/xuxd/kafka/console/beans/vo/ClientQuotaEntityVO.java @@ -4,12 +4,20 @@ import lombok.Data; import org.apache.kafka.common.config.internals.QuotaConfigs; import org.apache.kafka.common.quota.ClientQuotaEntity; +import java.util.List; import java.util.Map; +/** + * @author 晓东哥哥 + */ @Data public class ClientQuotaEntityVO { - private String entry; + private String user; + + private String client; + + private String ip; private String consumerRate; @@ -17,9 +25,24 @@ public class ClientQuotaEntityVO { private String requestPercentage; - public static ClientQuotaEntityVO from(ClientQuotaEntity entity, String type, Map config) { + public static ClientQuotaEntityVO from(ClientQuotaEntity entity, List entityTypes, Map config) { ClientQuotaEntityVO entityVO = new ClientQuotaEntityVO(); - entityVO.setEntry(entity.entries().get(type)); + Map entries = entity.entries(); + entityTypes.forEach(type -> { + switch (type) { + case ClientQuotaEntity.USER: + entityVO.setUser(entries.get(type)); + break; + case ClientQuotaEntity.CLIENT_ID: + entityVO.setClient(entries.get(type)); + break; + case ClientQuotaEntity.IP: + entityVO.setIp(entries.get(type)); + break; + default: + break; + } + }); entityVO.setConsumerRate(config.getOrDefault(QuotaConfigs.CONSUMER_BYTE_RATE_OVERRIDE_CONFIG, "").toString()); entityVO.setProducerRate(config.getOrDefault(QuotaConfigs.PRODUCER_BYTE_RATE_OVERRIDE_CONFIG, "").toString()); entityVO.setRequestPercentage(config.getOrDefault(QuotaConfigs.REQUEST_PERCENTAGE_OVERRIDE_CONFIG, "").toString()); diff --git a/src/main/java/com/xuxd/kafka/console/controller/ClientQuotaController.java b/src/main/java/com/xuxd/kafka/console/controller/ClientQuotaController.java new file mode 100644 index 0000000..a55aef9 --- /dev/null +++ b/src/main/java/com/xuxd/kafka/console/controller/ClientQuotaController.java @@ -0,0 +1,28 @@ +package com.xuxd.kafka.console.controller; + +import com.xuxd.kafka.console.beans.dto.QueryClientQuotaDTO; +import com.xuxd.kafka.console.service.ClientQuotaService; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author: xuxd + * @date: 2023/1/9 21:50 + **/ +@RestController +@RequestMapping("/client/quota") +public class ClientQuotaController { + + private final ClientQuotaService clientQuotaService; + + public ClientQuotaController(ClientQuotaService clientQuotaService) { + this.clientQuotaService = clientQuotaService; + } + + @PostMapping("/list") + public Object getClientQuotaConfigs(@RequestBody QueryClientQuotaDTO request) { + return clientQuotaService.getClientQuotaConfigs(request.getTypes(), request.getNames()); + } +} diff --git a/src/main/java/com/xuxd/kafka/console/service/ClientQuotaService.java b/src/main/java/com/xuxd/kafka/console/service/ClientQuotaService.java index 2cbec29..253396e 100644 --- a/src/main/java/com/xuxd/kafka/console/service/ClientQuotaService.java +++ b/src/main/java/com/xuxd/kafka/console/service/ClientQuotaService.java @@ -4,7 +4,10 @@ import com.xuxd.kafka.console.beans.vo.ClientQuotaEntityVO; import java.util.List; +/** + * @author 晓东哥哥 + */ public interface ClientQuotaService { - List getClientQuotaConfigs(String type, String name); + List getClientQuotaConfigs(List types, List names); } diff --git a/src/main/java/com/xuxd/kafka/console/service/impl/ClientQuotaServiceImpl.java b/src/main/java/com/xuxd/kafka/console/service/impl/ClientQuotaServiceImpl.java index afe5675..0b00e68 100644 --- a/src/main/java/com/xuxd/kafka/console/service/impl/ClientQuotaServiceImpl.java +++ b/src/main/java/com/xuxd/kafka/console/service/impl/ClientQuotaServiceImpl.java @@ -11,6 +11,9 @@ import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; +/** + * @author 晓东哥哥 + */ @Slf4j @Service public class ClientQuotaServiceImpl implements ClientQuotaService { @@ -30,14 +33,28 @@ public class ClientQuotaServiceImpl implements ClientQuotaService { } @Override - public List getClientQuotaConfigs(String type, String name) { - List entityNames = StringUtils.isNotBlank(name) ? Arrays.asList(name) : Collections.emptyList(); - String entityType = typeDict.get(type); - if (StringUtils.isEmpty(entityType)) { - throw new IllegalArgumentException("type不正确:" + type); + public List getClientQuotaConfigs(List types, List names) { + List entityNames = names == null ? Collections.emptyList() : new ArrayList<>(names); + List entityTypes = types.stream().map(e -> typeDict.get(e)).filter(e -> e != null).collect(Collectors.toList()); + if (entityTypes.isEmpty() || entityTypes.size() != types.size()) { + throw new IllegalArgumentException("types illegal."); } - Map> clientQuotasConfigs = clientQuotaConsole.getClientQuotasConfigs(Arrays.asList(entityType), entityNames); - return clientQuotasConfigs.entrySet().stream().map(entry -> ClientQuotaEntityVO.from(entry.getKey(), entityType, entry.getValue())).collect(Collectors.toList()); + boolean userWithClientFilterClientOnly = false; + if (entityTypes.size() == 2) { + if (names.size() == 2 && StringUtils.isBlank(names.get(0)) && StringUtils.isNotBlank(names.get(1))) { + userWithClientFilterClientOnly = true; + } + } + Map> clientQuotasConfigs = clientQuotaConsole.getClientQuotasConfigs(entityTypes, + userWithClientFilterClientOnly ? Collections.emptyList() : entityNames); + + List voList = clientQuotasConfigs.entrySet().stream().map(entry -> ClientQuotaEntityVO.from( + entry.getKey(), entityTypes, entry.getValue())).collect(Collectors.toList()); + if (!userWithClientFilterClientOnly) { + return voList; + } + return voList.stream().filter(e -> names.get(1).equals(e.getClient())).collect(Collectors.toList()); } + } diff --git a/src/test/java/com/xuxd/kafka/console/scala/ClientQuotaConsoleTest.java b/src/test/java/com/xuxd/kafka/console/scala/ClientQuotaConsoleTest.java index abfc014..4c4c80f 100644 --- a/src/test/java/com/xuxd/kafka/console/scala/ClientQuotaConsoleTest.java +++ b/src/test/java/com/xuxd/kafka/console/scala/ClientQuotaConsoleTest.java @@ -22,7 +22,7 @@ public class ClientQuotaConsoleTest { ContextConfig config = new ContextConfig(); config.setBootstrapServer(bootstrapServer); ContextConfigHolder.CONTEXT_CONFIG.set(config); - Map> configs = console.getClientQuotasConfigs(Arrays.asList(ClientQuotaEntity.USER), Arrays.asList()); + Map> configs = console.getClientQuotasConfigs(Arrays.asList(ClientQuotaEntity.USER, ClientQuotaEntity.CLIENT_ID), Arrays.asList("user1", "clientA")); configs.forEach((k, v) -> { System.out.println(k); System.out.println(v);