From 5efd4241726e9c46a338578c112b4fa88d9adbcc Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 9 Feb 2021 11:20:56 +0800 Subject: [PATCH 01/55] version 2.3.0 --- .../bizenum/TopicExpiredStatusEnum.java | 32 +++ .../kafka/manager/common/entity/Result.java | 10 +- .../manager/common/entity/ResultStatus.java | 4 + .../common/entity/ao/ClusterDetailDTO.java | 13 +- .../SinkTopicRequestTimeMetricsConfig.java | 57 ----- .../op/ControllerPreferredCandidateDTO.java | 45 ++++ .../common/entity/dto/rd/ClusterDTO.java | 5 +- .../entity/pojo/gateway/GatewayConfigDO.java | 11 + .../entity/vo/op/expert/ExpiredTopicVO.java | 2 +- .../common/entity/vo/rd/GatewayConfigVO.java | 12 + .../kafka/manager/common/utils/JsonUtils.java | 7 + .../common/utils/jmx/JmxConnectorWrap.java | 2 +- .../manager/common/zookeeper/ZkPathUtil.java | 10 +- .../cache/PhysicalClusterMetadataManager.java | 14 +- .../service/service/ClusterService.java | 17 ++ .../service/service/ZookeeperService.java | 16 ++ .../impl/GatewayConfigServiceImpl.java | 15 +- .../service/impl/ClusterServiceImpl.java | 46 +++- .../service/impl/ConsumerServiceImpl.java | 2 +- .../service/impl/ZookeeperServiceImpl.java | 54 +++++ .../manager/service/utils/TopicCommands.java | 4 +- .../service/zookeeper/TopicStateListener.java | 22 +- .../kafka/manager/dao/TopicDao.java | 2 - .../kafka/manager/dao/gateway/AppDao.java | 4 - .../manager/dao/gateway/AuthorityDao.java | 4 - .../manager/dao/gateway/impl/AppDaoImpl.java | 26 +- .../dao/gateway/impl/AuthorityDaoImpl.java | 46 ++-- .../kafka/manager/dao/impl/TopicDaoImpl.java | 30 ++- .../kafka/manager/task/Constant.java | 5 + .../kafka/manager/task/DaoBackgroundTask.java | 41 ++++ .../resources/mapper/GatewayConfigDao.xml | 8 +- .../OrderExtensionAddGatewayConfigDTO.java | 12 + .../OrderExtensionModifyGatewayConfigDTO.java | 12 + .../kafka/manager/kcm/common/Constant.java | 18 ++ .../common/bizenum/ClusterTaskActionEnum.java | 39 +-- .../kcm/common/entry/ao/ClusterTaskLog.java | 24 ++ .../kcm/common/entry/ao/CreationTaskData.java | 4 +- .../kcm/component/agent/AbstractAgent.java | 75 +++++- .../manager/kcm/component/agent/n9e/N9e.java | 222 +++++++----------- .../agent/n9e/entry/N9eCreationTask.java | 151 ++++++++++++ ...eTaskResultDTO.java => N9eTaskResult.java} | 2 +- .../agent/n9e/entry/N9eTaskStdoutLog.java | 35 +++ .../n9e/entry/bizenum/N9eTaskStatusEnum.java | 59 +++++ .../kcm/component/storage/s3/S3Service.java | 7 +- .../kcm/impl/ClusterTaskServiceImpl.java | 108 +++++---- .../kcm/impl/KafkaFileServiceImpl.java | 4 +- .../gateway/GatewayHeartbeatController.java | 2 +- .../GatewayServiceDiscoveryController.java | 13 +- .../versionone/op/OpClusterController.java | 38 +-- .../op/OpGatewayConfigController.java | 17 +- .../rd/RdGatewayConfigController.java | 4 +- .../versionone/rd/RdKafkaFileController.java | 12 +- .../rd/RdOperateRecordController.java | 3 +- .../web/converters/GatewayModelConverter.java | 17 +- .../web/inteceptor/WebMetricsInterceptor.java | 2 +- .../src/main/resources/application.yml | 4 +- 56 files changed, 1018 insertions(+), 432 deletions(-) create mode 100644 kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/TopicExpiredStatusEnum.java delete mode 100644 kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/config/SinkTopicRequestTimeMetricsConfig.java create mode 100644 kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/op/ControllerPreferredCandidateDTO.java create mode 100644 kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/task/Constant.java create mode 100644 kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/task/DaoBackgroundTask.java create mode 100644 kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/Constant.java create mode 100644 kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/entry/ao/ClusterTaskLog.java create mode 100644 kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eCreationTask.java rename kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/{N9eTaskResultDTO.java => N9eTaskResult.java} (99%) create mode 100644 kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eTaskStdoutLog.java create mode 100644 kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/bizenum/N9eTaskStatusEnum.java diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/TopicExpiredStatusEnum.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/TopicExpiredStatusEnum.java new file mode 100644 index 00000000..bac44235 --- /dev/null +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/TopicExpiredStatusEnum.java @@ -0,0 +1,32 @@ +package com.xiaojukeji.kafka.manager.common.bizenum; + +/** + * 过期Topic状态 + * @author zengqiao + * @date 21/01/25 + */ +public enum TopicExpiredStatusEnum { + ALREADY_NOTIFIED_AND_DELETED(-2, "已通知, 已下线"), + ALREADY_NOTIFIED_AND_CAN_DELETE(-1, "已通知, 可下线"), + ALREADY_EXPIRED_AND_WAIT_NOTIFY(0, "已过期, 待通知"), + ALREADY_NOTIFIED_AND_WAIT_RESPONSE(1, "已通知, 待反馈"), + + ; + + private int status; + + private String message; + + TopicExpiredStatusEnum(int status, String message) { + this.status = status; + this.message = message; + } + + public int getStatus() { + return status; + } + + public String getMessage() { + return message; + } +} diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/Result.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/Result.java index 0fb38302..323e9ec9 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/Result.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/Result.java @@ -97,7 +97,7 @@ public class Result implements Serializable { return result; } - public static Result buildFailure(String message) { + public static Result buildGatewayFailure(String message) { Result result = new Result(); result.setCode(ResultStatus.GATEWAY_INVALID_REQUEST.getCode()); result.setMessage(message); @@ -105,6 +105,14 @@ public class Result implements Serializable { return result; } + public static Result buildFailure(String message) { + Result result = new Result(); + result.setCode(ResultStatus.FAIL.getCode()); + result.setMessage(message); + result.setData(null); + return result; + } + public static Result buildFrom(ResultStatus resultStatus) { Result result = new Result(); result.setCode(resultStatus.getCode()); diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java index 76e3aca8..94acb56d 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java @@ -12,6 +12,8 @@ public enum ResultStatus { SUCCESS(Constant.SUCCESS, "success"), + FAIL(1, "操作失败"), + /** * 操作错误[1000, 2000) * ------------------------------------------------------------------------------------------ @@ -91,6 +93,8 @@ public enum ResultStatus { ZOOKEEPER_CONNECT_FAILED(8020, "zookeeper connect failed"), ZOOKEEPER_READ_FAILED(8021, "zookeeper read failed"), + ZOOKEEPER_WRITE_FAILED(8022, "zookeeper write failed"), + ZOOKEEPER_DELETE_FAILED(8023, "zookeeper delete failed"), // 调用集群任务里面的agent失败 CALL_CLUSTER_TASK_AGENT_FAILED(8030, " call cluster task agent failed"), diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/ClusterDetailDTO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/ClusterDetailDTO.java index 937d9cf8..2e903485 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/ClusterDetailDTO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/ClusterDetailDTO.java @@ -23,6 +23,8 @@ public class ClusterDetailDTO { private String securityProperties; + private String jmxProperties; + private Integer status; private Date gmtCreate; @@ -103,6 +105,14 @@ public class ClusterDetailDTO { this.securityProperties = securityProperties; } + public String getJmxProperties() { + return jmxProperties; + } + + public void setJmxProperties(String jmxProperties) { + this.jmxProperties = jmxProperties; + } + public Integer getStatus() { return status; } @@ -176,8 +186,9 @@ public class ClusterDetailDTO { ", bootstrapServers='" + bootstrapServers + '\'' + ", kafkaVersion='" + kafkaVersion + '\'' + ", idc='" + idc + '\'' + - ", mode='" + mode + '\'' + + ", mode=" + mode + ", securityProperties='" + securityProperties + '\'' + + ", jmxProperties='" + jmxProperties + '\'' + ", status=" + status + ", gmtCreate=" + gmtCreate + ", gmtModify=" + gmtModify + diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/config/SinkTopicRequestTimeMetricsConfig.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/config/SinkTopicRequestTimeMetricsConfig.java deleted file mode 100644 index 91faaba1..00000000 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/config/SinkTopicRequestTimeMetricsConfig.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.xiaojukeji.kafka.manager.common.entity.ao.config; - -/** - * @author zengqiao - * @date 20/9/7 - */ -public class SinkTopicRequestTimeMetricsConfig { - private Long clusterId; - - private String topicName; - - private Long startId; - - private Long step; - - public Long getClusterId() { - return clusterId; - } - - public void setClusterId(Long clusterId) { - this.clusterId = clusterId; - } - - public String getTopicName() { - return topicName; - } - - public void setTopicName(String topicName) { - this.topicName = topicName; - } - - public Long getStartId() { - return startId; - } - - public void setStartId(Long startId) { - this.startId = startId; - } - - public Long getStep() { - return step; - } - - public void setStep(Long step) { - this.step = step; - } - - @Override - public String toString() { - return "SinkTopicRequestTimeMetricsConfig{" + - "clusterId=" + clusterId + - ", topicName='" + topicName + '\'' + - ", startId=" + startId + - ", step=" + step + - '}'; - } -} \ No newline at end of file diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/op/ControllerPreferredCandidateDTO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/op/ControllerPreferredCandidateDTO.java new file mode 100644 index 00000000..1b4c95b9 --- /dev/null +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/op/ControllerPreferredCandidateDTO.java @@ -0,0 +1,45 @@ +package com.xiaojukeji.kafka.manager.common.entity.dto.op; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; + +/** + * @author zengqiao + * @date 21/01/24 + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@ApiModel(description="优选为Controller的候选者") +public class ControllerPreferredCandidateDTO { + @ApiModelProperty(value="集群ID") + private Long clusterId; + + @ApiModelProperty(value="优选为controller的BrokerId") + private List brokerIdList; + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public List getBrokerIdList() { + return brokerIdList; + } + + public void setBrokerIdList(List brokerIdList) { + this.brokerIdList = brokerIdList; + } + + @Override + public String toString() { + return "ControllerPreferredCandidateDTO{" + + "clusterId=" + clusterId + + ", brokerIdList=" + brokerIdList + + '}'; + } +} diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/rd/ClusterDTO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/rd/ClusterDTO.java index 0b6fcebb..7afc09c6 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/rd/ClusterDTO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/rd/ClusterDTO.java @@ -102,12 +102,11 @@ public class ClusterDTO { '}'; } - public Boolean legal() { + public boolean legal() { if (ValidateUtils.isNull(clusterName) || ValidateUtils.isNull(zookeeper) || ValidateUtils.isNull(idc) - || ValidateUtils.isNull(bootstrapServers) - ) { + || ValidateUtils.isNull(bootstrapServers)) { return false; } return true; diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/gateway/GatewayConfigDO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/gateway/GatewayConfigDO.java index c0e96000..fa29c7cf 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/gateway/GatewayConfigDO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/gateway/GatewayConfigDO.java @@ -17,6 +17,8 @@ public class GatewayConfigDO { private Long version; + private String description; + private Date createTime; private Date modifyTime; @@ -61,6 +63,14 @@ public class GatewayConfigDO { this.version = version; } + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + public Date getCreateTime() { return createTime; } @@ -85,6 +95,7 @@ public class GatewayConfigDO { ", name='" + name + '\'' + ", value='" + value + '\'' + ", version=" + version + + ", description='" + description + '\'' + ", createTime=" + createTime + ", modifyTime=" + modifyTime + '}'; diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/op/expert/ExpiredTopicVO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/op/expert/ExpiredTopicVO.java index 46c7a3a2..c4921259 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/op/expert/ExpiredTopicVO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/op/expert/ExpiredTopicVO.java @@ -28,7 +28,7 @@ public class ExpiredTopicVO { @ApiModelProperty(value = "负责人") private String principals; - @ApiModelProperty(value = "状态, -1:可下线, 0:过期待通知, 1+:已通知待反馈") + @ApiModelProperty(value = "状态, -1:已通知可下线, 0:过期待通知, 1+:已通知待反馈") private Integer status; public Long getClusterId() { diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/GatewayConfigVO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/GatewayConfigVO.java index a0b402af..72314c31 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/GatewayConfigVO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/GatewayConfigVO.java @@ -26,6 +26,9 @@ public class GatewayConfigVO { @ApiModelProperty(value="版本") private Long version; + @ApiModelProperty(value="描述说明") + private String description; + @ApiModelProperty(value="创建时间") private Date createTime; @@ -72,6 +75,14 @@ public class GatewayConfigVO { this.version = version; } + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + public Date getCreateTime() { return createTime; } @@ -96,6 +107,7 @@ public class GatewayConfigVO { ", name='" + name + '\'' + ", value='" + value + '\'' + ", version=" + version + + ", description='" + description + '\'' + ", createTime=" + createTime + ", modifyTime=" + modifyTime + '}'; diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/JsonUtils.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/JsonUtils.java index 46d177ad..283d59c5 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/JsonUtils.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/JsonUtils.java @@ -60,6 +60,13 @@ public class JsonUtils { return JSON.parseObject(src, clazz); } + public static List stringToArrObj(String src, Class clazz) { + if (ValidateUtils.isBlank(src)) { + return null; + } + return JSON.parseArray(src, clazz); + } + public static List parseTopicConnections(Long clusterId, JSONObject jsonObject, long postTime) { List connectionDOList = new ArrayList<>(); for (String clientType: jsonObject.keySet()) { diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/JmxConnectorWrap.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/JmxConnectorWrap.java index fc70c6b2..c7c69ca3 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/JmxConnectorWrap.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/JmxConnectorWrap.java @@ -79,7 +79,7 @@ public class JmxConnectorWrap { try { Map environment = new HashMap(); if (!ValidateUtils.isBlank(this.jmxConfig.getUsername()) && !ValidateUtils.isBlank(this.jmxConfig.getPassword())) { - environment.put(javax.management.remote.JMXConnector.CREDENTIALS, Arrays.asList(this.jmxConfig.getUsername(), this.jmxConfig.getPassword())); + environment.put(JMXConnector.CREDENTIALS, Arrays.asList(this.jmxConfig.getUsername(), this.jmxConfig.getPassword())); } if (jmxConfig.isOpenSSL() != null && this.jmxConfig.isOpenSSL()) { environment.put(Context.SECURITY_PROTOCOL, "ssl"); diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/ZkPathUtil.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/ZkPathUtil.java index e0a5632a..6705f435 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/ZkPathUtil.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/ZkPathUtil.java @@ -33,7 +33,9 @@ public class ZkPathUtil { private static final String D_METRICS_CONFIG_ROOT_NODE = CONFIG_ROOT_NODE + ZOOKEEPER_SEPARATOR + "KafkaExMetrics"; - public static final String D_CONTROLLER_CANDIDATES = CONFIG_ROOT_NODE + ZOOKEEPER_SEPARATOR + "extension/candidates"; + public static final String D_CONFIG_EXTENSION_ROOT_NODE = CONFIG_ROOT_NODE + ZOOKEEPER_SEPARATOR + "extension"; + + public static final String D_CONTROLLER_CANDIDATES = D_CONFIG_EXTENSION_ROOT_NODE + ZOOKEEPER_SEPARATOR + "candidates"; public static String getBrokerIdNodePath(Integer brokerId) { return BROKER_IDS_ROOT + ZOOKEEPER_SEPARATOR + String.valueOf(brokerId); @@ -111,6 +113,10 @@ public class ZkPathUtil { } public static String getKafkaExtraMetricsPath(Integer brokerId) { - return D_METRICS_CONFIG_ROOT_NODE + ZOOKEEPER_SEPARATOR + String.valueOf(brokerId); + return D_METRICS_CONFIG_ROOT_NODE + ZOOKEEPER_SEPARATOR + brokerId; + } + + public static String getControllerCandidatePath(Integer brokerId) { + return D_CONTROLLER_CANDIDATES + ZOOKEEPER_SEPARATOR + brokerId; } } diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java index 59453919..e3b8f23f 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java @@ -15,10 +15,7 @@ import com.xiaojukeji.kafka.manager.common.zookeeper.znode.brokers.TopicMetadata import com.xiaojukeji.kafka.manager.common.zookeeper.ZkConfigImpl; import com.xiaojukeji.kafka.manager.dao.ControllerDao; import com.xiaojukeji.kafka.manager.common.utils.jmx.JmxConnectorWrap; -import com.xiaojukeji.kafka.manager.dao.TopicDao; -import com.xiaojukeji.kafka.manager.dao.gateway.AuthorityDao; import com.xiaojukeji.kafka.manager.service.service.JmxService; -import com.xiaojukeji.kafka.manager.service.utils.ConfigUtils; import com.xiaojukeji.kafka.manager.service.zookeeper.*; import com.xiaojukeji.kafka.manager.service.service.ClusterService; import com.xiaojukeji.kafka.manager.common.zookeeper.ZkPathUtil; @@ -49,15 +46,6 @@ public class PhysicalClusterMetadataManager { @Autowired private ClusterService clusterService; - @Autowired - private ConfigUtils configUtils; - - @Autowired - private TopicDao topicDao; - - @Autowired - private AuthorityDao authorityDao; - private final static Map CLUSTER_MAP = new ConcurrentHashMap<>(); private final static Map CONTROLLER_DATA_MAP = new ConcurrentHashMap<>(); @@ -133,7 +121,7 @@ public class PhysicalClusterMetadataManager { zkConfig.watchChildren(ZkPathUtil.BROKER_IDS_ROOT, brokerListener); //增加Topic监控 - TopicStateListener topicListener = new TopicStateListener(clusterDO.getId(), zkConfig, topicDao, authorityDao); + TopicStateListener topicListener = new TopicStateListener(clusterDO.getId(), zkConfig); topicListener.init(); zkConfig.watchChildren(ZkPathUtil.BROKER_TOPICS_ROOT, topicListener); diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ClusterService.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ClusterService.java index b2c5f7b2..2feb321b 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ClusterService.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ClusterService.java @@ -4,6 +4,7 @@ import com.xiaojukeji.kafka.manager.common.entity.Result; import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; import com.xiaojukeji.kafka.manager.common.entity.ao.ClusterDetailDTO; import com.xiaojukeji.kafka.manager.common.entity.ao.cluster.ControllerPreferredCandidate; +import com.xiaojukeji.kafka.manager.common.entity.dto.op.ControllerPreferredCandidateDTO; import com.xiaojukeji.kafka.manager.common.entity.vo.normal.cluster.ClusterNameDTO; import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO; import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterMetricsDO; @@ -51,4 +52,20 @@ public interface ClusterService { * @return void */ Result> getControllerPreferredCandidates(Long clusterId); + + /** + * 增加优先被选举为controller的broker + * @param clusterId 集群ID + * @param brokerIdList brokerId列表 + * @return + */ + Result addControllerPreferredCandidates(Long clusterId, List brokerIdList); + + /** + * 减少优先被选举为controller的broker + * @param clusterId 集群ID + * @param brokerIdList brokerId列表 + * @return + */ + Result deleteControllerPreferredCandidates(Long clusterId, List brokerIdList); } diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ZookeeperService.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ZookeeperService.java index d24b2d24..d52d3bc7 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ZookeeperService.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ZookeeperService.java @@ -26,4 +26,20 @@ public interface ZookeeperService { * @return 操作结果 */ Result> getControllerPreferredCandidates(Long clusterId); + + /** + * 增加优先被选举为controller的broker + * @param clusterId 集群ID + * @param brokerId brokerId + * @return + */ + Result addControllerPreferredCandidate(Long clusterId, Integer brokerId); + + /** + * 减少优先被选举为controller的broker + * @param clusterId 集群ID + * @param brokerId brokerId + * @return + */ + Result deleteControllerPreferredCandidate(Long clusterId, Integer brokerId); } diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/GatewayConfigServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/GatewayConfigServiceImpl.java index fce7b605..18ee0a0d 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/GatewayConfigServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/GatewayConfigServiceImpl.java @@ -221,13 +221,24 @@ public class GatewayConfigServiceImpl implements GatewayConfigService { if (ValidateUtils.isNull(oldGatewayConfigDO)) { return Result.buildFrom(ResultStatus.RESOURCE_NOT_EXIST); } + if (!oldGatewayConfigDO.getName().equals(newGatewayConfigDO.getName()) || !oldGatewayConfigDO.getType().equals(newGatewayConfigDO.getType()) || ValidateUtils.isBlank(newGatewayConfigDO.getValue())) { return Result.buildFrom(ResultStatus.PARAM_ILLEGAL); } - newGatewayConfigDO.setVersion(oldGatewayConfigDO.getVersion() + 1); - if (gatewayConfigDao.updateById(oldGatewayConfigDO) > 0) { + + // 获取当前同类配置, 插入之后需要增大这个version + List gatewayConfigDOList = gatewayConfigDao.getByConfigType(newGatewayConfigDO.getType()); + Long version = 1L; + for (GatewayConfigDO elem: gatewayConfigDOList) { + if (elem.getVersion() > version) { + version = elem.getVersion() + 1L; + } + } + + newGatewayConfigDO.setVersion(version); + if (gatewayConfigDao.updateById(newGatewayConfigDO) > 0) { return Result.buildSuc(); } return Result.buildFrom(ResultStatus.MYSQL_ERROR); diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java index 609c8cf9..e1a619a8 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java @@ -111,12 +111,13 @@ public class ClusterServiceImpl implements ClusterService { // 不允许修改zk地址 return ResultStatus.CHANGE_ZOOKEEPER_FORBIDDEN; } - clusterDO.setStatus(originClusterDO.getStatus()); Map content = new HashMap<>(); content.put("cluster id", clusterDO.getId().toString()); content.put("security properties", clusterDO.getSecurityProperties()); content.put("jmx properties", clusterDO.getJmxProperties()); operateRecordService.insert(operator, ModuleEnum.CLUSTER, clusterDO.getClusterName(), OperateEnum.EDIT, content); + + clusterDO.setStatus(originClusterDO.getStatus()); return updateById(clusterDO); } @@ -214,7 +215,7 @@ public class ClusterServiceImpl implements ClusterService { if (zk != null) { zk.close(); } - } catch (Throwable t) { + } catch (Exception e) { return false; } } @@ -275,7 +276,7 @@ public class ClusterServiceImpl implements ClusterService { try { Map content = new HashMap<>(); content.put("cluster id", clusterId.toString()); - operateRecordService.insert(operator, ModuleEnum.CLUSTER, getClusterName(clusterId).getPhysicalClusterName(), OperateEnum.DELETE, content); + operateRecordService.insert(operator, ModuleEnum.CLUSTER, String.valueOf(clusterId), OperateEnum.DELETE, content); if (clusterDao.deleteById(clusterId) <= 0) { LOGGER.error("delete cluster failed, clusterId:{}.", clusterId); return ResultStatus.MYSQL_ERROR; @@ -289,8 +290,9 @@ public class ClusterServiceImpl implements ClusterService { private ClusterDetailDTO getClusterDetailDTO(ClusterDO clusterDO, Boolean needDetail) { if (ValidateUtils.isNull(clusterDO)) { - return null; + return new ClusterDetailDTO(); } + ClusterDetailDTO dto = new ClusterDetailDTO(); dto.setClusterId(clusterDO.getId()); dto.setClusterName(clusterDO.getClusterName()); @@ -299,6 +301,7 @@ public class ClusterServiceImpl implements ClusterService { dto.setKafkaVersion(physicalClusterMetadataManager.getKafkaVersionFromCache(clusterDO.getId())); dto.setIdc(configUtils.getIdc()); dto.setSecurityProperties(clusterDO.getSecurityProperties()); + dto.setJmxProperties(clusterDO.getJmxProperties()); dto.setStatus(clusterDO.getStatus()); dto.setGmtCreate(clusterDO.getGmtCreate()); dto.setGmtModify(clusterDO.getGmtModify()); @@ -337,4 +340,39 @@ public class ClusterServiceImpl implements ClusterService { } return Result.buildSuc(controllerPreferredCandidateList); } + + @Override + public Result addControllerPreferredCandidates(Long clusterId, List brokerIdList) { + if (ValidateUtils.isNull(clusterId) || ValidateUtils.isEmptyList(brokerIdList)) { + return Result.buildFrom(ResultStatus.PARAM_ILLEGAL); + } + + // 增加的BrokerId需要判断是否存活 + for (Integer brokerId: brokerIdList) { + if (!PhysicalClusterMetadataManager.isBrokerAlive(clusterId, brokerId)) { + return Result.buildFrom(ResultStatus.BROKER_NOT_EXIST); + } + + Result result = zookeeperService.addControllerPreferredCandidate(clusterId, brokerId); + if (result.failed()) { + return result; + } + } + return Result.buildSuc(); + } + + @Override + public Result deleteControllerPreferredCandidates(Long clusterId, List brokerIdList) { + if (ValidateUtils.isNull(clusterId) || ValidateUtils.isEmptyList(brokerIdList)) { + return Result.buildFrom(ResultStatus.PARAM_ILLEGAL); + } + + for (Integer brokerId: brokerIdList) { + Result result = zookeeperService.deleteControllerPreferredCandidate(clusterId, brokerId); + if (result.failed()) { + return result; + } + } + return Result.buildSuc(); + } } diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ConsumerServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ConsumerServiceImpl.java index e228d36c..0d60d828 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ConsumerServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ConsumerServiceImpl.java @@ -129,7 +129,7 @@ public class ConsumerServiceImpl implements ConsumerService { } summary.setState(consumerGroupSummary.state()); - java.util.Iterator> it = JavaConversions.asJavaIterator(consumerGroupSummary.consumers().iterator()); + Iterator> it = JavaConversions.asJavaIterator(consumerGroupSummary.consumers().iterator()); while (it.hasNext()) { List consumerSummaryList = JavaConversions.asJavaList(it.next()); for (AdminClient.ConsumerSummary consumerSummary: consumerSummaryList) { diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ZookeeperServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ZookeeperServiceImpl.java index aa31ed33..c4c89513 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ZookeeperServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ZookeeperServiceImpl.java @@ -70,4 +70,58 @@ public class ZookeeperServiceImpl implements ZookeeperService { } return Result.buildFrom(ResultStatus.ZOOKEEPER_READ_FAILED); } + + @Override + public Result addControllerPreferredCandidate(Long clusterId, Integer brokerId) { + if (ValidateUtils.isNull(clusterId)) { + return Result.buildFrom(ResultStatus.PARAM_ILLEGAL); + } + ZkConfigImpl zkConfig = PhysicalClusterMetadataManager.getZKConfig(clusterId); + if (ValidateUtils.isNull(zkConfig)) { + return Result.buildFrom(ResultStatus.ZOOKEEPER_CONNECT_FAILED); + } + + try { + if (zkConfig.checkPathExists(ZkPathUtil.getControllerCandidatePath(brokerId))) { + // 节点已经存在, 则直接忽略 + return Result.buildSuc(); + } + + if (!zkConfig.checkPathExists(ZkPathUtil.D_CONFIG_EXTENSION_ROOT_NODE)) { + zkConfig.setOrCreatePersistentNodeStat(ZkPathUtil.D_CONFIG_EXTENSION_ROOT_NODE, ""); + } + + if (!zkConfig.checkPathExists(ZkPathUtil.D_CONTROLLER_CANDIDATES)) { + zkConfig.setOrCreatePersistentNodeStat(ZkPathUtil.D_CONTROLLER_CANDIDATES, ""); + } + + zkConfig.setOrCreatePersistentNodeStat(ZkPathUtil.getControllerCandidatePath(brokerId), ""); + return Result.buildSuc(); + } catch (Exception e) { + LOGGER.error("class=ZookeeperServiceImpl||method=addControllerPreferredCandidate||clusterId={}||brokerId={}||errMsg={}||", clusterId, brokerId, e.getMessage()); + } + return Result.buildFrom(ResultStatus.ZOOKEEPER_WRITE_FAILED); + } + + @Override + public Result deleteControllerPreferredCandidate(Long clusterId, Integer brokerId) { + if (ValidateUtils.isNull(clusterId)) { + return Result.buildFrom(ResultStatus.PARAM_ILLEGAL); + } + ZkConfigImpl zkConfig = PhysicalClusterMetadataManager.getZKConfig(clusterId); + if (ValidateUtils.isNull(zkConfig)) { + return Result.buildFrom(ResultStatus.ZOOKEEPER_CONNECT_FAILED); + } + + try { + if (!zkConfig.checkPathExists(ZkPathUtil.getControllerCandidatePath(brokerId))) { + return Result.buildSuc(); + } + zkConfig.delete(ZkPathUtil.getControllerCandidatePath(brokerId)); + return Result.buildSuc(); + } catch (Exception e) { + LOGGER.error("class=ZookeeperServiceImpl||method=deleteControllerPreferredCandidate||clusterId={}||brokerId={}||errMsg={}||", clusterId, brokerId, e.getMessage()); + } + return Result.buildFrom(ResultStatus.ZOOKEEPER_DELETE_FAILED); + } } \ No newline at end of file diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/utils/TopicCommands.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/utils/TopicCommands.java index 58e5d98b..6995eb97 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/utils/TopicCommands.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/utils/TopicCommands.java @@ -44,7 +44,7 @@ public class TopicCommands { ); // 生成分配策略 - scala.collection.Map> replicaAssignment = + scala.collection.Map> replicaAssignment = AdminUtils.assignReplicasToBrokers( convert2BrokerMetadataSeq(brokerIdList), partitionNum, @@ -177,7 +177,7 @@ public class TopicCommands { ) ); - Map> existingAssignJavaMap = + Map> existingAssignJavaMap = JavaConversions.asJavaMap(existingAssignScalaMap); // 新增分区的分配策略和旧的分配策略合并 Map> targetMap = new HashMap<>(); diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/zookeeper/TopicStateListener.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/zookeeper/TopicStateListener.java index f808b976..4314a101 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/zookeeper/TopicStateListener.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/zookeeper/TopicStateListener.java @@ -5,8 +5,6 @@ import com.xiaojukeji.kafka.manager.common.zookeeper.znode.brokers.TopicMetadata import com.xiaojukeji.kafka.manager.common.zookeeper.StateChangeListener; import com.xiaojukeji.kafka.manager.common.zookeeper.ZkConfigImpl; import com.xiaojukeji.kafka.manager.common.zookeeper.ZkPathUtil; -import com.xiaojukeji.kafka.manager.dao.TopicDao; -import com.xiaojukeji.kafka.manager.dao.gateway.AuthorityDao; import com.xiaojukeji.kafka.manager.service.cache.PhysicalClusterMetadataManager; import com.xiaojukeji.kafka.manager.service.cache.ThreadPool; import org.apache.zookeeper.data.Stat; @@ -24,28 +22,17 @@ import java.util.concurrent.*; * @date 20/5/14 */ public class TopicStateListener implements StateChangeListener { - private final static Logger LOGGER = LoggerFactory.getLogger(TopicStateListener.class); + private static final Logger LOGGER = LoggerFactory.getLogger(TopicStateListener.class); private Long clusterId; private ZkConfigImpl zkConfig; - private TopicDao topicDao; - - private AuthorityDao authorityDao; - public TopicStateListener(Long clusterId, ZkConfigImpl zkConfig) { this.clusterId = clusterId; this.zkConfig = zkConfig; } - public TopicStateListener(Long clusterId, ZkConfigImpl zkConfig, TopicDao topicDao, AuthorityDao authorityDao) { - this.clusterId = clusterId; - this.zkConfig = zkConfig; - this.topicDao = topicDao; - this.authorityDao = authorityDao; - } - @Override public void init() { try { @@ -53,7 +40,7 @@ public class TopicStateListener implements StateChangeListener { FutureTask[] taskList = new FutureTask[topicNameList.size()]; for (int i = 0; i < topicNameList.size(); i++) { String topicName = topicNameList.get(i); - taskList[i] = new FutureTask(new Callable() { + taskList[i] = new FutureTask(new Callable() { @Override public Object call() throws Exception { processTopicAdded(topicName); @@ -65,7 +52,6 @@ public class TopicStateListener implements StateChangeListener { } catch (Exception e) { LOGGER.error("init topics metadata failed, clusterId:{}.", clusterId, e); } - return; } @Override @@ -92,8 +78,6 @@ public class TopicStateListener implements StateChangeListener { private void processTopicDelete(String topicName) { LOGGER.warn("delete topic, clusterId:{} topicName:{}.", clusterId, topicName); PhysicalClusterMetadataManager.removeTopicMetadata(clusterId, topicName); - topicDao.removeTopicInCache(clusterId, topicName); - authorityDao.removeAuthorityInCache(clusterId, topicName); } private void processTopicAdded(String topicName) { @@ -122,4 +106,4 @@ public class TopicStateListener implements StateChangeListener { LOGGER.error("add topic failed, clusterId:{} topicMetadata:{}.", clusterId, topicMetadata, e); } } -} \ No newline at end of file +} diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicDao.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicDao.java index 3d3f5410..64e089a6 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicDao.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicDao.java @@ -22,6 +22,4 @@ public interface TopicDao { List listAll(); TopicDO getTopic(Long clusterId, String topicName, String appId); - - TopicDO removeTopicInCache(Long clusterId, String topicName); } \ No newline at end of file diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/AppDao.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/AppDao.java index 218c8656..7802005a 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/AppDao.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/AppDao.java @@ -16,8 +16,6 @@ public interface AppDao { */ int insert(AppDO appDO); - int insertIgnoreGatewayDB(AppDO appDO); - /** * 删除appId * @param appName App名称 @@ -60,6 +58,4 @@ public interface AppDao { * @return int */ int updateById(AppDO appDO); - - List listNewAll(); } \ No newline at end of file diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/AuthorityDao.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/AuthorityDao.java index a7a8affe..655218e9 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/AuthorityDao.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/AuthorityDao.java @@ -15,8 +15,6 @@ public interface AuthorityDao { */ int insert(AuthorityDO authorityDO); - int replaceIgnoreGatewayDB(AuthorityDO authorityDO); - /** * 获取权限 * @param clusterId 集群id @@ -38,7 +36,5 @@ public interface AuthorityDao { Map>> getAllAuthority(); - void removeAuthorityInCache(Long clusterId, String topicName); - int deleteAuthorityByTopic(Long clusterId, String topicName); } diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AppDaoImpl.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AppDaoImpl.java index aa08c1b4..62475b9b 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AppDaoImpl.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AppDaoImpl.java @@ -2,6 +2,7 @@ package com.xiaojukeji.kafka.manager.dao.gateway.impl; import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.AppDO; import com.xiaojukeji.kafka.manager.dao.gateway.AppDao; +import com.xiaojukeji.kafka.manager.task.Constant; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @@ -21,7 +22,7 @@ public class AppDaoImpl implements AppDao { /** * APP最近的一次更新时间, 更新之后的缓存 */ - private static Long APP_CACHE_LATEST_UPDATE_TIME = 0L; + private static volatile long APP_CACHE_LATEST_UPDATE_TIME = Constant.START_TIMESTAMP; private static final Map APP_MAP = new ConcurrentHashMap<>(); @Override @@ -29,11 +30,6 @@ public class AppDaoImpl implements AppDao { return sqlSession.insert("AppDao.insert", appDO); } - @Override - public int insertIgnoreGatewayDB(AppDO appDO) { - return sqlSession.insert("AppDao.insert", appDO); - } - @Override public int deleteByName(String appName) { return sqlSession.delete("AppDao.deleteByName", appName); @@ -66,7 +62,12 @@ public class AppDaoImpl implements AppDao { } private void updateTopicCache() { - Long timestamp = System.currentTimeMillis(); + long timestamp = System.currentTimeMillis(); + + if (timestamp + 1000 <= APP_CACHE_LATEST_UPDATE_TIME) { + // 近一秒内的请求不走db + return; + } Date afterTime = new Date(APP_CACHE_LATEST_UPDATE_TIME); List doList = sqlSession.selectList("AppDao.listAfterTime", afterTime); @@ -76,19 +77,22 @@ public class AppDaoImpl implements AppDao { /** * 更新APP缓存 */ - synchronized private void updateTopicCache(List doList, Long timestamp) { + private synchronized void updateTopicCache(List doList, long timestamp) { if (doList == null || doList.isEmpty() || APP_CACHE_LATEST_UPDATE_TIME >= timestamp) { // 本次无数据更新, 或者本次更新过时 时, 忽略本次更新 return; } + if (APP_CACHE_LATEST_UPDATE_TIME == Constant.START_TIMESTAMP) { + APP_MAP.clear(); + } + for (AppDO elem: doList) { APP_MAP.put(elem.getAppId(), elem); } APP_CACHE_LATEST_UPDATE_TIME = timestamp; } - @Override - public List listNewAll() { - return sqlSession.selectList("AppDao.listNewAll"); + public static void resetCache() { + APP_CACHE_LATEST_UPDATE_TIME = Constant.START_TIMESTAMP; } } \ No newline at end of file diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AuthorityDaoImpl.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AuthorityDaoImpl.java index 74a7cab0..1b5df873 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AuthorityDaoImpl.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AuthorityDaoImpl.java @@ -1,8 +1,8 @@ package com.xiaojukeji.kafka.manager.dao.gateway.impl; import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.AuthorityDO; -import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.dao.gateway.AuthorityDao; +import com.xiaojukeji.kafka.manager.task.Constant; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @@ -23,7 +23,8 @@ public class AuthorityDaoImpl implements AuthorityDao { * Authority最近的一次更新时间, 更新之后的缓存 * >> */ - private static Long AUTHORITY_CACHE_LATEST_UPDATE_TIME = 0L; + private static volatile long AUTHORITY_CACHE_LATEST_UPDATE_TIME = Constant.START_TIMESTAMP; + private static final Map>> AUTHORITY_MAP = new ConcurrentHashMap<>(); @Override @@ -31,11 +32,6 @@ public class AuthorityDaoImpl implements AuthorityDao { return sqlSession.insert("AuthorityDao.replace", authorityDO); } - @Override - public int replaceIgnoreGatewayDB(AuthorityDO authorityDO) { - return sqlSession.insert("AuthorityDao.replace", authorityDO); - } - @Override public List getAuthority(Long clusterId, String topicName, String appId) { Map params = new HashMap<>(3); @@ -62,8 +58,8 @@ public class AuthorityDaoImpl implements AuthorityDao { } List authorityDOList = new ArrayList<>(); - for (Long clusterId: doMap.keySet()) { - authorityDOList.addAll(doMap.get(clusterId).values()); + for (Map.Entry> entry: doMap.entrySet()) { + authorityDOList.addAll(entry.getValue().values()); } return authorityDOList; } @@ -87,23 +83,6 @@ public class AuthorityDaoImpl implements AuthorityDao { return AUTHORITY_MAP; } - @Override - public void removeAuthorityInCache(Long clusterId, String topicName) { - AUTHORITY_MAP.forEach((appId, map) -> { - map.forEach((id, subMap) -> { - if (id.equals(clusterId)) { - subMap.remove(topicName); - if (subMap.isEmpty()) { - map.remove(id); - } - } - }); - if (map.isEmpty()) { - AUTHORITY_MAP.remove(appId); - } - }); - } - @Override public int deleteAuthorityByTopic(Long clusterId, String topicName) { Map params = new HashMap<>(2); @@ -116,6 +95,11 @@ public class AuthorityDaoImpl implements AuthorityDao { private void updateAuthorityCache() { Long timestamp = System.currentTimeMillis(); + if (timestamp + 1000 <= AUTHORITY_CACHE_LATEST_UPDATE_TIME) { + // 近一秒内的请求不走db + return; + } + Date afterTime = new Date(AUTHORITY_CACHE_LATEST_UPDATE_TIME); List doList = sqlSession.selectList("AuthorityDao.listAfterTime", afterTime); updateAuthorityCache(doList, timestamp); @@ -124,11 +108,15 @@ public class AuthorityDaoImpl implements AuthorityDao { /** * 更新Topic缓存 */ - synchronized private void updateAuthorityCache(List doList, Long timestamp) { + private synchronized void updateAuthorityCache(List doList, Long timestamp) { if (doList == null || doList.isEmpty() || AUTHORITY_CACHE_LATEST_UPDATE_TIME >= timestamp) { // 本次无数据更新, 或者本次更新过时 时, 忽略本次更新 return; } + if (AUTHORITY_CACHE_LATEST_UPDATE_TIME == Constant.START_TIMESTAMP) { + AUTHORITY_MAP.clear(); + } + for (AuthorityDO elem: doList) { Map> doMap = AUTHORITY_MAP.getOrDefault(elem.getAppId(), new ConcurrentHashMap<>()); @@ -139,4 +127,8 @@ public class AuthorityDaoImpl implements AuthorityDao { } AUTHORITY_CACHE_LATEST_UPDATE_TIME = timestamp; } + + public static void resetCache() { + AUTHORITY_CACHE_LATEST_UPDATE_TIME = Constant.START_TIMESTAMP; + } } diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java index ba4468df..3c1ba335 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java @@ -2,6 +2,7 @@ package com.xiaojukeji.kafka.manager.dao.impl; import com.xiaojukeji.kafka.manager.common.entity.pojo.TopicDO; import com.xiaojukeji.kafka.manager.dao.TopicDao; +import com.xiaojukeji.kafka.manager.task.Constant; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @@ -18,7 +19,8 @@ public class TopicDaoImpl implements TopicDao { /** * Topic最近的一次更新时间, 更新之后的缓存 */ - private static Long TOPIC_CACHE_LATEST_UPDATE_TIME = 0L; + private static volatile long TOPIC_CACHE_LATEST_UPDATE_TIME = Constant.START_TIMESTAMP; + private static final Map> TOPIC_MAP = new ConcurrentHashMap<>(); @Autowired @@ -62,7 +64,7 @@ public class TopicDaoImpl implements TopicDao { @Override public List getByClusterId(Long clusterId) { updateTopicCache(); - return new ArrayList<>(TOPIC_MAP.getOrDefault(clusterId, new ConcurrentHashMap<>(0)).values()); + return new ArrayList<>(TOPIC_MAP.getOrDefault(clusterId, Collections.emptyMap()).values()); } @Override @@ -75,28 +77,28 @@ public class TopicDaoImpl implements TopicDao { updateTopicCache(); List doList = new ArrayList<>(); for (Long clusterId: TOPIC_MAP.keySet()) { - doList.addAll(TOPIC_MAP.getOrDefault(clusterId, new ConcurrentHashMap<>(0)).values()); + doList.addAll(TOPIC_MAP.getOrDefault(clusterId, Collections.emptyMap()).values()); } return doList; } @Override public TopicDO getTopic(Long clusterId, String topicName, String appId) { - Map params = new HashMap<>(2); + Map params = new HashMap<>(3); params.put("clusterId", clusterId); params.put("topicName", topicName); params.put("appId", appId); return sqlSession.selectOne("TopicDao.getTopic", params); } - @Override - public TopicDO removeTopicInCache(Long clusterId, String topicName) { - return TOPIC_MAP.getOrDefault(clusterId, new HashMap<>(0)).remove(topicName); - } - private void updateTopicCache() { Long timestamp = System.currentTimeMillis(); + if (timestamp + 1000 <= TOPIC_CACHE_LATEST_UPDATE_TIME) { + // 近一秒内的请求不走db + return; + } + Date afterTime = new Date(TOPIC_CACHE_LATEST_UPDATE_TIME); List doList = sqlSession.selectList("TopicDao.listAfterTime", afterTime); updateTopicCache(doList, timestamp); @@ -105,11 +107,15 @@ public class TopicDaoImpl implements TopicDao { /** * 更新Topic缓存 */ - synchronized private void updateTopicCache(List doList, Long timestamp) { + private synchronized void updateTopicCache(List doList, Long timestamp) { if (doList == null || doList.isEmpty() || TOPIC_CACHE_LATEST_UPDATE_TIME >= timestamp) { // 本次无数据更新, 或者本次更新过时 时, 忽略本次更新 return; } + if (TOPIC_CACHE_LATEST_UPDATE_TIME == Constant.START_TIMESTAMP) { + TOPIC_MAP.clear(); + } + for (TopicDO elem: doList) { Map doMap = TOPIC_MAP.getOrDefault(elem.getClusterId(), new ConcurrentHashMap<>()); doMap.put(elem.getTopicName(), elem); @@ -117,4 +123,8 @@ public class TopicDaoImpl implements TopicDao { } TOPIC_CACHE_LATEST_UPDATE_TIME = timestamp; } + + public static void resetCache() { + TOPIC_CACHE_LATEST_UPDATE_TIME = Constant.START_TIMESTAMP; + } } \ No newline at end of file diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/task/Constant.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/task/Constant.java new file mode 100644 index 00000000..3a50d7c1 --- /dev/null +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/task/Constant.java @@ -0,0 +1,5 @@ +package com.xiaojukeji.kafka.manager.task; + +public class Constant { + public static final long START_TIMESTAMP = 0; +} diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/task/DaoBackgroundTask.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/task/DaoBackgroundTask.java new file mode 100644 index 00000000..a750aff8 --- /dev/null +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/task/DaoBackgroundTask.java @@ -0,0 +1,41 @@ +package com.xiaojukeji.kafka.manager.task; + +import com.xiaojukeji.kafka.manager.common.utils.factory.DefaultThreadFactory; +import com.xiaojukeji.kafka.manager.dao.gateway.impl.AppDaoImpl; +import com.xiaojukeji.kafka.manager.dao.gateway.impl.AuthorityDaoImpl; +import com.xiaojukeji.kafka.manager.dao.impl.TopicDaoImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * 后台任务线程 + * @author zengqiao + * @date 21/02/02 + */ +@Service +public class DaoBackgroundTask { + private static final Logger LOGGER = LoggerFactory.getLogger(DaoBackgroundTask.class); + + private static final ScheduledExecutorService SYNC_CACHE_THREAD_POOL = Executors.newSingleThreadScheduledExecutor(new DefaultThreadFactory("syncCacheTask")); + + @PostConstruct + public void init() { + SYNC_CACHE_THREAD_POOL.scheduleAtFixedRate(() -> { + LOGGER.info("class=DaoBackgroundTask||method=init||msg=sync cache start"); + + TopicDaoImpl.resetCache(); + + AppDaoImpl.resetCache(); + + AuthorityDaoImpl.resetCache(); + + LOGGER.info("class=DaoBackgroundTask||method=init||msg=sync cache finished"); + }, 1, 10, TimeUnit.MINUTES); + } +} diff --git a/kafka-manager-dao/src/main/resources/mapper/GatewayConfigDao.xml b/kafka-manager-dao/src/main/resources/mapper/GatewayConfigDao.xml index 8aa91925..ac003836 100644 --- a/kafka-manager-dao/src/main/resources/mapper/GatewayConfigDao.xml +++ b/kafka-manager-dao/src/main/resources/mapper/GatewayConfigDao.xml @@ -8,6 +8,7 @@ + @@ -27,9 +28,9 @@ @@ -45,7 +46,8 @@ `type`=#{type}, `name`=#{name}, `value`=#{value}, - `version`=#{version} + `version`=#{version}, + `description`=#{description} WHERE id=#{id} ]]> diff --git a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/common/entry/apply/gateway/OrderExtensionAddGatewayConfigDTO.java b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/common/entry/apply/gateway/OrderExtensionAddGatewayConfigDTO.java index 0045bfe2..6a2c0bb4 100644 --- a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/common/entry/apply/gateway/OrderExtensionAddGatewayConfigDTO.java +++ b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/common/entry/apply/gateway/OrderExtensionAddGatewayConfigDTO.java @@ -18,6 +18,9 @@ public class OrderExtensionAddGatewayConfigDTO { @ApiModelProperty(value = "值") private String value; + @ApiModelProperty(value = "描述说明") + private String description; + public String getType() { return type; } @@ -42,12 +45,21 @@ public class OrderExtensionAddGatewayConfigDTO { this.value = value; } + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + @Override public String toString() { return "OrderExtensionAddGatewayConfigDTO{" + "type='" + type + '\'' + ", name='" + name + '\'' + ", value='" + value + '\'' + + ", description='" + description + '\'' + '}'; } diff --git a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/common/entry/apply/gateway/OrderExtensionModifyGatewayConfigDTO.java b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/common/entry/apply/gateway/OrderExtensionModifyGatewayConfigDTO.java index f5212f8c..3f749ea7 100644 --- a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/common/entry/apply/gateway/OrderExtensionModifyGatewayConfigDTO.java +++ b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/common/entry/apply/gateway/OrderExtensionModifyGatewayConfigDTO.java @@ -23,6 +23,9 @@ public class OrderExtensionModifyGatewayConfigDTO { @ApiModelProperty(value = "值") private String value; + @ApiModelProperty(value = "描述说明") + private String description; + public Long getId() { return id; } @@ -55,6 +58,14 @@ public class OrderExtensionModifyGatewayConfigDTO { this.value = value; } + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + @Override public String toString() { return "OrderExtensionModifyGatewayConfigDTO{" + @@ -62,6 +73,7 @@ public class OrderExtensionModifyGatewayConfigDTO { ", type='" + type + '\'' + ", name='" + name + '\'' + ", value='" + value + '\'' + + ", description='" + description + '\'' + '}'; } diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/Constant.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/Constant.java new file mode 100644 index 00000000..f73c3fd6 --- /dev/null +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/Constant.java @@ -0,0 +1,18 @@ +package com.xiaojukeji.kafka.manager.kcm.common; + +public class Constant { + /** + * + */ + public static final String TASK_TITLE_PREFIX = "Logi-Kafka"; + + /** + * 并发度,顺序执行 + */ + public static final Integer AGENT_TASK_BATCH = 1; + + /** + * 失败的容忍度为0 + */ + public static final Integer AGENT_TASK_TOLERANCE = 0; +} diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/bizenum/ClusterTaskActionEnum.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/bizenum/ClusterTaskActionEnum.java index 556acab8..a51e2c68 100644 --- a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/bizenum/ClusterTaskActionEnum.java +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/bizenum/ClusterTaskActionEnum.java @@ -6,34 +6,35 @@ package com.xiaojukeji.kafka.manager.kcm.common.bizenum; * @date 20/4/26 */ public enum ClusterTaskActionEnum { - START(0, "start"), - PAUSE(1, "pause"), - IGNORE(2, "ignore"), - CANCEL(3, "cancel"), - ROLLBACK(4, "rollback"), + UNKNOWN("unknown"), + + START("start"), + PAUSE("pause"), + + IGNORE("ignore"), + CANCEL("cancel"), + + REDO("redo"), + KILL("kill"), + + ROLLBACK("rollback"), + ; - private Integer code; - private String message; + private String action; - ClusterTaskActionEnum(Integer code, String message) { - this.code = code; - this.message = message; + ClusterTaskActionEnum(String action) { + this.action = action; } - public Integer getCode() { - return code; - } - - public String getMessage() { - return message; + public String getAction() { + return action; } @Override public String toString() { - return "TaskActionEnum{" + - "code=" + code + - ", message='" + message + '\'' + + return "ClusterTaskActionEnum{" + + "action='" + action + '\'' + '}'; } } diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/entry/ao/ClusterTaskLog.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/entry/ao/ClusterTaskLog.java new file mode 100644 index 00000000..ff89fa99 --- /dev/null +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/entry/ao/ClusterTaskLog.java @@ -0,0 +1,24 @@ +package com.xiaojukeji.kafka.manager.kcm.common.entry.ao; + +public class ClusterTaskLog { + private String stdout; + + public ClusterTaskLog(String stdout) { + this.stdout = stdout; + } + + public String getStdout() { + return stdout; + } + + public void setStdout(String stdout) { + this.stdout = stdout; + } + + @Override + public String toString() { + return "AgentOperationTaskLog{" + + "stdout='" + stdout + '\'' + + '}'; + } +} diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/entry/ao/CreationTaskData.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/entry/ao/CreationTaskData.java index bc025d5c..8c2cd1ec 100644 --- a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/entry/ao/CreationTaskData.java +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/common/entry/ao/CreationTaskData.java @@ -1,5 +1,7 @@ package com.xiaojukeji.kafka.manager.kcm.common.entry.ao; +import com.xiaojukeji.kafka.manager.common.entity.Result; + import java.util.List; /** @@ -119,7 +121,7 @@ public class CreationTaskData { @Override public String toString() { - return "CreationTaskDTO{" + + return "CreationTaskData{" + "uuid='" + uuid + '\'' + ", clusterId=" + clusterId + ", hostList=" + hostList + diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/AbstractAgent.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/AbstractAgent.java index 88872868..70ce5902 100644 --- a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/AbstractAgent.java +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/AbstractAgent.java @@ -1,9 +1,18 @@ package com.xiaojukeji.kafka.manager.kcm.component.agent; +import com.xiaojukeji.kafka.manager.common.entity.Result; +import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskActionEnum; import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskStateEnum; import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskSubStateEnum; +import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.ClusterTaskLog; import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.CreationTaskData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.util.Map; @@ -13,33 +22,79 @@ import java.util.Map; * @date 20/4/26 */ public abstract class AbstractAgent { + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractAgent.class); + /** * 创建任务 + * @param creationTaskData 创建任务参数 + * @return 任务ID */ - public abstract Long createTask(CreationTaskData dto); + public abstract Result createTask(CreationTaskData creationTaskData); /** - * 任务动作 + * 执行任务 + * @param taskId 任务ID + * @param actionEnum 执行动作 + * @return true:触发成功, false:触发失败 */ - public abstract Boolean actionTask(Long taskId, String action); + public abstract boolean actionTask(Long taskId, ClusterTaskActionEnum actionEnum); /** - * 任务动作 + * 执行任务 + * @param taskId 任务ID + * @param actionEnum 执行动作 + * @param hostname 具体主机 + * @return true:触发成功, false:触发失败 */ - public abstract Boolean actionHostTask(Long taskId, String action, String hostname); + public abstract boolean actionHostTask(Long taskId, ClusterTaskActionEnum actionEnum, String hostname); /** - * 获取任务状态 + * 获取任务运行的状态[阻塞, 执行中, 完成等] + * @param taskId 任务ID + * @return 任务状态 */ - public abstract ClusterTaskStateEnum getTaskState(Long agentTaskId); + public abstract Result getTaskExecuteState(Long taskId); /** * 获取任务结果 + * @param taskId 任务ID + * @return 任务结果 */ - public abstract Map getTaskResult(Long taskId); + public abstract Result> getTaskResult(Long taskId); /** - * 获取任务日志 + * 获取任务执行日志 + * @param taskId 任务ID + * @param hostname 具体主机 + * @return 机器运行日志 */ - public abstract String getTaskLog(Long agentTaskId, String hostname); + public abstract Result getTaskLog(Long taskId, String hostname); + + protected static String readScriptInJarFile(String fileName) { + InputStream inputStream = AbstractAgent.class.getClassLoader().getResourceAsStream(fileName); + if (inputStream == null) { + LOGGER.error("class=AbstractAgent||method=readScriptInJarFile||fileName={}||msg=read script failed", fileName); + return ""; + } + + try { + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + String line = null; + + StringBuilder sb = new StringBuilder(); + while ((line = bufferedReader.readLine()) != null) { + sb.append(line).append("\n"); + } + return sb.toString(); + } catch (Exception e) { + LOGGER.error("class=AbstractAgent||method=readScriptInJarFile||fileName={}||errMsg={}||msg=read script failed", fileName, e.getMessage()); + } finally { + try { + inputStream.close(); + } catch (IOException e) { + LOGGER.error("class=AbstractAgent||method=readScriptInJarFile||fileName={}||errMsg={}||msg=close reading script failed", fileName, e.getMessage()); + } + } + return ""; + } } \ No newline at end of file diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/N9e.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/N9e.java index f1f4b586..6e3fa677 100644 --- a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/N9e.java +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/N9e.java @@ -1,8 +1,11 @@ package com.xiaojukeji.kafka.manager.kcm.component.agent.n9e; -import com.alibaba.fastjson.JSON; import com.xiaojukeji.kafka.manager.common.bizenum.KafkaFileEnum; +import com.xiaojukeji.kafka.manager.common.entity.Result; +import com.xiaojukeji.kafka.manager.kcm.common.Constant; +import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskActionEnum; import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskTypeEnum; +import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.ClusterTaskLog; import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.CreationTaskData; import com.xiaojukeji.kafka.manager.common.utils.HttpUtils; import com.xiaojukeji.kafka.manager.common.utils.JsonUtils; @@ -11,20 +14,17 @@ import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskStateEnum; import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskSubStateEnum; import com.xiaojukeji.kafka.manager.kcm.component.agent.AbstractAgent; +import com.xiaojukeji.kafka.manager.kcm.component.agent.n9e.entry.N9eCreationTask; import com.xiaojukeji.kafka.manager.kcm.component.agent.n9e.entry.N9eResult; -import com.xiaojukeji.kafka.manager.kcm.component.agent.n9e.entry.N9eTaskResultDTO; -import com.xiaojukeji.kafka.manager.kcm.component.agent.n9e.entry.N9eTaskStatusEnum; -import com.xiaojukeji.kafka.manager.kcm.component.agent.n9e.entry.N9eTaskStdoutDTO; +import com.xiaojukeji.kafka.manager.kcm.component.agent.n9e.entry.N9eTaskResult; +import com.xiaojukeji.kafka.manager.kcm.component.agent.n9e.entry.N9eTaskStdoutLog; +import com.xiaojukeji.kafka.manager.kcm.component.agent.n9e.entry.bizenum.N9eTaskStatusEnum; import org.springframework.beans.factory.annotation.Value; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -54,16 +54,6 @@ public class N9e extends AbstractAgent { private String script; - /** - * 并发度,顺序执行 - */ - private static final Integer BATCH = 1; - - /** - * 失败的容忍度为0 - */ - private static final Integer TOLERANCE = 0; - private static final String CREATE_TASK_URI = "/api/job-ce/tasks"; private static final String ACTION_TASK_URI = "/api/job-ce/task/{taskId}/action"; @@ -82,143 +72,134 @@ public class N9e extends AbstractAgent { } @Override - public Long createTask(CreationTaskData creationTaskData) { - Map param = buildCreateTaskParam(creationTaskData); + public Result createTask(CreationTaskData creationTaskData) { + String content = JsonUtils.toJSONString(buildCreateTaskParam(creationTaskData)); String response = null; try { - response = HttpUtils.postForString( - baseUrl + CREATE_TASK_URI, - JsonUtils.toJSONString(param), - buildHeader() - ); - N9eResult zr = JSON.parseObject(response, N9eResult.class); - if (!ValidateUtils.isBlank(zr.getErr())) { - LOGGER.warn("class=N9e||method=createTask||param={}||errMsg={}||msg=call create task fail", JsonUtils.toJSONString(param),zr.getErr()); - return null; + response = HttpUtils.postForString(baseUrl + CREATE_TASK_URI, content, buildHeader()); + N9eResult nr = JsonUtils.stringToObj(response, N9eResult.class); + if (!ValidateUtils.isBlank(nr.getErr())) { + LOGGER.error("class=N9e||method=createTask||param={}||response={}||msg=call create task failed", content, response); + return Result.buildFailure(nr.getErr()); } - return Long.valueOf(zr.getDat().toString()); + return Result.buildSuc(Long.valueOf(nr.getDat().toString())); } catch (Exception e) { - LOGGER.error("create task failed, req:{}.", creationTaskData, e); + LOGGER.error("class=N9e||method=createTask||param={}||response={}||errMsg={}||msg=call create task failed", content, response, e.getMessage()); } - return null; + return Result.buildFailure("create n9e task failed"); } @Override - public Boolean actionTask(Long taskId, String action) { + public boolean actionTask(Long taskId, ClusterTaskActionEnum actionEnum) { Map param = new HashMap<>(1); - param.put("action", action); + param.put("action", actionEnum.getAction()); String response = null; try { - response = HttpUtils.putForString( - baseUrl + ACTION_TASK_URI.replace("{taskId}", taskId.toString()), - JSON.toJSONString(param), - buildHeader() - ); - N9eResult zr = JSON.parseObject(response, N9eResult.class); - if (ValidateUtils.isBlank(zr.getErr())) { + response = HttpUtils.putForString(baseUrl + ACTION_TASK_URI.replace("{taskId}", String.valueOf(taskId)), JsonUtils.toJSONString(param), buildHeader()); + N9eResult nr = JsonUtils.stringToObj(response, N9eResult.class); + if (ValidateUtils.isBlank(nr.getErr())) { return true; } - LOGGER.warn("class=N9e||method=actionTask||param={}||errMsg={}||msg=call action task fail", JSON.toJSONString(param),zr.getErr()); + + LOGGER.error("class=N9e||method=actionTask||param={}||response={}||msg=call action task fail", JsonUtils.toJSONString(param), response); return false; } catch (Exception e) { - LOGGER.error("action task failed, taskId:{}, action:{}.", taskId, action, e); + LOGGER.error("class=N9e||method=actionTask||param={}||response={}||errMsg={}||msg=call action task fail", JsonUtils.toJSONString(param), response, e.getMessage()); } return false; } @Override - public Boolean actionHostTask(Long taskId, String action, String hostname) { - Map param = new HashMap<>(2); - param.put("action", action); - param.put("hostname", hostname); + public boolean actionHostTask(Long taskId, ClusterTaskActionEnum actionEnum, String hostname) { + Map params = new HashMap<>(2); + params.put("action", actionEnum.getAction()); + params.put("hostname", hostname); String response = null; try { - response = HttpUtils.putForString( - baseUrl + ACTION_HOST_TASK_URI.replace("{taskId}", taskId.toString()), - JSON.toJSONString(param), - buildHeader() - ); - N9eResult zr = JSON.parseObject(response, N9eResult.class); - if (ValidateUtils.isBlank(zr.getErr())) { + response = HttpUtils.putForString(baseUrl + ACTION_HOST_TASK_URI.replace("{taskId}", String.valueOf(taskId)), JsonUtils.toJSONString(params), buildHeader()); + N9eResult nr = JsonUtils.stringToObj(response, N9eResult.class); + if (ValidateUtils.isBlank(nr.getErr())) { return true; } - LOGGER.warn("class=N9e||method=actionHostTask||param={}||errMsg={}||msg=call action host task fail", JSON.toJSONString(param),zr.getErr()); + + LOGGER.error("class=N9e||method=actionHostTask||params={}||response={}||msg=call action host task fail", JsonUtils.toJSONString(params), response); return false; } catch (Exception e) { - LOGGER.error("action task failed, taskId:{} action:{} hostname:{}.", taskId, action, hostname, e); + LOGGER.error("class=N9e||method=actionHostTask||params={}||response={}||errMsg={}||msg=call action host task fail", JsonUtils.toJSONString(params), response, e.getMessage()); } return false; } @Override - public ClusterTaskStateEnum getTaskState(Long agentTaskId) { + public Result getTaskExecuteState(Long taskId) { String response = null; try { // 获取任务的state - response = HttpUtils.get( - baseUrl + TASK_STATE_URI.replace("{taskId}", agentTaskId.toString()), null - ); - N9eResult n9eResult = JSON.parseObject(response, N9eResult.class); - if (!ValidateUtils.isBlank(n9eResult.getErr())) { - LOGGER.error("get response result failed, agentTaskId:{} response:{}.", agentTaskId, response); - return null; + response = HttpUtils.get(baseUrl + TASK_STATE_URI.replace("{taskId}", String.valueOf(taskId)), null); + N9eResult nr = JsonUtils.stringToObj(response, N9eResult.class); + if (!ValidateUtils.isBlank(nr.getErr())) { + return Result.buildFailure(nr.getErr()); } - String state = JSON.parseObject(JSON.toJSONString(n9eResult.getDat()), String.class); + + String state = JsonUtils.stringToObj(JsonUtils.toJSONString(nr.getDat()), String.class); + N9eTaskStatusEnum n9eTaskStatusEnum = N9eTaskStatusEnum.getByMessage(state); if (ValidateUtils.isNull(n9eTaskStatusEnum)) { - LOGGER.error("get task status failed, agentTaskId:{} state:{}.", agentTaskId, state); - return null; + LOGGER.error("class=N9e||method=getTaskExecuteState||taskId={}||response={}||msg=get task state failed", taskId, response); + return Result.buildFailure("unknown state, state:" + state); } - return n9eTaskStatusEnum.getStatus(); + return Result.buildSuc(n9eTaskStatusEnum.getStatus()); } catch (Exception e) { - LOGGER.error("get task status failed, agentTaskId:{} response:{}.", agentTaskId, response, e); + LOGGER.error("class=N9e||method=getTaskExecuteState||taskId={}||response={}||errMsg={}||msg=get task state failed", taskId, response, e.getMessage()); } - return null; + return Result.buildFailure("get task state failed"); } @Override - public Map getTaskResult(Long agentTaskId) { + public Result> getTaskResult(Long taskId) { String response = null; try { // 获取子任务的state - response = HttpUtils.get(baseUrl + TASK_SUB_STATE_URI.replace("{taskId}", agentTaskId.toString()), null); - N9eResult n9eResult = JSON.parseObject(response, N9eResult.class); + response = HttpUtils.get(baseUrl + TASK_SUB_STATE_URI.replace("{taskId}", String.valueOf(taskId)), null); + N9eResult nr = JsonUtils.stringToObj(response, N9eResult.class); + if (!ValidateUtils.isBlank(nr.getErr())) { + LOGGER.error("class=N9e||method=getTaskResult||taskId={}||response={}||msg=get task result failed", taskId, response); + return Result.buildFailure(nr.getErr()); + } - N9eTaskResultDTO n9eTaskResultDTO = - JSON.parseObject(JSON.toJSONString(n9eResult.getDat()), N9eTaskResultDTO.class); - return n9eTaskResultDTO.convert2HostnameStatusMap(); + return Result.buildSuc(JsonUtils.stringToObj(JsonUtils.toJSONString(nr.getDat()), N9eTaskResult.class).convert2HostnameStatusMap()); } catch (Exception e) { - LOGGER.error("get task result failed, agentTaskId:{} response:{}.", agentTaskId, response, e); + LOGGER.error("class=N9e||method=getTaskResult||taskId={}||response={}||errMsg={}||msg=get task result failed", taskId, response, e.getMessage()); } - return null; + return Result.buildFailure("get task result failed"); } @Override - public String getTaskLog(Long agentTaskId, String hostname) { + public Result getTaskLog(Long taskId, String hostname) { + Map params = new HashMap<>(1); + params.put("hostname", hostname); + String response = null; try { - Map params = new HashMap<>(1); - params.put("hostname", hostname); + response = HttpUtils.get(baseUrl + TASK_STD_LOG_URI.replace("{taskId}", String.valueOf(taskId)), params); + N9eResult nr = JsonUtils.stringToObj(response, N9eResult.class); + if (!ValidateUtils.isBlank(nr.getErr())) { + LOGGER.error("class=N9e||method=getTaskLog||taskId={}||response={}||msg=get task log failed", taskId, response); + return Result.buildFailure(nr.getErr()); + } - response = HttpUtils.get(baseUrl + TASK_STD_LOG_URI.replace("{taskId}", agentTaskId.toString()), params); - N9eResult n9eResult = JSON.parseObject(response, N9eResult.class); - if (!ValidateUtils.isBlank(n9eResult.getErr())) { - LOGGER.error("get task log failed, agentTaskId:{} response:{}.", agentTaskId, response); - return null; - } - List dtoList = - JSON.parseArray(JSON.toJSONString(n9eResult.getDat()), N9eTaskStdoutDTO.class); + List dtoList = JsonUtils.stringToArrObj(JsonUtils.toJSONString(nr.getDat()), N9eTaskStdoutLog.class); if (ValidateUtils.isEmptyList(dtoList)) { - return ""; + return Result.buildSuc(new ClusterTaskLog("")); } - return dtoList.get(0).getStdout(); + return Result.buildSuc(new ClusterTaskLog(dtoList.get(0).getStdout())); } catch (Exception e) { - LOGGER.error("get task log failed, agentTaskId:{}.", agentTaskId, e); + LOGGER.error("class=N9e||method=getTaskLog||taskId={}||response={}||errMsg={}||msg=get task log failed", taskId, response, e.getMessage()); } - return null; + return Result.buildFailure("get task log failed"); } private Map buildHeader() { @@ -228,7 +209,7 @@ public class N9e extends AbstractAgent { return headers; } - private Map buildCreateTaskParam(CreationTaskData creationTaskData) { + private N9eCreationTask buildCreateTaskParam(CreationTaskData creationTaskData) { StringBuilder sb = new StringBuilder(); sb.append(creationTaskData.getUuid()).append(",,"); sb.append(creationTaskData.getClusterId()).append(",,"); @@ -240,46 +221,17 @@ public class N9e extends AbstractAgent { sb.append(creationTaskData.getServerPropertiesMd5()).append(",,"); sb.append(creationTaskData.getServerPropertiesUrl()); - Map params = new HashMap<>(10); - params.put("title", String.format("集群ID=%d-升级部署", creationTaskData.getClusterId())); - params.put("batch", BATCH); - params.put("tolerance", TOLERANCE); - params.put("timeout", timeout); - params.put("pause", ListUtils.strList2String(creationTaskData.getPauseList())); - params.put("script", this.script); - params.put("args", sb.toString()); - params.put("account", account); - params.put("action", "pause"); - params.put("hosts", creationTaskData.getHostList()); - return params; - } - - private static String readScriptInJarFile(String fileName) { - InputStream inputStream = N9e.class.getClassLoader().getResourceAsStream(fileName); - if (inputStream == null) { - LOGGER.error("read kcm script failed, filename:{}", fileName); - return ""; - } - - try { - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); - String line = null; - StringBuilder stringBuilder = new StringBuilder(""); - - while ((line = bufferedReader.readLine()) != null) { - stringBuilder.append(line); - stringBuilder.append("\n"); - } - return stringBuilder.toString(); - } catch (IOException e) { - LOGGER.error("read kcm script failed, filename:{}", fileName, e); - return ""; - } finally { - try { - inputStream.close(); - } catch (IOException e) { - LOGGER.error("close reading kcm script failed, filename:{}", fileName, e); - } - } + N9eCreationTask n9eCreationTask = new N9eCreationTask(); + n9eCreationTask.setTitle(Constant.TASK_TITLE_PREFIX + "-集群ID:" + creationTaskData.getClusterId()); + n9eCreationTask.setBatch(Constant.AGENT_TASK_BATCH); + n9eCreationTask.setTolerance(Constant.AGENT_TASK_TOLERANCE); + n9eCreationTask.setTimeout(this.timeout); + n9eCreationTask.setPause(ListUtils.strList2String(creationTaskData.getPauseList())); + n9eCreationTask.setScript(this.script); + n9eCreationTask.setArgs(sb.toString()); + n9eCreationTask.setAccount(this.account); + n9eCreationTask.setAction(ClusterTaskActionEnum.PAUSE.getAction()); + n9eCreationTask.setHosts(creationTaskData.getHostList()); + return n9eCreationTask; } } \ No newline at end of file diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eCreationTask.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eCreationTask.java new file mode 100644 index 00000000..6ca4c85c --- /dev/null +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eCreationTask.java @@ -0,0 +1,151 @@ +package com.xiaojukeji.kafka.manager.kcm.component.agent.n9e.entry; + +import java.util.List; + +public class N9eCreationTask { + /** + * 任务标题 + */ + private String title; + + /** + * 并发度, =2则表示两台并发执行 + */ + private Integer batch; + + /** + * 错误容忍度, 达到容忍度之上时, 任务会被暂停并不可以继续执行 + */ + private Integer tolerance; + + /** + * 单台任务的超时时间(秒) + */ + private Integer timeout; + + /** + * 暂停点, 格式: host1,host2,host3 + */ + private String pause; + + /** + * 任务执行对应的脚本 + */ + private String script; + + /** + * 任务参数 + */ + private String args; + + /** + * 使用的账号 + */ + private String account; + + /** + * 动作 + */ + private String action; + + /** + * 操作的主机列表 + */ + private List hosts; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Integer getBatch() { + return batch; + } + + public void setBatch(Integer batch) { + this.batch = batch; + } + + public Integer getTolerance() { + return tolerance; + } + + public void setTolerance(Integer tolerance) { + this.tolerance = tolerance; + } + + public Integer getTimeout() { + return timeout; + } + + public void setTimeout(Integer timeout) { + this.timeout = timeout; + } + + public String getPause() { + return pause; + } + + public void setPause(String pause) { + this.pause = pause; + } + + public String getScript() { + return script; + } + + public void setScript(String script) { + this.script = script; + } + + public String getArgs() { + return args; + } + + public void setArgs(String args) { + this.args = args; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public List getHosts() { + return hosts; + } + + public void setHosts(List hosts) { + this.hosts = hosts; + } + + @Override + public String toString() { + return "N9eCreationTask{" + + "title='" + title + '\'' + + ", batch=" + batch + + ", tolerance=" + tolerance + + ", timeout=" + timeout + + ", pause='" + pause + '\'' + + ", script='" + script + '\'' + + ", args='" + args + '\'' + + ", account='" + account + '\'' + + ", action='" + action + '\'' + + ", hosts=" + hosts + + '}'; + } +} diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eTaskResultDTO.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eTaskResult.java similarity index 99% rename from kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eTaskResultDTO.java rename to kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eTaskResult.java index b787f016..e0e67b0e 100644 --- a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eTaskResultDTO.java +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eTaskResult.java @@ -12,7 +12,7 @@ import java.util.Map; * @author zengqiao * @date 20/9/7 */ -public class N9eTaskResultDTO { +public class N9eTaskResult { private List waiting; private List running; diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eTaskStdoutLog.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eTaskStdoutLog.java new file mode 100644 index 00000000..622aaa3e --- /dev/null +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/N9eTaskStdoutLog.java @@ -0,0 +1,35 @@ +package com.xiaojukeji.kafka.manager.kcm.component.agent.n9e.entry; + +/** + * @author zengqiao + * @date 20/9/7 + */ +public class N9eTaskStdoutLog { + private String host; + + private String stdout; + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getStdout() { + return stdout; + } + + public void setStdout(String stdout) { + this.stdout = stdout; + } + + @Override + public String toString() { + return "N9eTaskStdoutDTO{" + + "host='" + host + '\'' + + ", stdout='" + stdout + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/bizenum/N9eTaskStatusEnum.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/bizenum/N9eTaskStatusEnum.java new file mode 100644 index 00000000..4453e703 --- /dev/null +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/agent/n9e/entry/bizenum/N9eTaskStatusEnum.java @@ -0,0 +1,59 @@ +package com.xiaojukeji.kafka.manager.kcm.component.agent.n9e.entry.bizenum; + +import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskStateEnum; + +/** + * @author zengqiao + * @date 20/9/3 + */ +public enum N9eTaskStatusEnum { + DONE(0, "done", ClusterTaskStateEnum.FINISHED), + PAUSE(1, "pause", ClusterTaskStateEnum.BLOCKED), + START(2, "start", ClusterTaskStateEnum.RUNNING), + ; + + private Integer code; + + private String message; + + private ClusterTaskStateEnum status; + + N9eTaskStatusEnum(Integer code, String message, ClusterTaskStateEnum status) { + this.code = code; + this.message = message; + this.status = status; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public ClusterTaskStateEnum getStatus() { + return status; + } + + public void setStatus(ClusterTaskStateEnum status) { + this.status = status; + } + + public static N9eTaskStatusEnum getByMessage(String message) { + for (N9eTaskStatusEnum elem: N9eTaskStatusEnum.values()) { + if (elem.message.equals(message)) { + return elem; + } + } + return null; + } +} \ No newline at end of file diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/storage/s3/S3Service.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/storage/s3/S3Service.java index 419e66e0..9519efd2 100644 --- a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/storage/s3/S3Service.java +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/component/storage/s3/S3Service.java @@ -54,7 +54,7 @@ public class S3Service extends AbstractStorageService { InputStream inputStream = null; try { if (!createBucketIfNotExist()) { - return false; + return false; } inputStream = uploadFile.getInputStream(); @@ -95,7 +95,10 @@ public class S3Service extends AbstractStorageService { @Override public String getDownloadBaseUrl() { - return this.endpoint + "/" + this.bucket; + if (this.endpoint.startsWith("http://")) { + return this.endpoint + "/" + this.bucket; + } + return "http://" + this.endpoint + "/" + this.bucket; } private boolean createBucketIfNotExist() { diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/impl/ClusterTaskServiceImpl.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/impl/ClusterTaskServiceImpl.java index a190350a..b3ef959a 100644 --- a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/impl/ClusterTaskServiceImpl.java +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/impl/ClusterTaskServiceImpl.java @@ -6,6 +6,7 @@ import com.xiaojukeji.kafka.manager.kcm.ClusterTaskService; import com.xiaojukeji.kafka.manager.kcm.common.Converters; import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskActionEnum; import com.xiaojukeji.kafka.manager.kcm.common.entry.ClusterTaskConstant; +import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.ClusterTaskLog; import com.xiaojukeji.kafka.manager.kcm.common.entry.ao.ClusterTaskSubStatus; import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskStateEnum; import com.xiaojukeji.kafka.manager.kcm.common.bizenum.ClusterTaskSubStateEnum; @@ -34,7 +35,7 @@ import java.util.*; */ @Service("clusterTaskService") public class ClusterTaskServiceImpl implements ClusterTaskService { - private final static Logger LOGGER = LoggerFactory.getLogger(ClusterTaskServiceImpl.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ClusterTaskServiceImpl.class); @Autowired private AbstractAgent abstractAgent; @@ -63,13 +64,13 @@ public class ClusterTaskServiceImpl implements ClusterTaskService { } // 创建任务 - Long agentTaskId = abstractAgent.createTask(dtoResult.getData()); - if (ValidateUtils.isNull(agentTaskId)) { + Result createResult = abstractAgent.createTask(dtoResult.getData()); + if (ValidateUtils.isNull(createResult) || createResult.failed()) { return Result.buildFrom(ResultStatus.CALL_CLUSTER_TASK_AGENT_FAILED); } try { - if (clusterTaskDao.insert(Converters.convert2ClusterTaskDO(agentTaskId, dtoResult.getData(), operator)) > 0) { + if (clusterTaskDao.insert(Converters.convert2ClusterTaskDO(createResult.getData(), dtoResult.getData(), operator)) > 0) { return Result.buildFrom(ResultStatus.SUCCESS); } } catch (Exception e) { @@ -87,45 +88,44 @@ public class ClusterTaskServiceImpl implements ClusterTaskService { Long agentTaskId = getActiveAgentTaskId(clusterTaskDO); Boolean rollback = inRollback(clusterTaskDO); - ClusterTaskStateEnum stateEnum = abstractAgent.getTaskState(agentTaskId); - if (ClusterTaskActionEnum.START.getMessage().equals(action) - && ClusterTaskStateEnum.BLOCKED.equals(stateEnum)) { + Result stateEnumResult = abstractAgent.getTaskExecuteState(agentTaskId); + if (ValidateUtils.isNull(stateEnumResult) || stateEnumResult.failed()) { + return ResultStatus.CALL_CLUSTER_TASK_AGENT_FAILED; + } + + if (ClusterTaskActionEnum.START.getAction().equals(action) && ClusterTaskStateEnum.BLOCKED.equals(stateEnumResult.getData())) { // 暂停状态, 可以执行开始 - return actionTaskExceptRollbackAction(agentTaskId, action, ""); + return actionTaskExceptRollbackAction(agentTaskId, ClusterTaskActionEnum.START, ""); } - if (ClusterTaskActionEnum.PAUSE.getMessage().equals(action) - && ClusterTaskStateEnum.RUNNING.equals(stateEnum)) { + if (ClusterTaskActionEnum.PAUSE.getAction().equals(action) && ClusterTaskStateEnum.RUNNING.equals(stateEnumResult.getData())) { // 运行状态, 可以执行暂停 - return actionTaskExceptRollbackAction(agentTaskId, action, ""); + return actionTaskExceptRollbackAction(agentTaskId, ClusterTaskActionEnum.PAUSE, ""); } - if (ClusterTaskActionEnum.IGNORE.getMessage().equals(action) - || ClusterTaskActionEnum.CANCEL.getMessage().equals(action)) { + if (ClusterTaskActionEnum.IGNORE.getAction().equals(action)) { // 忽略 & 取消随时都可以操作 - return actionTaskExceptRollbackAction(agentTaskId, action, hostname); + return actionTaskExceptRollbackAction(agentTaskId, ClusterTaskActionEnum.IGNORE, hostname); } - if ((!ClusterTaskStateEnum.FINISHED.equals(stateEnum) || !rollback) - && ClusterTaskActionEnum.ROLLBACK.getMessage().equals(action)) { + if (ClusterTaskActionEnum.CANCEL.getAction().equals(action)) { + // 忽略 & 取消随时都可以操作 + return actionTaskExceptRollbackAction(agentTaskId, ClusterTaskActionEnum.CANCEL, hostname); + } + if ((!ClusterTaskStateEnum.FINISHED.equals(stateEnumResult.getData()) || !rollback) + && ClusterTaskActionEnum.ROLLBACK.getAction().equals(action)) { // 暂未操作完时可以回滚, 回滚所有操作过的机器到上一个版本 return actionTaskRollback(clusterTaskDO); } return ResultStatus.OPERATION_FAILED; } - private ResultStatus actionTaskExceptRollbackAction(Long agentId, String action, String hostname) { + private ResultStatus actionTaskExceptRollbackAction(Long agentId, ClusterTaskActionEnum actionEnum, String hostname) { if (!ValidateUtils.isBlank(hostname)) { - return actionHostTaskExceptRollbackAction(agentId, action, hostname); + return actionHostTaskExceptRollbackAction(agentId, actionEnum, hostname); } - if (abstractAgent.actionTask(agentId, action)) { - return ResultStatus.SUCCESS; - } - return ResultStatus.OPERATION_FAILED; + return abstractAgent.actionTask(agentId, actionEnum)? ResultStatus.SUCCESS: ResultStatus.OPERATION_FAILED; } - private ResultStatus actionHostTaskExceptRollbackAction(Long agentId, String action, String hostname) { - if (abstractAgent.actionHostTask(agentId, action, hostname)) { - return ResultStatus.SUCCESS; - } - return ResultStatus.OPERATION_FAILED; + private ResultStatus actionHostTaskExceptRollbackAction(Long agentId, ClusterTaskActionEnum actionEnum, String hostname) { + return abstractAgent.actionHostTask(agentId, actionEnum, hostname)? ResultStatus.SUCCESS: ResultStatus.OPERATION_FAILED; } private ResultStatus actionTaskRollback(ClusterTaskDO clusterTaskDO) { @@ -133,9 +133,9 @@ public class ClusterTaskServiceImpl implements ClusterTaskService { return ResultStatus.OPERATION_FORBIDDEN; } - Map subStatusEnumMap = + Result> subStatusEnumMapResult = abstractAgent.getTaskResult(clusterTaskDO.getAgentTaskId()); - if (ValidateUtils.isNull(subStatusEnumMap)) { + if (ValidateUtils.isNull(subStatusEnumMapResult) || subStatusEnumMapResult.failed()) { return ResultStatus.CALL_CLUSTER_TASK_AGENT_FAILED; } @@ -143,7 +143,7 @@ public class ClusterTaskServiceImpl implements ClusterTaskService { List rollbackHostList = new ArrayList<>(); List rollbackPauseHostList = new ArrayList<>(); for (String host: ListUtils.string2StrList(clusterTaskDO.getHostList())) { - ClusterTaskSubStateEnum subStateEnum = subStatusEnumMap.get(host); + ClusterTaskSubStateEnum subStateEnum = subStatusEnumMapResult.getData().get(host); if (ValidateUtils.isNull(subStateEnum)) { // 机器对应的任务查询失败 return ResultStatus.OPERATION_FAILED; @@ -166,17 +166,17 @@ public class ClusterTaskServiceImpl implements ClusterTaskService { clusterTaskDO.setRollbackPauseHostList(ListUtils.strList2String(rollbackPauseHostList)); // 创建任务 - Long agentTaskId = abstractAgent.createTask(Converters.convert2CreationTaskData(clusterTaskDO)); - if (ValidateUtils.isNull(agentTaskId)) { + Result createResult = abstractAgent.createTask(Converters.convert2CreationTaskData(clusterTaskDO)); + if (ValidateUtils.isNull(createResult) || createResult.failed()) { return ResultStatus.CALL_CLUSTER_TASK_AGENT_FAILED; } try { - clusterTaskDO.setAgentRollbackTaskId(agentTaskId); + clusterTaskDO.setAgentRollbackTaskId(createResult.getData()); if (clusterTaskDao.updateRollback(clusterTaskDO) <= 0) { return ResultStatus.MYSQL_ERROR; } - abstractAgent.actionTask(clusterTaskDO.getAgentTaskId(), ClusterTaskActionEnum.CANCEL.getMessage()); + abstractAgent.actionTask(clusterTaskDO.getAgentTaskId(), ClusterTaskActionEnum.CANCEL); return ResultStatus.SUCCESS; } catch (Exception e) { LOGGER.error("create cluster task failed, clusterTaskDO:{}.", clusterTaskDO, e); @@ -191,11 +191,11 @@ public class ClusterTaskServiceImpl implements ClusterTaskService { return Result.buildFrom(ResultStatus.TASK_NOT_EXIST); } - String stdoutLog = abstractAgent.getTaskLog(getActiveAgentTaskId(clusterTaskDO, hostname), hostname); - if (ValidateUtils.isNull(stdoutLog)) { + Result stdoutLogResult = abstractAgent.getTaskLog(getActiveAgentTaskId(clusterTaskDO, hostname), hostname); + if (ValidateUtils.isNull(stdoutLogResult) || stdoutLogResult.failed()) { return Result.buildFrom(ResultStatus.CALL_CLUSTER_TASK_AGENT_FAILED); } - return new Result<>(stdoutLog); + return new Result<>(stdoutLogResult.getData().getStdout()); } @Override @@ -205,24 +205,33 @@ public class ClusterTaskServiceImpl implements ClusterTaskService { return Result.buildFrom(ResultStatus.TASK_NOT_EXIST); } + Result statusEnumResult = abstractAgent.getTaskExecuteState(getActiveAgentTaskId(clusterTaskDO)); + if (ValidateUtils.isNull(statusEnumResult) || statusEnumResult.failed()) { + return new Result<>(statusEnumResult.getCode(), statusEnumResult.getMessage()); + } + return new Result<>(new ClusterTaskStatus( clusterTaskDO.getId(), clusterTaskDO.getClusterId(), inRollback(clusterTaskDO), - abstractAgent.getTaskState(getActiveAgentTaskId(clusterTaskDO)), + statusEnumResult.getData(), getTaskSubStatus(clusterTaskDO) )); } @Override public ClusterTaskStateEnum getTaskState(Long agentTaskId) { - return abstractAgent.getTaskState(agentTaskId); + Result statusEnumResult = abstractAgent.getTaskExecuteState(agentTaskId); + if (ValidateUtils.isNull(statusEnumResult) || statusEnumResult.failed()) { + return null; + } + return statusEnumResult.getData(); } private List getTaskSubStatus(ClusterTaskDO clusterTaskDO) { Map statusMap = this.getClusterTaskSubState(clusterTaskDO); if (ValidateUtils.isNull(statusMap)) { - return null; + return Collections.emptyList(); } List pauseList = ListUtils.string2StrList(clusterTaskDO.getPauseHostList()); @@ -242,20 +251,22 @@ public class ClusterTaskServiceImpl implements ClusterTaskService { } private Map getClusterTaskSubState(ClusterTaskDO clusterTaskDO) { - Map statusMap = abstractAgent.getTaskResult(clusterTaskDO.getAgentTaskId()); - if (ValidateUtils.isNull(statusMap)) { + Result> statusMapResult = abstractAgent.getTaskResult(clusterTaskDO.getAgentTaskId()); + if (ValidateUtils.isNull(statusMapResult) || statusMapResult.failed()) { return null; } + Map statusMap = statusMapResult.getData(); if (!inRollback(clusterTaskDO)) { return statusMap; } - Map rollbackStatusMap = + Result> rollbackStatusMapResult = abstractAgent.getTaskResult(clusterTaskDO.getAgentRollbackTaskId()); - if (ValidateUtils.isNull(rollbackStatusMap)) { + if (ValidateUtils.isNull(rollbackStatusMapResult) || rollbackStatusMapResult.failed()) { return null; } - statusMap.putAll(rollbackStatusMap); + + statusMap.putAll(rollbackStatusMapResult.getData()); return statusMap; } @@ -276,7 +287,7 @@ public class ClusterTaskServiceImpl implements ClusterTaskService { } catch (Exception e) { LOGGER.error("get all cluster task failed."); } - return null; + return Collections.emptyList(); } @Override @@ -302,9 +313,6 @@ public class ClusterTaskServiceImpl implements ClusterTaskService { } private boolean inRollback(ClusterTaskDO clusterTaskDO) { - if (ClusterTaskConstant.INVALID_AGENT_TASK_ID.equals(clusterTaskDO.getAgentRollbackTaskId())) { - return false; - } - return true; + return !ClusterTaskConstant.INVALID_AGENT_TASK_ID.equals(clusterTaskDO.getAgentRollbackTaskId()); } } \ No newline at end of file diff --git a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/impl/KafkaFileServiceImpl.java b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/impl/KafkaFileServiceImpl.java index 37f8753a..bef2fb89 100644 --- a/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/impl/KafkaFileServiceImpl.java +++ b/kafka-manager-extends/kafka-manager-kcm/src/main/java/com/xiaojukeji/kafka/manager/kcm/impl/KafkaFileServiceImpl.java @@ -4,12 +4,12 @@ import com.xiaojukeji.kafka.manager.common.bizenum.KafkaFileEnum; import com.xiaojukeji.kafka.manager.common.entity.Result; import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; import com.xiaojukeji.kafka.manager.common.entity.dto.normal.KafkaFileDTO; -import com.xiaojukeji.kafka.manager.common.entity.pojo.KafkaFileDO; import com.xiaojukeji.kafka.manager.common.utils.CopyUtils; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.dao.KafkaFileDao; -import com.xiaojukeji.kafka.manager.kcm.KafkaFileService; +import com.xiaojukeji.kafka.manager.common.entity.pojo.KafkaFileDO; import com.xiaojukeji.kafka.manager.kcm.component.storage.AbstractStorageService; +import com.xiaojukeji.kafka.manager.kcm.KafkaFileService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/gateway/GatewayHeartbeatController.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/gateway/GatewayHeartbeatController.java index 4fe01e22..02a11497 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/gateway/GatewayHeartbeatController.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/gateway/GatewayHeartbeatController.java @@ -50,7 +50,7 @@ public class GatewayHeartbeatController { doList = JsonUtils.parseTopicConnections(clusterId, jsonObject, System.currentTimeMillis()); } catch (Exception e) { LOGGER.error("class=GatewayHeartbeatController||method=receiveTopicConnections||clusterId={}||brokerId={}||msg=parse data failed||exception={}", clusterId, brokerId, e.getMessage()); - return Result.buildFailure("fail"); + return Result.buildGatewayFailure("fail"); } topicConnectionService.batchAdd(doList); diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/gateway/GatewayServiceDiscoveryController.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/gateway/GatewayServiceDiscoveryController.java index e490368d..425eba75 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/gateway/GatewayServiceDiscoveryController.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/gateway/GatewayServiceDiscoveryController.java @@ -31,7 +31,6 @@ import java.util.Map; @RestController @RequestMapping(ApiPrefix.GATEWAY_API_V1_PREFIX) public class GatewayServiceDiscoveryController { - private final static Logger LOGGER = LoggerFactory.getLogger(GatewayHeartbeatController.class); @Autowired @@ -65,7 +64,7 @@ public class GatewayServiceDiscoveryController { KafkaBootstrapServerConfig config = gatewayConfigService.getKafkaBootstrapServersConfig(Long.MIN_VALUE); if (ValidateUtils.isNull(config) || ValidateUtils.isNull(config.getClusterIdBootstrapServersMap())) { - return Result.buildFailure("call init kafka bootstrap servers failed"); + return Result.buildGatewayFailure("call init kafka bootstrap servers failed"); } if (ValidateUtils.isEmptyMap(config.getClusterIdBootstrapServersMap())) { return Result.buildSuc(); @@ -81,7 +80,7 @@ public class GatewayServiceDiscoveryController { KafkaBootstrapServerConfig config = gatewayConfigService.getKafkaBootstrapServersConfig(versionNumber); if (ValidateUtils.isNull(config) || ValidateUtils.isNull(config.getClusterIdBootstrapServersMap())) { - return Result.buildFailure("call update kafka bootstrap servers failed"); + return Result.buildGatewayFailure("call update kafka bootstrap servers failed"); } if (ValidateUtils.isEmptyMap(config.getClusterIdBootstrapServersMap())) { return Result.buildSuc(); @@ -99,7 +98,7 @@ public class GatewayServiceDiscoveryController { public Result getMaxRequestNum(@RequestParam("versionNumber") long versionNumber) { RequestQueueConfig config = gatewayConfigService.getRequestQueueConfig(versionNumber); if (ValidateUtils.isNull(config)) { - return Result.buildFailure("call get request queue size config failed"); + return Result.buildGatewayFailure("call get request queue size config failed"); } if (ValidateUtils.isNull(config.getMaxRequestQueueSize())) { return Result.buildSuc(); @@ -119,7 +118,7 @@ public class GatewayServiceDiscoveryController { public Result getAppIdRate(@RequestParam("versionNumber") long versionNumber) { AppRateConfig config = gatewayConfigService.getAppRateConfig(versionNumber); if (ValidateUtils.isNull(config)) { - return Result.buildFailure("call get app rate config failed"); + return Result.buildGatewayFailure("call get app rate config failed"); } if (ValidateUtils.isNull(config.getAppRateLimit())) { return Result.buildSuc(); @@ -139,7 +138,7 @@ public class GatewayServiceDiscoveryController { public Result getIpRate(@RequestParam("versionNumber") long versionNumber) { IpRateConfig config = gatewayConfigService.getIpRateConfig(versionNumber); if (ValidateUtils.isNull(config)) { - return Result.buildFailure("call get ip rate config failed"); + return Result.buildGatewayFailure("call get ip rate config failed"); } if (ValidateUtils.isNull(config.getIpRateLimit())) { return Result.buildSuc(); @@ -160,7 +159,7 @@ public class GatewayServiceDiscoveryController { SpRateConfig config = gatewayConfigService.getSpRateConfig(versionNumber); if (ValidateUtils.isNull(config) || ValidateUtils.isNull(config.getSpRateMap())) { - return Result.buildFailure("call update kafka bootstrap servers failed"); + return Result.buildGatewayFailure("call update kafka bootstrap servers failed"); } if (ValidateUtils.isEmptyMap(config.getSpRateMap())) { return Result.buildSuc(); diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/op/OpClusterController.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/op/OpClusterController.java index 07b7dbc4..2caaa69b 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/op/OpClusterController.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/op/OpClusterController.java @@ -2,6 +2,7 @@ package com.xiaojukeji.kafka.manager.web.api.versionone.op; import com.xiaojukeji.kafka.manager.common.entity.Result; import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; +import com.xiaojukeji.kafka.manager.common.entity.dto.op.ControllerPreferredCandidateDTO; import com.xiaojukeji.kafka.manager.common.entity.dto.rd.ClusterDTO; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.service.service.ClusterService; @@ -13,6 +14,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; + /** * @author zengqiao * @date 20/4/23 @@ -25,48 +27,56 @@ public class OpClusterController { private ClusterService clusterService; @ApiOperation(value = "接入集群") - @RequestMapping(value = "clusters", method = RequestMethod.POST) + @PostMapping(value = "clusters") @ResponseBody public Result addNew(@RequestBody ClusterDTO dto) { if (ValidateUtils.isNull(dto) || !dto.legal()) { return Result.buildFrom(ResultStatus.PARAM_ILLEGAL); } return Result.buildFrom( - clusterService.addNew( - ClusterModelConverter.convert2ClusterDO(dto), - SpringTool.getUserName() - ) + clusterService.addNew(ClusterModelConverter.convert2ClusterDO(dto), SpringTool.getUserName()) ); } @ApiOperation(value = "删除集群") - @RequestMapping(value = "clusters", method = RequestMethod.DELETE) + @DeleteMapping(value = "clusters") @ResponseBody public Result delete(@RequestParam(value = "clusterId") Long clusterId) { return Result.buildFrom(clusterService.deleteById(clusterId, SpringTool.getUserName())); } @ApiOperation(value = "修改集群信息") - @RequestMapping(value = "clusters", method = RequestMethod.PUT) + @PutMapping(value = "clusters") @ResponseBody public Result modify(@RequestBody ClusterDTO reqObj) { if (ValidateUtils.isNull(reqObj) || !reqObj.legal() || ValidateUtils.isNull(reqObj.getClusterId())) { return Result.buildFrom(ResultStatus.PARAM_ILLEGAL); } - ResultStatus rs = clusterService.updateById( - ClusterModelConverter.convert2ClusterDO(reqObj), - SpringTool.getUserName() + return Result.buildFrom( + clusterService.updateById(ClusterModelConverter.convert2ClusterDO(reqObj), SpringTool.getUserName()) ); - return Result.buildFrom(rs); } @ApiOperation(value = "开启|关闭集群监控") - @RequestMapping(value = "clusters/{clusterId}/monitor", method = RequestMethod.PUT) + @PutMapping(value = "clusters/{clusterId}/monitor") @ResponseBody - public Result modifyStatus(@PathVariable Long clusterId, - @RequestParam("status") Integer status) { + public Result modifyStatus(@PathVariable Long clusterId, @RequestParam("status") Integer status) { return Result.buildFrom( clusterService.modifyStatus(clusterId, status, SpringTool.getUserName()) ); } + + @ApiOperation(value = "增加Controller优先候选的Broker", notes = "滴滴内部引擎特性") + @PostMapping(value = "cluster-controller/preferred-candidates") + @ResponseBody + public Result addControllerPreferredCandidates(@RequestBody ControllerPreferredCandidateDTO dto) { + return clusterService.addControllerPreferredCandidates(dto.getClusterId(), dto.getBrokerIdList()); + } + + @ApiOperation(value = "删除Controller优先候选的Broker", notes = "滴滴内部引擎特性") + @DeleteMapping(value = "cluster-controller/preferred-candidates") + @ResponseBody + public Result deleteControllerPreferredCandidates(@RequestBody ControllerPreferredCandidateDTO dto) { + return clusterService.deleteControllerPreferredCandidates(dto.getClusterId(), dto.getBrokerIdList()); + } } \ No newline at end of file diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/op/OpGatewayConfigController.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/op/OpGatewayConfigController.java index a97bb386..66eb3b7e 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/op/OpGatewayConfigController.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/op/OpGatewayConfigController.java @@ -3,8 +3,11 @@ package com.xiaojukeji.kafka.manager.web.api.versionone.op; import com.xiaojukeji.kafka.manager.bpm.common.entry.apply.gateway.OrderExtensionAddGatewayConfigDTO; import com.xiaojukeji.kafka.manager.bpm.common.entry.apply.gateway.OrderExtensionDeleteGatewayConfigDTO; import com.xiaojukeji.kafka.manager.bpm.common.entry.apply.gateway.OrderExtensionModifyGatewayConfigDTO; +import com.xiaojukeji.kafka.manager.common.bizenum.gateway.GatewayConfigKeyEnum; +import com.xiaojukeji.kafka.manager.common.constant.ApiPrefix; import com.xiaojukeji.kafka.manager.common.entity.Result; import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; +import com.xiaojukeji.kafka.manager.common.utils.JsonUtils; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.service.service.gateway.GatewayConfigService; import com.xiaojukeji.kafka.manager.web.converters.GatewayModelConverter; @@ -16,12 +19,20 @@ import org.springframework.web.bind.annotation.*; @Api(tags = "OP-Gateway配置相关接口(REST)") @RestController +@RequestMapping(ApiPrefix.API_V1_OP_PREFIX) public class OpGatewayConfigController { @Autowired private GatewayConfigService gatewayConfigService; + @ApiOperation(value = "Gateway配置类型", notes = "") + @GetMapping(value = "gateway-configs/type-enums") + @ResponseBody + public Result getClusterModesEnum() { + return new Result<>(JsonUtils.toJson(GatewayConfigKeyEnum.class)); + } + @ApiOperation(value = "创建Gateway配置", notes = "") - @RequestMapping(value = "gateway-configs", method = RequestMethod.POST) + @PostMapping(value = "gateway-configs") @ResponseBody public Result createGatewayConfig(@RequestBody OrderExtensionAddGatewayConfigDTO dto) { if (ValidateUtils.isNull(dto) || !dto.legal()) { @@ -31,7 +42,7 @@ public class OpGatewayConfigController { } @ApiOperation(value = "修改Gateway配置", notes = "") - @RequestMapping(value = "gateway-configs", method = RequestMethod.PUT) + @PutMapping(value = "gateway-configs") @ResponseBody public Result modifyGatewayConfig(@RequestBody OrderExtensionModifyGatewayConfigDTO dto) { if (ValidateUtils.isNull(dto) || !dto.legal()) { @@ -41,7 +52,7 @@ public class OpGatewayConfigController { } @ApiOperation(value = "删除Gateway配置", notes = "") - @RequestMapping(value = "gateway-configs", method = RequestMethod.DELETE) + @DeleteMapping(value = "gateway-configs") @ResponseBody public Result deleteGatewayConfig(@RequestBody OrderExtensionDeleteGatewayConfigDTO dto) { if (ValidateUtils.isNull(dto) || !dto.legal()) { diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdGatewayConfigController.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdGatewayConfigController.java index 3748c3ca..6a46ff0a 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdGatewayConfigController.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdGatewayConfigController.java @@ -1,5 +1,6 @@ package com.xiaojukeji.kafka.manager.web.api.versionone.rd; +import com.xiaojukeji.kafka.manager.common.constant.ApiPrefix; import com.xiaojukeji.kafka.manager.common.entity.Result; import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.GatewayConfigDO; import com.xiaojukeji.kafka.manager.common.entity.vo.rd.GatewayConfigVO; @@ -15,12 +16,13 @@ import java.util.List; @Api(tags = "RD-Gateway配置相关接口(REST)") @RestController +@RequestMapping(ApiPrefix.API_V1_RD_PREFIX) public class RdGatewayConfigController { @Autowired private GatewayConfigService gatewayConfigService; @ApiOperation(value = "Gateway相关配置信息", notes = "") - @RequestMapping(value = "gateway-configs", method = RequestMethod.GET) + @GetMapping(value = "gateway-configs") @ResponseBody public Result> getGatewayConfigs() { List doList = gatewayConfigService.list(); diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdKafkaFileController.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdKafkaFileController.java index 009d540a..eaab7dc9 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdKafkaFileController.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdKafkaFileController.java @@ -1,17 +1,17 @@ package com.xiaojukeji.kafka.manager.web.api.versionone.rd; import com.xiaojukeji.kafka.manager.common.bizenum.KafkaFileEnum; -import com.xiaojukeji.kafka.manager.common.constant.ApiPrefix; import com.xiaojukeji.kafka.manager.common.entity.Result; import com.xiaojukeji.kafka.manager.common.entity.dto.normal.KafkaFileDTO; -import com.xiaojukeji.kafka.manager.common.entity.pojo.KafkaFileDO; import com.xiaojukeji.kafka.manager.common.entity.vo.rd.KafkaFileVO; +import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; +import com.xiaojukeji.kafka.manager.kcm.component.storage.common.StorageEnum; +import com.xiaojukeji.kafka.manager.common.entity.pojo.KafkaFileDO; +import com.xiaojukeji.kafka.manager.service.service.ClusterService; +import com.xiaojukeji.kafka.manager.kcm.KafkaFileService; import com.xiaojukeji.kafka.manager.common.utils.JsonUtils; import com.xiaojukeji.kafka.manager.common.utils.SpringTool; -import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; -import com.xiaojukeji.kafka.manager.kcm.KafkaFileService; -import com.xiaojukeji.kafka.manager.kcm.component.storage.common.StorageEnum; -import com.xiaojukeji.kafka.manager.service.service.ClusterService; +import com.xiaojukeji.kafka.manager.common.constant.ApiPrefix; import com.xiaojukeji.kafka.manager.web.converters.KafkaFileConverter; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdOperateRecordController.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdOperateRecordController.java index 11f063e6..68068f97 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdOperateRecordController.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/rd/RdOperateRecordController.java @@ -24,14 +24,13 @@ import java.util.List; @RestController @RequestMapping(ApiPrefix.API_V1_RD_PREFIX) public class RdOperateRecordController { - private static final int MAX_RECORD_COUNT = 200; @Autowired private OperateRecordService operateRecordService; @ApiOperation(value = "查询操作记录", notes = "") - @RequestMapping(value = "operate-record", method = RequestMethod.POST) + @PostMapping(value = "operate-record") @ResponseBody public Result> geOperateRecords(@RequestBody OperateRecordDTO dto) { if (ValidateUtils.isNull(dto) || !dto.legal()) { diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/GatewayModelConverter.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/GatewayModelConverter.java index f032e921..6a8b5f79 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/GatewayModelConverter.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/converters/GatewayModelConverter.java @@ -67,6 +67,7 @@ public class GatewayModelConverter { vo.setName(configDO.getName()); vo.setValue(configDO.getValue()); vo.setVersion(configDO.getVersion()); + vo.setDescription(configDO.getDescription()); vo.setCreateTime(configDO.getCreateTime()); vo.setModifyTime(configDO.getModifyTime()); voList.add(vo); @@ -76,18 +77,20 @@ public class GatewayModelConverter { public static GatewayConfigDO convert2GatewayConfigDO(OrderExtensionAddGatewayConfigDTO configDTO) { GatewayConfigDO configDO = new GatewayConfigDO(); - configDO.setType(configDO.getType()); - configDO.setName(configDO.getName()); - configDO.setValue(configDO.getValue()); + configDO.setType(configDTO.getType()); + configDO.setName(configDTO.getName()); + configDO.setValue(configDTO.getValue()); + configDO.setDescription(ValidateUtils.isNull(configDTO.getDescription())? "": configDTO.getDescription()); return configDO; } public static GatewayConfigDO convert2GatewayConfigDO(OrderExtensionModifyGatewayConfigDTO configDTO) { GatewayConfigDO configDO = new GatewayConfigDO(); - configDO.setId(configDO.getId()); - configDO.setType(configDO.getType()); - configDO.setName(configDO.getName()); - configDO.setValue(configDO.getValue()); + configDO.setId(configDTO.getId()); + configDO.setType(configDTO.getType()); + configDO.setName(configDTO.getName()); + configDO.setValue(configDTO.getValue()); + configDO.setDescription(ValidateUtils.isNull(configDTO.getDescription())? "": configDTO.getDescription()); return configDO; } } \ No newline at end of file diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/WebMetricsInterceptor.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/WebMetricsInterceptor.java index bf8bc1e1..576fe036 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/WebMetricsInterceptor.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/WebMetricsInterceptor.java @@ -119,7 +119,7 @@ public class WebMetricsInterceptor { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); String uri = attributes.getRequest().getRequestURI(); if (uri.contains(ApiPrefix.GATEWAY_API_V1_PREFIX)) { - return Result.buildFailure("api limited"); + return Result.buildGatewayFailure("api limited"); } return new Result<>(ResultStatus.OPERATION_FORBIDDEN); } diff --git a/kafka-manager-web/src/main/resources/application.yml b/kafka-manager-web/src/main/resources/application.yml index 5b01d321..6f5438a3 100644 --- a/kafka-manager-web/src/main/resources/application.yml +++ b/kafka-manager-web/src/main/resources/application.yml @@ -31,7 +31,7 @@ logging: custom: idc: cn jmx: - max-conn: 10 + max-conn: 10 # 2.3版本配置不在这个地方生效 store-metrics-task: community: broker-metrics-enabled: true @@ -53,7 +53,7 @@ account: kcm: enabled: false s3: - endpoint: 127.0.0.1 + endpoint: s3.didiyunapi.com access-key: 1234567890 secret-key: 0987654321 bucket: logi-kafka From 25e84b2a6c9af494bd365880540f54d58ebd305e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=91?= Date: Tue, 9 Feb 2021 11:33:54 +0800 Subject: [PATCH 02/55] =?UTF-8?q?=E6=96=B0=E5=8A=9F=E8=83=BD=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9LDAP=E7=9A=84=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/bizenum/AccountRoleEnum.java | 9 ++ .../common/utils/ldap/LDAPAuthentication.java | 112 ++++++++++++++++++ .../component/sso/BaseSessionSignOn.java | 40 +++++++ .../src/main/resources/application.yml | 16 ++- 4 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/AccountRoleEnum.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/AccountRoleEnum.java index 9c3cc06c..55412490 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/AccountRoleEnum.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/AccountRoleEnum.java @@ -47,4 +47,13 @@ public enum AccountRoleEnum { } return AccountRoleEnum.UNKNOWN; } + + public static AccountRoleEnum getUserRoleEnum(String roleName) { + for (AccountRoleEnum elem: AccountRoleEnum.values()) { + if (elem.message.equalsIgnoreCase(roleName)) { + return elem; + } + } + return AccountRoleEnum.UNKNOWN; + } } diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java new file mode 100644 index 00000000..3dbc6c99 --- /dev/null +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java @@ -0,0 +1,112 @@ +package com.xiaojukeji.kafka.manager.common.utils.ldap; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.naming.AuthenticationException; +import javax.naming.Context; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.directory.SearchControls; +import javax.naming.directory.SearchResult; +import javax.naming.ldap.InitialLdapContext; +import javax.naming.ldap.LdapContext; +import java.util.Hashtable; + +@Component +public class LDAPAuthentication { + + @Value(value = "${ldap.url}") + private String ldapUrl; + + @Value(value = "${ldap.basedn}") + private String ldapBasedn; + + @Value(value = "${ldap.factory}") + private String ldapFactory; + + @Value(value = "${ldap.auth-user-registration-role}") + private String authUserRegistrationRole; + + @Value(value = "${ldap.security.authentication}") + private String securityAuthentication; + + @Value(value = "${ldap.security.principal}") + private String securityPrincipal; + + @Value(value = "${ldap.security.credentials}") + private String securityCredentials; + + private LdapContext getConnect() { + Hashtable env = new Hashtable(); + env.put(Context.INITIAL_CONTEXT_FACTORY, ldapFactory); + env.put(Context.PROVIDER_URL, ldapUrl + ldapBasedn); + env.put(Context.SECURITY_AUTHENTICATION, securityAuthentication); + + // 此处若不指定用户名和密码,则自动转换为匿名登录 + env.put(Context.SECURITY_PRINCIPAL, securityPrincipal); + env.put(Context.SECURITY_CREDENTIALS, securityCredentials); + try { + return new InitialLdapContext(env, null); + } catch (AuthenticationException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private String getUserDN(String account) { + String userDN = null; + LdapContext ctx = getConnect(); + try { + SearchControls constraints = new SearchControls(); + constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); + NamingEnumeration en = ctx.search("", "account=" + account, constraints); + if (en == null || !en.hasMoreElements()) { + return null; + } + // maybe more than one element + while (en.hasMoreElements()) { + Object obj = en.nextElement(); + if (obj instanceof SearchResult) { + SearchResult si = (SearchResult) obj; + userDN += si.getName(); + userDN += "," + ldapBasedn; + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return userDN; + } + + /** + * LDAP账密验证 + * @param account + * @param password + * @return + */ + public boolean authenricate(String account, String password) { + LdapContext ctx = getConnect(); + + boolean valide = false; + String userDN = getUserDN(account); + try { + assert ctx != null; + ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN); + ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password); + ctx.reconnect(null); + valide = true; + } catch (AuthenticationException e) { + System.out.println(e.toString()); + } catch (NamingException e) { + e.printStackTrace(); + } + + return valide; + } + +} diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java index 1e2dbb97..ec9324b9 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java @@ -2,12 +2,15 @@ package com.xiaojukeji.kafka.manager.account.component.sso; import com.xiaojukeji.kafka.manager.account.AccountService; import com.xiaojukeji.kafka.manager.account.component.AbstractSingleSignOn; +import com.xiaojukeji.kafka.manager.common.bizenum.AccountRoleEnum; import com.xiaojukeji.kafka.manager.common.constant.LoginConstant; import com.xiaojukeji.kafka.manager.common.entity.dto.normal.LoginDTO; import com.xiaojukeji.kafka.manager.common.entity.pojo.AccountDO; import com.xiaojukeji.kafka.manager.common.utils.EncryptUtil; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; +import com.xiaojukeji.kafka.manager.common.utils.ldap.LDAPAuthentication; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; @@ -22,12 +25,49 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { @Autowired private AccountService accountService; + @Autowired + private LDAPAuthentication ldapAuthentication; + + //是否开启ldap验证 + @Value(value = "${ldap.enabled}") + private boolean ldapEnabled; + + //ldap自动注册的默认角色。请注意:它通常来说都是低权限角色 + @Value(value = "${ldap.auth-user-registration-role}") + private String authUserRegistrationRole; + + //ldap自动注册是否开启 + @Value(value = "${ldap.auth-user-registration}") + private boolean authUserRegistration; + @Override public String loginAndGetLdap(HttpServletRequest request, HttpServletResponse response, LoginDTO dto) { if (ValidateUtils.isBlank(dto.getUsername()) || ValidateUtils.isNull(dto.getPassword())) { return null; } + AccountDO accountDO = accountService.getAccountDO(dto.getUsername()); + + //modifier limin + //判断是否激活了LDAP验证。若激活并且数据库无此用户则自动注册 + if(ldapEnabled){ + //验证账密 + if(!ldapAuthentication.authenricate(dto.getUsername(),dto.getPassword())){ + return null; + } + + if(authUserRegistration){ + //自动注册 + accountDO = new AccountDO(); + accountDO.setUsername(dto.getUsername()); + accountDO.setRole(AccountRoleEnum.getUserRoleEnum(authUserRegistrationRole).getRole()); + accountDO.setPassword(EncryptUtil.md5(dto.getPassword())); + accountService.createAccount(accountDO); + return dto.getUsername(); + } + + } + if (ValidateUtils.isNull(accountDO)) { return null; } diff --git a/kafka-manager-web/src/main/resources/application.yml b/kafka-manager-web/src/main/resources/application.yml index 73773981..7e982756 100644 --- a/kafka-manager-web/src/main/resources/application.yml +++ b/kafka-manager-web/src/main/resources/application.yml @@ -12,8 +12,8 @@ spring: datasource: kafka-manager: jdbc-url: jdbc:mysql://127.0.0.1:3306/logi_kafka_manager?characterEncoding=UTF-8&serverTimezone=GMT%2B8 - username: admin - password: admin + username: root + password: root driver-class-name: com.mysql.jdbc.Driver main: allow-bean-definition-overriding: true @@ -79,3 +79,15 @@ notify: topic-name: didi-kafka-notify order: detail-url: http://127.0.0.1 + +ldap: + enabled: false + url: ldap://127.0.0.1:389/ + basedn: dc=tsign,dc=cn + factory: com.sun.jndi.ldap.LdapCtxFactory + security: + authentication: simple + principal: cn=admin,dc=tsign,dc=cn + credentials: admin + auth-user-registration-role: normal + auth-user-registration: true From 2e2907ea099375dba0b20566d1f027c3721a6129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=91?= Date: Tue, 9 Feb 2021 14:33:53 +0800 Subject: [PATCH 03/55] =?UTF-8?q?=E4=BF=AE=E6=94=B9LDAP=E8=8E=B7=E5=8F=96U?= =?UTF-8?q?serDN=E7=9A=84=E6=97=B6=E5=80=99=E5=8F=AF=E8=83=BD=E5=87=BA?= =?UTF-8?q?=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/common/utils/ldap/LDAPAuthentication.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java index 3dbc6c99..c1694b4c 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java @@ -56,15 +56,14 @@ public class LDAPAuthentication { return null; } - private String getUserDN(String account) { - String userDN = null; - LdapContext ctx = getConnect(); + private String getUserDN(String account,LdapContext ctx) { + String userDN = ""; try { SearchControls constraints = new SearchControls(); constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); NamingEnumeration en = ctx.search("", "account=" + account, constraints); if (en == null || !en.hasMoreElements()) { - return null; + return ""; } // maybe more than one element while (en.hasMoreElements()) { @@ -93,7 +92,7 @@ public class LDAPAuthentication { LdapContext ctx = getConnect(); boolean valide = false; - String userDN = getUserDN(account); + String userDN = getUserDN(account,ctx); try { assert ctx != null; ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN); From e7349161f39cada6238995a9adeda118e139074e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B0=91?= Date: Tue, 9 Feb 2021 15:22:26 +0800 Subject: [PATCH 04/55] =?UTF-8?q?BUG=20FIX:=E4=BF=AE=E6=94=B9LDAP=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=87=8D=E5=A4=8D=E6=B3=A8=E5=86=8C=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/utils/ldap/LDAPAuthentication.java | 13 +++++++++++-- .../account/component/sso/BaseSessionSignOn.java | 4 +++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java index c1694b4c..2419901a 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java @@ -92,9 +92,10 @@ public class LDAPAuthentication { LdapContext ctx = getConnect(); boolean valide = false; - String userDN = getUserDN(account,ctx); + try { - assert ctx != null; + String userDN = getUserDN(account,ctx); + ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN); ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password); ctx.reconnect(null); @@ -103,6 +104,14 @@ public class LDAPAuthentication { System.out.println(e.toString()); } catch (NamingException e) { e.printStackTrace(); + }finally { + if(ctx!=null) { + try { + ctx.close(); + } catch (NamingException e) { + e.printStackTrace(); + } + } } return valide; diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java index ec9324b9..25ca16e1 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java @@ -56,7 +56,7 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { return null; } - if(authUserRegistration){ + if(accountDO==null && authUserRegistration){ //自动注册 accountDO = new AccountDO(); accountDO.setUsername(dto.getUsername()); @@ -66,6 +66,8 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { return dto.getUsername(); } + return dto.getUsername(); + } if (ValidateUtils.isNull(accountDO)) { From 6080f76a9c436d159c614310a983e7e96cbb8774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E8=B6=85?= Date: Tue, 9 Feb 2021 15:26:47 +0800 Subject: [PATCH 05/55] =?UTF-8?q?=E8=BF=AD=E4=BB=A3V2.5,=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Dbroker=E7=9B=91=E6=8E=A7=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0JMX=E8=AE=A4=E8=AF=81=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=AD=89...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/component/antd/index.tsx | 6 +- .../src/component/editor/index.less | 2 +- .../src/component/editor/monacoEditor.tsx | 18 +- .../src/component/x-form/index.tsx | 2 + .../src/constants/strategy.ts | 2 +- .../admin/cluster-detail/cluster-consumer.tsx | 2 +- .../cluster-detail/cluster-controller.tsx | 191 +++++++++++++++++- .../container/admin/cluster-detail/index.less | 6 + .../container/admin/cluster-detail/index.tsx | 14 +- .../container/admin/cluster-list/index.tsx | 20 ++ .../src/container/admin/config.tsx | 86 +++++++- .../container/admin/configure-management.tsx | 38 +++- .../src/container/admin/data-curve/index.tsx | 4 +- .../container/admin/platform-management.tsx | 25 ++- .../src/container/admin/user-management.tsx | 2 +- .../alarm/add-alarm/alarm-select.tsx | 6 +- .../src/container/alarm/alarm-list.tsx | 10 +- .../src/container/cluster/my-cluster.tsx | 2 +- .../src/container/drawer/data-migration.tsx | 4 +- .../src/container/modal/admin/cluster.ts | 1 + .../src/container/modal/admin/task.ts | 12 +- .../src/container/modal/admin/user.ts | 103 +++++++++- .../src/container/modal/admin/version.ts | 77 ++++++- .../src/container/modal/app.tsx | 2 +- .../src/container/modal/expert.tsx | 6 +- .../src/container/modal/order.tsx | 4 +- .../src/container/modal/topic.tsx | 2 +- .../src/container/search-filter.tsx | 2 +- .../topic-detail/connect-information.tsx | 4 +- .../container/topic/topic-detail/group-id.tsx | 26 ++- .../topic/topic-detail/reset-offset.tsx | 34 ++-- kafka-manager-console/src/lib/api.ts | 47 ++++- .../src/lib/line-charts-config.ts | 10 +- .../src/store/admin-monitor.ts | 36 +++- kafka-manager-console/src/store/admin.ts | 146 ++++++++++--- kafka-manager-console/src/store/alarm.ts | 1 + kafka-manager-console/src/store/users.ts | 8 + kafka-manager-console/src/types/base-type.ts | 18 +- 38 files changed, 810 insertions(+), 169 deletions(-) diff --git a/kafka-manager-console/src/component/antd/index.tsx b/kafka-manager-console/src/component/antd/index.tsx index 2d771efe..d0958daf 100644 --- a/kafka-manager-console/src/component/antd/index.tsx +++ b/kafka-manager-console/src/component/antd/index.tsx @@ -94,6 +94,9 @@ import 'antd/es/divider/style'; import Upload from 'antd/es/upload'; import 'antd/es/upload/style'; +import Transfer from 'antd/es/transfer'; +import 'antd/es/transfer/style'; + import TimePicker from 'antd/es/time-picker'; import 'antd/es/time-picker/style'; @@ -142,5 +145,6 @@ export { TimePicker, RangePickerValue, Badge, - Popover + Popover, + Transfer }; diff --git a/kafka-manager-console/src/component/editor/index.less b/kafka-manager-console/src/component/editor/index.less index 4ff05854..36c52cde 100644 --- a/kafka-manager-console/src/component/editor/index.less +++ b/kafka-manager-console/src/component/editor/index.less @@ -25,7 +25,7 @@ .editor{ height: 100%; position: absolute; - left: -14%; + left: -12%; width: 120%; } } diff --git a/kafka-manager-console/src/component/editor/monacoEditor.tsx b/kafka-manager-console/src/component/editor/monacoEditor.tsx index 7a0dd44c..ac0a297a 100644 --- a/kafka-manager-console/src/component/editor/monacoEditor.tsx +++ b/kafka-manager-console/src/component/editor/monacoEditor.tsx @@ -21,24 +21,12 @@ class Monacoeditor extends React.Component { public state = { placeholder: '', }; - // public arr = '{"clusterId":95,"startId":37397856,"step":100,"topicName":"kmo_topic_metrics_tempory_zq"}'; - // public Ars(a: string) { - // const obj = JSON.parse(a); - // const newobj: any = {}; - // for (const item in obj) { - // if (typeof obj[item] === 'object') { - // this.Ars(obj[item]); - // } else { - // newobj[item] = obj[item]; - // } - // } - // return JSON.stringify(newobj); - // } + public async componentDidMount() { const { value, onChange } = this.props; const format: any = await format2json(value); this.editor = monaco.editor.create(this.ref, { - value: format.result, + value: format.result || value, language: 'json', lineNumbers: 'off', scrollBeyondLastLine: false, @@ -48,7 +36,7 @@ class Monacoeditor extends React.Component { minimap: { enabled: false, }, - // automaticLayout: true, // 自动布局 + automaticLayout: true, // 自动布局 glyphMargin: true, // 字形边缘 {},[] // useTabStops: false, // formatOnPaste: true, diff --git a/kafka-manager-console/src/component/x-form/index.tsx b/kafka-manager-console/src/component/x-form/index.tsx index 9530f2bb..dc435d0f 100755 --- a/kafka-manager-console/src/component/x-form/index.tsx +++ b/kafka-manager-console/src/component/x-form/index.tsx @@ -130,6 +130,8 @@ class XForm extends React.Component { this.renderFormItem(formItem), )} {formItem.renderExtraElement ? formItem.renderExtraElement() : null} + {/* 添加保存时间提示文案 */} + {formItem.attrs?.prompttype ? {formItem.attrs.prompttype} : null} ); })} diff --git a/kafka-manager-console/src/constants/strategy.ts b/kafka-manager-console/src/constants/strategy.ts index c0d19001..e92563e6 100644 --- a/kafka-manager-console/src/constants/strategy.ts +++ b/kafka-manager-console/src/constants/strategy.ts @@ -67,7 +67,7 @@ export const timeMonthStr = 'YYYY/MM'; // tslint:disable-next-line:max-line-length export const indexUrl ={ - indexUrl:'https://github.com/didi/kafka-manager', + indexUrl:'https://github.com/didi/Logi-KafkaManager/blob/master/docs/user_guide/kafka_metrics_desc.md', // 指标说明 cagUrl:'https://github.com/didi/Logi-KafkaManager/blob/master/docs/user_guide/add_cluster/add_cluster.md', // 集群接入指南 Cluster access Guide } diff --git a/kafka-manager-console/src/container/admin/cluster-detail/cluster-consumer.tsx b/kafka-manager-console/src/container/admin/cluster-detail/cluster-consumer.tsx index 5605a372..911f44d2 100644 --- a/kafka-manager-console/src/container/admin/cluster-detail/cluster-consumer.tsx +++ b/kafka-manager-console/src/container/admin/cluster-detail/cluster-consumer.tsx @@ -100,7 +100,7 @@ export class ClusterConsumer extends SearchAndFilterContainer {
  • {this.props.tab}
  • - {this.renderSearch()} + {this.renderSearch('', '请输入消费组名称')}
(origin: T[]) { + let data: T[] = origin; + let { searchCandidateKey } = this.state; + searchCandidateKey = (searchCandidateKey + '').trim().toLowerCase(); + + data = searchCandidateKey ? origin.filter((item: IController) => + (item.host !== undefined && item.host !== null) && item.host.toLowerCase().includes(searchCandidateKey as string), + ) : origin; + return data; + } + + // 候选controller + public renderCandidateController() { + const columns = [ + { + title: 'BrokerId', + dataIndex: 'brokerId', + key: 'brokerId', + width: '20%', + sorter: (a: IController, b: IController) => b.brokerId - a.brokerId, + render: (r: string, t: IController) => { + return ( + {r} + + ); + }, + }, + { + title: 'BrokerHost', + key: 'host', + dataIndex: 'host', + width: '20%', + // render: (r: string, t: IController) => { + // return ( + // {r} + // + // ); + // }, + }, + { + title: 'Broker状态', + key: 'status', + dataIndex: 'status', + width: '20%', + render: (r: number, t: IController) => { + return ( + {r === 1 ? '不在线' : '在线'} + ); + }, + }, + { + title: '创建时间', + dataIndex: 'startTime', + key: 'startTime', + width: '25%', + sorter: (a: IController, b: IController) => b.timestamp - a.timestamp, + render: (t: number) => moment(t).format(timeFormat), + }, + { + title: '操作', + dataIndex: 'operation', + key: 'operation', + width: '15%', + render: (r: string, t: IController) => { + return ( + this.deleteCandidateCancel(t)} + cancelText="取消" + okText="确认" + > + 删除 + + ); + }, + }, + ]; + + return ( +
+ ); + } + public renderController() { const columns = [ @@ -58,12 +151,6 @@ export class ClusterController extends SearchAndFilterContainer { key: 'host', dataIndex: 'host', width: '30%', - // render: (r: string, t: IController) => { - // return ( - // {r} - // - // ); - // }, }, { title: '变更时间', @@ -87,16 +174,104 @@ export class ClusterController extends SearchAndFilterContainer { public componentDidMount() { admin.getControllerHistory(this.clusterId); + admin.getCandidateController(this.clusterId); + admin.getBrokersMetadata(this.clusterId); + } + + public addController = () => { + this.setState({ isCandidateModel: true, targetKeys: [] }) + } + + public addCandidateChange = (targetKeys: any) => { + this.setState({ targetKeys }) + } + + + + public handleCandidateCancel = () => { + this.setState({ isCandidateModel: false }); + } + + public handleCandidateOk = () => { + let brokerIdList = this.state.targetKeys.map((item: any) => { + return admin.brokersMetadata[item].brokerId + }) + admin.addCandidateController(this.clusterId, brokerIdList).then(data => { + notification.success({ message: '新增成功' }); + admin.getCandidateController(this.clusterId); + }).catch(err => { + notification.error({ message: '新增失败' }); + }) + this.setState({ isCandidateModel: false, targetKeys: [] }); + } + + public deleteCandidateCancel = (target: any) => { + admin.deleteCandidateCancel(this.clusterId, [target.brokerId]).then(() => { + notification.success({ message: '删除成功' }); + }); + this.setState({ isCandidateModel: false }); + } + + public renderAddCandidateController() { + let filterControllerCandidate = admin.brokersMetadata.filter((item: any) => { + return !admin.filtercontrollerCandidate.includes(item.brokerId) + }) + + return ( + this.handleCandidateOk()} + onCancel={() => this.handleCandidateCancel()} + footer={<> + + + + } + > + item.host} + onChange={(targetKeys) => this.addCandidateChange(targetKeys)} + titles={['未选', '已选']} + locale={{ + itemUnit: '项', + itemsUnit: '项', + }} + listStyle={{ + width: "45%", + }} + /> + + ); } public render() { return (
    +
  • + 候选Controller + Controller将会优先从以下Broker中选举 +
  • +
    +
    + +
    + {this.renderSearch('', '请查找Host', 'searchCandidateKey')} +
    +
+ {this.renderCandidateController()} +
  • {this.props.tab}
  • {this.renderSearch('', '请输入Host')}
{this.renderController()} + {this.renderAddCandidateController()}
); } diff --git a/kafka-manager-console/src/container/admin/cluster-detail/index.less b/kafka-manager-console/src/container/admin/cluster-detail/index.less index 65c45b9c..0dd4d106 100644 --- a/kafka-manager-console/src/container/admin/cluster-detail/index.less +++ b/kafka-manager-console/src/container/admin/cluster-detail/index.less @@ -94,4 +94,10 @@ .region-prompt{ font-weight: bold; text-align: center; +} + +.asd{ + display: flex; + justify-content: space-around; + align-items: center; } \ No newline at end of file diff --git a/kafka-manager-console/src/container/admin/cluster-detail/index.tsx b/kafka-manager-console/src/container/admin/cluster-detail/index.tsx index 5882dd57..027dde27 100644 --- a/kafka-manager-console/src/container/admin/cluster-detail/index.tsx +++ b/kafka-manager-console/src/container/admin/cluster-detail/index.tsx @@ -32,9 +32,9 @@ export class ClusterDetail extends React.Component { } public render() { - let content = {} as IMetaData; - content = admin.basicInfo ? admin.basicInfo : content; - return ( + let content = {} as IMetaData; + content = admin.basicInfo ? admin.basicInfo : content; + return ( <> - + @@ -60,11 +60,11 @@ export class ClusterDetail extends React.Component { - + - - + + diff --git a/kafka-manager-console/src/container/admin/cluster-list/index.tsx b/kafka-manager-console/src/container/admin/cluster-list/index.tsx index 63ccd93e..dfac45d7 100644 --- a/kafka-manager-console/src/container/admin/cluster-list/index.tsx +++ b/kafka-manager-console/src/container/admin/cluster-list/index.tsx @@ -12,6 +12,7 @@ import { urlPrefix } from 'constants/left-menu'; import { indexUrl } from 'constants/strategy' import { region } from 'store'; import './index.less'; +import Monacoeditor from 'component/editor/monacoEditor'; import { getAdminClusterColumns } from '../config'; const { confirm } = Modal; @@ -132,6 +133,25 @@ export class ClusterList extends SearchAndFilterContainer { "security.protocol": "SASL_PLAINTEXT", "sasl.mechanism": "PLAIN", "sasl.jaas.config": "org.apache.kafka.common.security.plain.PlainLoginModule required username=\\"xxxxxx\\" password=\\"xxxxxx\\";" +}`, + rows: 8, + }, + }, + { + key: 'jmxProperties', + label: 'JMX认证', + type: 'text_area', + rules: [{ + required: false, + message: '请输入JMX认证', + }], + attrs: { + placeholder: `请输入JMX认证,例如: +{ +"maxConn": 10, #KM对单台Broker对最大连接数 +"username": "xxxxx", #用户名 +"password": "xxxxx", #密码 +"openSSL": true, #开启SSL,true表示开启SSL,false表示关闭 }`, rows: 8, }, diff --git a/kafka-manager-console/src/container/admin/config.tsx b/kafka-manager-console/src/container/admin/config.tsx index bce02cce..09a70f83 100644 --- a/kafka-manager-console/src/container/admin/config.tsx +++ b/kafka-manager-console/src/container/admin/config.tsx @@ -1,8 +1,8 @@ import * as React from 'react'; -import { IUser, IUploadFile, IConfigure, IMetaData, IBrokersPartitions } from 'types/base-type'; +import { IUser, IUploadFile, IConfigure, IConfigGateway, IMetaData } from 'types/base-type'; import { users } from 'store/users'; import { version } from 'store/version'; -import { showApplyModal, showModifyModal, showConfigureModal } from 'container/modal/admin'; +import { showApplyModal, showApplyModalModifyPassword, showModifyModal, showConfigureModal, showConfigGatewayModal } from 'container/modal/admin'; import { Popconfirm, Tooltip } from 'component/antd'; import { admin } from 'store/admin'; import { cellStyle } from 'constants/table'; @@ -27,6 +27,7 @@ export const getUserColumns = () => { return ( showApplyModal(record)}>编辑 + showApplyModalModifyPassword(record)}>修改密码 users.deleteUser(record.username)} @@ -184,6 +185,87 @@ export const getConfigureColumns = () => { return columns; }; +// 网关配置 +export const getConfigColumns = () => { + const columns = [ + { + title: '配置类型', + dataIndex: 'type', + key: 'type', + width: '25%', + ellipsis: true, + sorter: (a: IConfigGateway, b: IConfigGateway) => a.type.charCodeAt(0) - b.type.charCodeAt(0), + }, + { + title: '配置键', + dataIndex: 'name', + key: 'name', + width: '15%', + ellipsis: true, + sorter: (a: IConfigGateway, b: IConfigGateway) => a.name.charCodeAt(0) - b.name.charCodeAt(0), + }, + { + title: '配置值', + dataIndex: 'value', + key: 'value', + width: '20%', + ellipsis: true, + sorter: (a: IConfigGateway, b: IConfigGateway) => a.value.charCodeAt(0) - b.value.charCodeAt(0), + render: (t: string) => { + return t.substr(0, 1) === '{' && t.substr(0, -1) === '}' ? JSON.stringify(JSON.parse(t), null, 4) : t; + }, + }, + { + title: '修改时间', + dataIndex: 'modifyTime', + key: 'modifyTime', + width: '15%', + sorter: (a: IConfigGateway, b: IConfigGateway) => b.modifyTime - a.modifyTime, + render: (t: number) => moment(t).format(timeFormat), + }, + { + title: '版本号', + dataIndex: 'version', + key: 'version', + width: '10%', + ellipsis: true, + sorter: (a: IConfigGateway, b: IConfigGateway) => b.version.charCodeAt(0) - a.version.charCodeAt(0), + }, + { + title: '描述信息', + dataIndex: 'description', + key: 'description', + width: '20%', + ellipsis: true, + onCell: () => ({ + style: { + maxWidth: 180, + ...cellStyle, + }, + }), + }, + { + title: '操作', + width: '10%', + render: (text: string, record: IConfigGateway) => { + return ( + + showConfigGatewayModal(record)}>编辑 + admin.deleteConfigGateway({ id: record.id })} + cancelText="取消" + okText="确认" + > + 删除 + + ); + }, + }, + ]; + return columns; +}; + const renderClusterHref = (value: number | string, item: IMetaData, key: number) => { return ( // 0 暂停监控--不可点击 1 监控中---可正常点击 <> diff --git a/kafka-manager-console/src/container/admin/configure-management.tsx b/kafka-manager-console/src/container/admin/configure-management.tsx index 680d1da7..5c3494b9 100644 --- a/kafka-manager-console/src/container/admin/configure-management.tsx +++ b/kafka-manager-console/src/container/admin/configure-management.tsx @@ -3,11 +3,11 @@ import { SearchAndFilterContainer } from 'container/search-filter'; import { Table, Button, Spin } from 'component/antd'; import { admin } from 'store/admin'; import { observer } from 'mobx-react'; -import { IConfigure } from 'types/base-type'; +import { IConfigure, IConfigGateway } from 'types/base-type'; import { users } from 'store/users'; import { pagination } from 'constants/table'; -import { getConfigureColumns } from './config'; -import { showConfigureModal } from 'container/modal/admin'; +import { getConfigureColumns, getConfigColumns } from './config'; +import { showConfigureModal, showConfigGatewayModal } from 'container/modal/admin'; @observer export class ConfigureManagement extends SearchAndFilterContainer { @@ -17,7 +17,12 @@ export class ConfigureManagement extends SearchAndFilterContainer { }; public componentDidMount() { - admin.getConfigure(); + if (this.props.isShow) { + admin.getGatewayList(); + admin.getGatewayType(); + } else { + admin.getConfigure(); + } } public getData(origin: T[]) { @@ -34,15 +39,34 @@ export class ConfigureManagement extends SearchAndFilterContainer { return data; } + public getGatewayData(origin: T[]) { + let data: T[] = origin; + let { searchKey } = this.state; + searchKey = (searchKey + '').trim().toLowerCase(); + + data = searchKey ? origin.filter((item: IConfigGateway) => + ((item.name !== undefined && item.name !== null) && item.name.toLowerCase().includes(searchKey as string)) + || ((item.value !== undefined && item.value !== null) && item.value.toLowerCase().includes(searchKey as string)) + || ((item.description !== undefined && item.description !== null) && + item.description.toLowerCase().includes(searchKey as string)), + ) : origin; + return data; + } + public renderTable() { return ( -
:
+ />} ); @@ -53,7 +77,7 @@ export class ConfigureManagement extends SearchAndFilterContainer {
    {this.renderSearch('', '请输入配置键、值或描述')}
  • - +
); diff --git a/kafka-manager-console/src/container/admin/data-curve/index.tsx b/kafka-manager-console/src/container/admin/data-curve/index.tsx index bd113aeb..b822957c 100644 --- a/kafka-manager-console/src/container/admin/data-curve/index.tsx +++ b/kafka-manager-console/src/container/admin/data-curve/index.tsx @@ -6,6 +6,7 @@ import { curveKeys, CURVE_KEY_MAP, PERIOD_RADIO_MAP, PERIOD_RADIO } from './conf import moment = require('moment'); import { observer } from 'mobx-react'; import { timeStampStr } from 'constants/strategy'; +import { adminMonitor } from 'store/admin-monitor'; @observer export class DataCurveFilter extends React.Component { @@ -21,6 +22,7 @@ export class DataCurveFilter extends React.Component { } public refreshAll = () => { + adminMonitor.setRequestId(null); Object.keys(curveKeys).forEach((c: curveKeys) => { const { typeInfo, curveInfo: option } = CURVE_KEY_MAP.get(c); const { parser } = typeInfo; @@ -32,7 +34,7 @@ export class DataCurveFilter extends React.Component { return ( <> - {PERIOD_RADIO.map(p => {p.label})} + {PERIOD_RADIO.map(p => {p.label})} - - - - - - - - - - - + + + + + + + + + + + + + + ); } diff --git a/kafka-manager-console/src/container/admin/user-management.tsx b/kafka-manager-console/src/container/admin/user-management.tsx index 757ceabb..1dc38e06 100644 --- a/kafka-manager-console/src/container/admin/user-management.tsx +++ b/kafka-manager-console/src/container/admin/user-management.tsx @@ -29,7 +29,7 @@ export class UserManagement extends SearchAndFilterContainer { searchKey = (searchKey + '').trim().toLowerCase(); data = searchKey ? origin.filter((item: IUser) => - (item.username !== undefined && item.username !== null) && item.username.toLowerCase().includes(searchKey as string)) : origin ; + (item.username !== undefined && item.username !== null) && item.username.toLowerCase().includes(searchKey as string)) : origin; return data; } diff --git a/kafka-manager-console/src/container/alarm/add-alarm/alarm-select.tsx b/kafka-manager-console/src/container/alarm/add-alarm/alarm-select.tsx index 6d19ec26..5cd1f4f0 100644 --- a/kafka-manager-console/src/container/alarm/add-alarm/alarm-select.tsx +++ b/kafka-manager-console/src/container/alarm/add-alarm/alarm-select.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { alarm } from 'store/alarm'; import { IMonitorGroups } from 'types/base-type'; -import { getValueFromLocalStorage, setValueToLocalStorage } from 'lib/local-storage'; +import { getValueFromLocalStorage, setValueToLocalStorage, deleteValueFromLocalStorage } from 'lib/local-storage'; import { VirtualScrollSelect } from '../../../component/virtual-scroll-select'; interface IAlarmSelectProps { @@ -36,6 +36,10 @@ export class AlarmSelect extends React.Component { onChange && onChange(params); } + public componentWillUnmount() { + deleteValueFromLocalStorage('monitorGroups'); + } + public render() { const { value, isDisabled } = this.props; return ( diff --git a/kafka-manager-console/src/container/alarm/alarm-list.tsx b/kafka-manager-console/src/container/alarm/alarm-list.tsx index 6dd6680b..54d266f1 100644 --- a/kafka-manager-console/src/container/alarm/alarm-list.tsx +++ b/kafka-manager-console/src/container/alarm/alarm-list.tsx @@ -9,6 +9,7 @@ import { pagination } from 'constants/table'; import { urlPrefix } from 'constants/left-menu'; import { alarm } from 'store/alarm'; import 'styles/table-filter.less'; +import { Link } from 'react-router-dom'; @observer export class AlarmList extends SearchAndFilterContainer { @@ -24,7 +25,7 @@ export class AlarmList extends SearchAndFilterContainer { if (app.active !== '-1' || searchKey !== '') { data = origin.filter(d => ((d.name !== undefined && d.name !== null) && d.name.toLowerCase().includes(searchKey as string) - || ((d.operator !== undefined && d.operator !== null) && d.operator.toLowerCase().includes(searchKey as string))) + || ((d.operator !== undefined && d.operator !== null) && d.operator.toLowerCase().includes(searchKey as string))) && (app.active === '-1' || d.appId === (app.active + '')), ); } else { @@ -55,9 +56,7 @@ export class AlarmList extends SearchAndFilterContainer { {this.renderSearch('名称:', '请输入告警规则或者操作人')}
  • @@ -68,6 +67,9 @@ export class AlarmList extends SearchAndFilterContainer { if (!alarm.monitorStrategies.length) { alarm.getMonitorStrategies(); } + if (!app.data.length) { + app.getAppList(); + } } public render() { diff --git a/kafka-manager-console/src/container/cluster/my-cluster.tsx b/kafka-manager-console/src/container/cluster/my-cluster.tsx index 3c54763a..e017b0dd 100644 --- a/kafka-manager-console/src/container/cluster/my-cluster.tsx +++ b/kafka-manager-console/src/container/cluster/my-cluster.tsx @@ -91,7 +91,7 @@ export class MyCluster extends SearchAndFilterContainer { ], formData: {}, visible: true, - title: '申请集群', + title:
    申请集群资源申请文档
    , okText: '确认', onSubmit: (value: any) => { value.idc = region.currentRegion; diff --git a/kafka-manager-console/src/container/drawer/data-migration.tsx b/kafka-manager-console/src/container/drawer/data-migration.tsx index 28353004..4da64f5c 100644 --- a/kafka-manager-console/src/container/drawer/data-migration.tsx +++ b/kafka-manager-console/src/container/drawer/data-migration.tsx @@ -117,12 +117,12 @@ class DataMigrationFormTable extends React.Component { key: 'maxThrottle', editable: true, }, { - title: '迁移保存时间(h)', + title: '迁移后Topic保存时间(h)', dataIndex: 'reassignRetentionTime', key: 'reassignRetentionTime', editable: true, }, { - title: '原本保存时间(h)', + title: '原Topic保存时间(h)', dataIndex: 'retentionTime', key: 'retentionTime', // originalRetentionTime width: '132px', diff --git a/kafka-manager-console/src/container/modal/admin/cluster.ts b/kafka-manager-console/src/container/modal/admin/cluster.ts index cea987f6..20ed9098 100644 --- a/kafka-manager-console/src/container/modal/admin/cluster.ts +++ b/kafka-manager-console/src/container/modal/admin/cluster.ts @@ -61,6 +61,7 @@ export const showEditClusterTopic = (item: IClusterTopics) => { attrs: { placeholder: '请输入保存时间', suffix: '小时', + prompttype:'修改保存时间,预计一分钟左右生效!' }, }, { diff --git a/kafka-manager-console/src/container/modal/admin/task.ts b/kafka-manager-console/src/container/modal/admin/task.ts index be240f7a..d9a609ac 100644 --- a/kafka-manager-console/src/container/modal/admin/task.ts +++ b/kafka-manager-console/src/container/modal/admin/task.ts @@ -158,26 +158,26 @@ export const createMigrationTasks = () => { }, { key: 'originalRetentionTime', - label: '原本保存时间', + label: '原Topic保存时间', rules: [{ required: true, - message: '请输入原本保存时间', + message: '请输入原Topic保存时间', }], attrs: { disabled: true, - placeholder: '请输入原本保存时间', + placeholder: '请输入原Topic保存时间', suffix: '小时', }, }, { key: 'reassignRetentionTime', - label: '迁移保存时间', + label: '迁移后Topic保存时间', rules: [{ required: true, - message: '请输入迁移保存时间', + message: '请输入迁移后Topic保存时间', }], attrs: { - placeholder: '请输入迁移保存时间', + placeholder: '请输入迁移后Topic保存时间', suffix: '小时', }, }, diff --git a/kafka-manager-console/src/container/modal/admin/user.ts b/kafka-manager-console/src/container/modal/admin/user.ts index 9f35e4cf..51ca360d 100644 --- a/kafka-manager-console/src/container/modal/admin/user.ts +++ b/kafka-manager-console/src/container/modal/admin/user.ts @@ -24,26 +24,111 @@ export const showApplyModal = (record?: IUser) => { value: +item, })), rules: [{ required: true, message: '请选择角色' }], - }, { - key: 'password', - label: '密码', - type: FormItemType.inputPassword, - rules: [{ required: !record, message: '请输入密码' }], - }, + }, + // { + // key: 'password', + // label: '密码', + // type: FormItemType.inputPassword, + // rules: [{ required: !record, message: '请输入密码' }], + // }, ], formData: record || {}, visible: true, title: record ? '修改用户' : '新增用户', onSubmit: (value: IUser) => { if (record) { - return users.modfiyUser(value).then(() => { - message.success('操作成功'); - }); + return users.modfiyUser(value) } return users.addUser(value).then(() => { message.success('操作成功'); }); }, }; + if(!record){ + let formMap: any = xFormModal.formMap + formMap.splice(2, 0,{ + key: 'password', + label: '密码', + type: FormItemType.inputPassword, + rules: [{ required: !record, message: '请输入密码' }], + },) + } wrapper.open(xFormModal); }; + +// const handleCfPassword = (rule:any, value:any, callback:any)=>{ +// if() +// } +export const showApplyModalModifyPassword = (record: IUser) => { + const xFormModal:any = { + formMap: [ + // { + // key: 'oldPassword', + // label: '旧密码', + // type: FormItemType.inputPassword, + // rules: [{ + // required: true, + // message: '请输入旧密码', + // }] + // }, + { + key: 'newPassword', + label: '新密码', + type: FormItemType.inputPassword, + rules: [ + { + required: true, + message: '请输入新密码', + } + ], + attrs:{ + onChange:(e:any)=>{ + users.setNewPassWord(e.target.value) + } + } + }, + { + key: 'confirmPassword', + label: '确认密码', + type: FormItemType.inputPassword, + rules: [ + { + required: true, + message: '请确认密码', + validator:(rule:any, value:any, callback:any) => { + // 验证新密码的一致性 + if(users.newPassWord){ + if(value!==users.newPassWord){ + rule.message = "两次密码输入不一致"; + callback('两次密码输入不一致') + }else{ + callback() + } + }else if(!value){ + rule.message = "请确认密码"; + callback('请确认密码'); + }else{ + callback() + } + }, + } + ], + }, + ], + formData: record || {}, + visible: true, + title: '修改密码', + onSubmit: (value: IUser) => { + let params:any = { + username:record?.username, + password:value.confirmPassword, + role:record?.role, + } + return users.modfiyUser(params).then(() => { + message.success('操作成功'); + }); + }, + } + wrapper.open(xFormModal); +}; + diff --git a/kafka-manager-console/src/container/modal/admin/version.ts b/kafka-manager-console/src/container/modal/admin/version.ts index ea642a8f..c863eba1 100644 --- a/kafka-manager-console/src/container/modal/admin/version.ts +++ b/kafka-manager-console/src/container/modal/admin/version.ts @@ -1,6 +1,6 @@ import * as React from 'react'; -import { notification } from 'component/antd'; -import { IUploadFile, IConfigure } from 'types/base-type'; +import { notification, Select } from 'component/antd'; +import { IUploadFile, IConfigure, IConfigGateway } from 'types/base-type'; import { version } from 'store/version'; import { admin } from 'store/admin'; import { wrapper } from 'store'; @@ -97,8 +97,8 @@ const updateFormModal = (type: number) => { formMap[2].attrs = { accept: version.fileSuffix, }, - // tslint:disable-next-line:no-unused-expression - wrapper.ref && wrapper.ref.updateFormMap$(formMap, wrapper.xFormWrapper.formData, true); + // tslint:disable-next-line:no-unused-expression + wrapper.ref && wrapper.ref.updateFormMap$(formMap, wrapper.xFormWrapper.formData, true); } }; @@ -157,8 +157,8 @@ export const showModifyModal = (record: IUploadFile) => { export const showConfigureModal = async (record?: IConfigure) => { if (record) { - const result:any = await format2json(record.configValue); - record.configValue = result.result; + const result: any = await format2json(record.configValue); + record.configValue = result.result || record.configValue; } const xFormModal = { formMap: [ @@ -193,10 +193,69 @@ export const showConfigureModal = async (record?: IConfigure) => { return admin.editConfigure(value).then(data => { notification.success({ message: '编辑配置成功' }); }); + } else { + return admin.addNewConfigure(value).then(data => { + notification.success({ message: '新建配置成功' }); + }); + } + }, + }; + wrapper.open(xFormModal); +}; + +export const showConfigGatewayModal = async (record?: IConfigGateway) => { + const xFormModal = { + formMap: [ + { + key: 'type', + label: '配置类型', + rules: [{ required: true, message: '请选择配置类型' }], + type: "select", + options: admin.gatewayType.map((item: any, index: number) => ({ + key: index, + label: item.configName, + value: item.configType, + })), + attrs: { + disabled: record ? true : false, + } + }, { + key: 'name', + label: '配置键', + rules: [{ required: true, message: '请输入配置键' }], + attrs: { + disabled: record ? true : false, + }, + }, { + key: 'value', + label: '配置值', + type: 'text_area', + rules: [{ + required: true, + message: '请输入配置值', + }], + }, { + key: 'description', + label: '描述', + type: 'text_area', + rules: [{ required: true, message: '请输入备注' }], + }, + ], + formData: record || {}, + visible: true, + isWaitting: true, + title: `${record ? '编辑配置' : '新建配置'}`, + onSubmit: async (parmas: IConfigGateway) => { + if (record) { + parmas.id = record.id; + return admin.editConfigGateway(parmas).then(data => { + notification.success({ message: '编辑配置成功' }); + }); + } else { + return admin.addNewConfigGateway(parmas).then(data => { + notification.success({ message: '新建配置成功' }); + }); } - return admin.addNewConfigure(value).then(data => { - notification.success({ message: '新建配置成功' }); - }); }, }; wrapper.open(xFormModal); diff --git a/kafka-manager-console/src/container/modal/app.tsx b/kafka-manager-console/src/container/modal/app.tsx index bda37418..bb0320ec 100644 --- a/kafka-manager-console/src/container/modal/app.tsx +++ b/kafka-manager-console/src/container/modal/app.tsx @@ -85,7 +85,7 @@ export const showEditModal = (record?: IAppItem, from?: string, isDisabled?: boo ], formData: record, visible: true, - title: isDisabled ? '详情' : record ? '编辑' :
    应用申请应用申请文档
    , + title: isDisabled ? '详情' : record ? '编辑' :
    应用申请资源申请文档
    , // customRenderElement: isDisabled ? '' : record ? '' : 集群资源充足时,预计1分钟自动审批通过, isWaitting: true, onSubmit: (value: IAppItem) => { diff --git a/kafka-manager-console/src/container/modal/expert.tsx b/kafka-manager-console/src/container/modal/expert.tsx index 96a1f312..2ff5e5f2 100644 --- a/kafka-manager-console/src/container/modal/expert.tsx +++ b/kafka-manager-console/src/container/modal/expert.tsx @@ -20,14 +20,14 @@ export interface IRenderData { } export const migrationModal = (renderData: IRenderData[]) => { - const xFormWrapper = { + const xFormWrapper = { type: 'drawer', visible: true, width: 1000, title: '新建迁移任务', - customRenderElement: , + customRenderElement: , nofooter: true, noform: true, }; - wrapper.open(xFormWrapper as IXFormWrapper); + wrapper.open(xFormWrapper as IXFormWrapper); }; diff --git a/kafka-manager-console/src/container/modal/order.tsx b/kafka-manager-console/src/container/modal/order.tsx index 2930e3df..c982db4c 100644 --- a/kafka-manager-console/src/container/modal/order.tsx +++ b/kafka-manager-console/src/container/modal/order.tsx @@ -75,8 +75,8 @@ export const showApprovalModal = (info: IOrderInfo, status: number, from?: strin // }], rules: [{ required: true, - message: '请输入大于12小于999的整数', - pattern: /^([1-9]{1}[0-9]{2})$|^([2-9]{1}[0-9]{1})$|^(1[2-9]{1})$/, + message: '请输入大于0小于10000的整数', + pattern: /^\+?[1-9]\d{0,3}(\.\d*)?$/, }], }, { key: 'species', diff --git a/kafka-manager-console/src/container/modal/topic.tsx b/kafka-manager-console/src/container/modal/topic.tsx index 7053a497..d4df0318 100644 --- a/kafka-manager-console/src/container/modal/topic.tsx +++ b/kafka-manager-console/src/container/modal/topic.tsx @@ -88,7 +88,7 @@ export const applyTopic = () => { ], formData: {}, visible: true, - title: '申请Topic', + title: , okText: '确认', // customRenderElement: 集群资源充足时,预计1分钟自动审批通过, isWaitting: true, diff --git a/kafka-manager-console/src/container/search-filter.tsx b/kafka-manager-console/src/container/search-filter.tsx index 12603d40..ac5d6bc1 100644 --- a/kafka-manager-console/src/container/search-filter.tsx +++ b/kafka-manager-console/src/container/search-filter.tsx @@ -126,7 +126,7 @@ export class SearchAndFilterContainer extends React.Component diff --git a/kafka-manager-console/src/container/topic/topic-detail/connect-information.tsx b/kafka-manager-console/src/container/topic/topic-detail/connect-information.tsx index f323310c..1e5ab182 100644 --- a/kafka-manager-console/src/container/topic/topic-detail/connect-information.tsx +++ b/kafka-manager-console/src/container/topic/topic-detail/connect-information.tsx @@ -101,7 +101,9 @@ export class ConnectInformation extends SearchAndFilterContainer { <>
      -
    • 连接信息
    • +
    • + 连接信息 展示近20分钟的连接信息 +
    • {this.renderSearch('', '请输入连接信息', 'searchKey')}
    {this.renderConnectionInfo(this.getData(topic.connectionInfo))} diff --git a/kafka-manager-console/src/container/topic/topic-detail/group-id.tsx b/kafka-manager-console/src/container/topic/topic-detail/group-id.tsx index 20b7642f..b173ac41 100644 --- a/kafka-manager-console/src/container/topic/topic-detail/group-id.tsx +++ b/kafka-manager-console/src/container/topic/topic-detail/group-id.tsx @@ -138,7 +138,7 @@ export class GroupID extends SearchAndFilterContainer { public renderConsumerDetails() { const consumerGroup = this.consumerGroup; - const columns = [{ + const columns: any = [{ title: 'Partition ID', dataIndex: 'partitionId', key: 'partitionId', @@ -179,7 +179,8 @@ export class GroupID extends SearchAndFilterContainer { <>
    {consumerGroup} -
    +
    + {this.renderSearch('', '请输入Consumer ID')} @@ -187,7 +188,7 @@ export class GroupID extends SearchAndFilterContainer {
    @@ -214,7 +215,12 @@ export class GroupID extends SearchAndFilterContainer { dataIndex: 'location', key: 'location', width: '34%', - }, + }, { + title: '状态', + dataIndex: 'state', + key: 'state', + width: '34%', + } ]; return ( <> @@ -236,7 +242,17 @@ export class GroupID extends SearchAndFilterContainer { data = searchKey ? origin.filter((item: IConsumerGroups) => (item.consumerGroup !== undefined && item.consumerGroup !== null) && item.consumerGroup.toLowerCase().includes(searchKey as string), - ) : origin ; + ) : origin; + return data; + } + + public getDetailData(origin: T[]) { + let data: T[] = origin; + let { searchKey } = this.state; + searchKey = (searchKey + '').trim().toLowerCase(); + data = searchKey ? origin.filter((item: IConsumeDetails) => + (item.clientId !== undefined && item.clientId !== null) && item.clientId.toLowerCase().includes(searchKey as string), + ) : origin; return data; } diff --git a/kafka-manager-console/src/container/topic/topic-detail/reset-offset.tsx b/kafka-manager-console/src/container/topic/topic-detail/reset-offset.tsx index be0767e8..531f69c6 100644 --- a/kafka-manager-console/src/container/topic/topic-detail/reset-offset.tsx +++ b/kafka-manager-console/src/container/topic/topic-detail/reset-offset.tsx @@ -71,32 +71,32 @@ class ResetOffset extends React.Component { const { getFieldDecorator } = this.props.form; const { typeValue, offsetValue } = this.state; return ( - <> - - - + <> + + + {/* */}
    - + 重置到指定时间
    - - 最新offset - 自定义 - + + 最新offset + 自定义 + {typeValue === 'time' && offsetValue === 'custom' && getFieldDecorator('timestamp', { rules: [{ required: false, message: '' }], initialValue: moment(), - })( + })( { 重置指定分区及偏移 - + diff --git a/kafka-manager-console/src/lib/api.ts b/kafka-manager-console/src/lib/api.ts index f53f6852..8716d4ea 100644 --- a/kafka-manager-console/src/lib/api.ts +++ b/kafka-manager-console/src/lib/api.ts @@ -1,5 +1,5 @@ import fetch, { formFetch } from './fetch'; -import { IUploadFile, IUser, IQuotaModelItem, ILimitsItem, ITopic, IOrderParams, ISample, IMigration, IExecute, IEepand, IUtils, ITopicMetriceParams, IRegister, IEditTopic, IExpand, IDeleteTopic, INewRegions, INewLogical, IRebalance, INewBulidEnums, ITrigger, IApprovalOrder, IMonitorSilences, IConfigure, IBatchApproval } from 'types/base-type'; +import { IUploadFile, IUser, IQuotaModelItem, ILimitsItem, ITopic, IOrderParams, ISample, IMigration, IExecute, IEepand, IUtils, ITopicMetriceParams, IRegister, IEditTopic, IExpand, IDeleteTopic, INewRegions, INewLogical, IRebalance, INewBulidEnums, ITrigger, IApprovalOrder, IMonitorSilences, IConfigure, IConfigGateway, IBatchApproval } from 'types/base-type'; import { IRequestParams } from 'types/alarm'; import { apiCache } from 'lib/api-cache'; @@ -442,6 +442,34 @@ export const deleteConfigure = (configKey: string) => { }); }; +export const getGatewayList = () => { + return fetch(`/rd/gateway-configs`); +}; + +export const getGatewayType = () => { + return fetch(`/op/gateway-configs/type-enums`); +}; + +export const addNewConfigGateway = (params: IConfigGateway) => { + return fetch(`/op/gateway-configs`, { + method: 'POST', + body: JSON.stringify(params), + }); +}; + +export const editConfigGateway = (params: IConfigGateway) => { + return fetch(`/op/gateway-configs`, { + method: 'PUT', + body: JSON.stringify(params), + }); +}; +export const deleteConfigGateway = (params: IConfigure) => { + return fetch(`/op/gateway-configs`, { + method: 'DELETE', + body: JSON.stringify(params), + }); +}; + export const getDataCenter = () => { return fetch(`/normal/configs/idc`); }; @@ -530,6 +558,23 @@ export const getControllerHistory = (clusterId: number) => { return fetch(`/rd/clusters/${clusterId}/controller-history`); }; +export const getCandidateController = (clusterId: number) => { + return fetch(`/rd/clusters/${clusterId}/controller-preferred-candidates`); +}; + +export const addCandidateController = (params:any) => { + return fetch(`/op/cluster-controller/preferred-candidates`, { + method: 'POST', + body: JSON.stringify(params), + }); +}; + +export const deleteCandidateCancel = (params:any)=>{ + return fetch(`/op/cluster-controller/preferred-candidates`, { + method: 'DELETE', + body: JSON.stringify(params), + }); +} /** * 运维管控 broker */ diff --git a/kafka-manager-console/src/lib/line-charts-config.ts b/kafka-manager-console/src/lib/line-charts-config.ts index fe9880a6..4a667c0c 100644 --- a/kafka-manager-console/src/lib/line-charts-config.ts +++ b/kafka-manager-console/src/lib/line-charts-config.ts @@ -77,7 +77,7 @@ export const getControlMetricOption = (type: IOptionType, data: IClusterMetrics[ name = '条'; data.map(item => { item.messagesInPerSec = item.messagesInPerSec !== null ? Number(item.messagesInPerSec.toFixed(2)) : null; - }); + }); break; case 'brokerNum': case 'topicNum': @@ -224,7 +224,7 @@ export const getClusterMetricOption = (type: IOptionType, record: IClusterMetric name = '条'; data.map(item => { item.messagesInPerSec = item.messagesInPerSec !== null ? Number(item.messagesInPerSec.toFixed(2)) : null; - }); + }); break; default: const { name: unitName, data: xData } = dealFlowData(metricTypeMap[type], data); @@ -248,8 +248,8 @@ export const getClusterMetricOption = (type: IOptionType, record: IClusterMetric const unitSeries = item.data[item.seriesName] !== null ? Number(item.data[item.seriesName]) : null; // tslint:disable-next-line:max-line-length result += ''; - if ( (item.data.produceThrottled && item.seriesName === 'appIdBytesInPerSec') - || (item.data.consumeThrottled && item.seriesName === 'appIdBytesOutPerSec') ) { + if ((item.data.produceThrottled && item.seriesName === 'appIdBytesInPerSec') + || (item.data.consumeThrottled && item.seriesName === 'appIdBytesOutPerSec')) { return result += item.seriesName + ': ' + unitSeries + '(被限流)' + '
    '; } return result += item.seriesName + ': ' + unitSeries + '
    '; @@ -317,7 +317,7 @@ export const getMonitorMetricOption = (seriesName: string, data: IMetricPoint[]) if (ele.name === item.seriesName) { // tslint:disable-next-line:max-line-length result += ''; - return result += item.seriesName + ': ' + (item.data.value === null ? '' : item.data.value.toFixed(2)) + '
    '; + return result += item.seriesName + ': ' + (item.data.value === null ? '' : item.data.value.toFixed(2)) + '
    '; } }); }); diff --git a/kafka-manager-console/src/store/admin-monitor.ts b/kafka-manager-console/src/store/admin-monitor.ts index 4071e1c5..7e257637 100644 --- a/kafka-manager-console/src/store/admin-monitor.ts +++ b/kafka-manager-console/src/store/admin-monitor.ts @@ -3,6 +3,11 @@ import { observable, action } from 'mobx'; import { getBrokersMetricsHistory } from 'lib/api'; import { IClusterMetrics } from 'types/base-type'; +const STATUS = { + PENDING: 'pending', + REJECT: 'reject', + FULLFILLED: 'fullfilled' +} class AdminMonitor { @observable public currentClusterId = null as number; @@ -33,33 +38,42 @@ class AdminMonitor { @action.bound public setBrokersChartsData(data: IClusterMetrics[]) { this.brokersMetricsHistory = data; - this.setRequestId(null); + this.setRequestId(STATUS.FULLFILLED); + Promise.all(this.taskQueue).then(() => { + this.setRequestId(null); + this.taskQueue = []; + }) return data; } + public taskQueue = [] as any[]; public getBrokersMetricsList = async (startTime: string, endTime: string) => { - if (this.requestId && this.requestId !== 'error') { - return new Promise((res, rej) => { - window.setTimeout(() => { - if (this.requestId === 'error') { - rej(); - } else { + if (this.requestId) { + //逐条定时查询任务状态 + const p = new Promise((res, rej) => { + const timer = window.setInterval(() => { + if (this.requestId === STATUS.REJECT) { + rej(this.brokersMetricsHistory); + window.clearInterval(timer); + } else if (this.requestId === STATUS.FULLFILLED) { res(this.brokersMetricsHistory); + window.clearInterval(timer); } - }, 800); // TODO: 该实现方式待优化 + }, (this.taskQueue.length + 1) * 100); }); + this.taskQueue.push(p); + return p; } - this.setRequestId('requesting'); + this.setRequestId(STATUS.PENDING); return getBrokersMetricsHistory(this.currentClusterId, this.currentBrokerId, startTime, endTime) - .then(this.setBrokersChartsData).catch(() => this.setRequestId('error')); + .then(this.setBrokersChartsData).catch(() => this.setRequestId(STATUS.REJECT)); } public getBrokersChartsData = async (startTime: string, endTime: string, reload?: boolean) => { if (this.brokersMetricsHistory && !reload) { return new Promise(res => res(this.brokersMetricsHistory)); } - return this.getBrokersMetricsList(startTime, endTime); } } diff --git a/kafka-manager-console/src/store/admin.ts b/kafka-manager-console/src/store/admin.ts index f3d08264..bd641773 100644 --- a/kafka-manager-console/src/store/admin.ts +++ b/kafka-manager-console/src/store/admin.ts @@ -1,5 +1,5 @@ import { observable, action } from 'mobx'; -import { INewBulidEnums, ILabelValue, IClusterReal, IOptionType, IClusterMetrics, IClusterTopics, IKafkaFiles, IMetaData, IConfigure, IBrokerData, IOffset, IController, IBrokersBasicInfo, IBrokersStatus, IBrokersTopics, IBrokersPartitions, IBrokersAnalysis, IAnalysisTopicVO, IBrokersMetadata, IBrokersRegions, IThrottles, ILogicalCluster, INewRegions, INewLogical, ITaskManage, IPartitionsLocation, ITaskType, ITasksEnums, ITasksMetaData, ITaskStatusDetails, IKafkaRoles, IEnumsMap, IStaffSummary, IBill, IBillDetail } from 'types/base-type'; +import { INewBulidEnums, ILabelValue, IClusterReal, IOptionType, IClusterMetrics, IClusterTopics, IKafkaFiles, IMetaData, IConfigure, IConfigGateway, IBrokerData, IOffset, IController, IBrokersBasicInfo, IBrokersStatus, IBrokersTopics, IBrokersPartitions, IBrokersAnalysis, IAnalysisTopicVO, IBrokersMetadata, IBrokersRegions, IThrottles, ILogicalCluster, INewRegions, INewLogical, ITaskManage, IPartitionsLocation, ITaskType, ITasksEnums, ITasksMetaData, ITaskStatusDetails, IKafkaRoles, IEnumsMap, IStaffSummary, IBill, IBillDetail } from 'types/base-type'; import { deleteCluster, getBasicInfo, @@ -12,7 +12,12 @@ import { getConfigure, addNewConfigure, editConfigure, + addNewConfigGateway, deleteConfigure, + getGatewayList, + getGatewayType, + editConfigGateway, + deleteConfigGateway, getDataCenter, getClusterBroker, getClusterConsumer, @@ -49,6 +54,9 @@ import { getStaffSummary, getBillStaffSummary, getBillStaffDetail, + getCandidateController, + addCandidateController, + deleteCandidateCancel } from 'lib/api'; import { getControlMetricOption, getClusterMetricOption } from 'lib/line-charts-config'; @@ -59,6 +67,7 @@ import { transBToMB } from 'lib/utils'; import moment from 'moment'; import { timestore } from './time'; +import { message } from 'component/antd'; class Admin { @observable @@ -97,6 +106,12 @@ class Admin { @observable public configureList: IConfigure[] = []; + @observable + public configGatewayList: IConfigGateway[] = []; + + @observable + public gatewayType: []; + @observable public dataCenterList: string[] = []; @@ -142,6 +157,12 @@ class Admin { @observable public controllerHistory: IController[] = []; + @observable + public controllerCandidate: IController[] = []; + + @observable + public filtercontrollerCandidate: string = ''; + @observable public brokersPartitions: IBrokersPartitions[] = []; @@ -152,7 +173,7 @@ class Admin { public brokersAnalysisTopic: IAnalysisTopicVO[] = []; @observable - public brokersMetadata: IBrokersMetadata[] = []; + public brokersMetadata: IBrokersMetadata[] | any = []; @observable public brokersRegions: IBrokersRegions[] = []; @@ -206,10 +227,10 @@ class Admin { public kafkaRoles: IKafkaRoles[]; @observable - public controlType: IOptionType = 'byteIn/byteOut' ; + public controlType: IOptionType = 'byteIn/byteOut'; @observable - public type: IOptionType = 'byteIn/byteOut' ; + public type: IOptionType = 'byteIn/byteOut'; @observable public currentClusterId = null as number; @@ -241,7 +262,7 @@ class Admin { @action.bound public setClusterRealTime(data: IClusterReal) { - this.clusterRealData = data; + this.clusterRealData = data; this.getRealClusterLoading(false); } @@ -284,7 +305,7 @@ class Admin { return { ...item, label: item.fileName, - value: item.fileName + ',' + item.fileMd5, + value: item.fileName + ',' + item.fileMd5, }; })); } @@ -306,6 +327,20 @@ class Admin { }) : []; } + @action.bound + public setConfigGatewayList(data: IConfigGateway[]) { + this.configGatewayList = data ? data.map((item, index) => { + item.key = index; + return item; + }) : []; + } + + @action.bound + public setConfigGatewayType(data: any) { + this.setLoading(false); + this.gatewayType = data || []; + } + @action.bound public setDataCenter(data: string[]) { this.dataCenterList = data || []; @@ -335,6 +370,17 @@ class Admin { }) : []; } + @action.bound + public setCandidateController(data: IController[]) { + this.controllerCandidate = data ? data.map((item, index) => { + item.key = index; + return item; + }) : []; + this.filtercontrollerCandidate = data?data.map((item,index)=>{ + return item.brokerId + }).join(','):'' + } + @action.bound public setBrokersBasicInfo(data: IBrokersBasicInfo) { this.brokersBasicInfo = data; @@ -356,10 +402,10 @@ class Admin { this.replicaStatus = data.brokerReplicaStatusList.slice(1); this.bytesInStatus.forEach((item, index) => { - this.peakValueList.push({ name: peakValueMap[index], value: item}); + this.peakValueList.push({ name: peakValueMap[index], value: item }); }); this.replicaStatus.forEach((item, index) => { - this.copyValueList.push({name: copyValueMap[index], value: item}); + this.copyValueList.push({ name: copyValueMap[index], value: item }); }); } @@ -415,16 +461,16 @@ class Admin { } @action.bound - public setBrokersMetadata(data: IBrokersMetadata[]) { - this.brokersMetadata = data ? data.map((item, index) => { - item.key = index; - return { - ...item, - text: `${item.host} (BrokerID:${item.brokerId})`, - label: item.host, - value: item.brokerId, - }; - }) : []; + public setBrokersMetadata(data: IBrokersMetadata[]|any) { + this.brokersMetadata = data ? data.map((item:any, index:any) => { + item.key = index; + return { + ...item, + text: `${item.host} (BrokerID:${item.brokerId})`, + label: item.host, + value: item.brokerId, + }; + }) : []; } @action.bound @@ -461,9 +507,9 @@ class Admin { @action.bound public setLogicalClusters(data: ILogicalCluster[]) { this.logicalClusters = data ? data.map((item, index) => { - item.key = index; - return item; - }) : []; + item.key = index; + return item; + }) : []; } @action.bound @@ -474,25 +520,25 @@ class Admin { @action.bound public setClustersThrottles(data: IThrottles[]) { this.clustersThrottles = data ? data.map((item, index) => { - item.key = index; - return item; - }) : []; + item.key = index; + return item; + }) : []; } @action.bound public setPartitionsLocation(data: IPartitionsLocation[]) { this.partitionsLocation = data ? data.map((item, index) => { - item.key = index; - return item; - }) : []; + item.key = index; + return item; + }) : []; } @action.bound public setTaskManagement(data: ITaskManage[]) { this.taskManagement = data ? data.map((item, index) => { - item.key = index; - return item; - }) : []; + item.key = index; + return item; + }) : []; } @action.bound @@ -568,7 +614,7 @@ class Admin { return deleteCluster(clusterId).then(() => this.getMetaData(true)); } - public getPeakFlowChartData(value: ILabelValue[], map: string []) { + public getPeakFlowChartData(value: ILabelValue[], map: string[]) { return getPieChartOption(value, map); } @@ -627,6 +673,30 @@ class Admin { deleteConfigure(configKey).then(() => this.getConfigure()); } + public getGatewayList() { + getGatewayList().then(this.setConfigGatewayList); + } + + public getGatewayType() { + this.setLoading(true); + getGatewayType().then(this.setConfigGatewayType); + } + + public addNewConfigGateway(params: IConfigGateway) { + return addNewConfigGateway(params).then(() => this.getGatewayList()); + } + + public editConfigGateway(params: IConfigGateway) { + return editConfigGateway(params).then(() => this.getGatewayList()); + } + + public deleteConfigGateway(params: any) { + deleteConfigGateway(params).then(() => { + // message.success('删除成功') + this.getGatewayList() + }); + } + public getDataCenter() { getDataCenter().then(this.setDataCenter); } @@ -643,6 +713,20 @@ class Admin { return getControllerHistory(clusterId).then(this.setControllerHistory); } + public getCandidateController(clusterId: number) { + return getCandidateController(clusterId).then(data=>{ + return this.setCandidateController(data) + }); + } + + public addCandidateController(clusterId: number, brokerIdList: any) { + return addCandidateController({clusterId, brokerIdList}).then(()=>this.getCandidateController(clusterId)); + } + + public deleteCandidateCancel(clusterId: number, brokerIdList: any){ + return deleteCandidateCancel({clusterId, brokerIdList}).then(()=>this.getCandidateController(clusterId)); + } + public getBrokersBasicInfo(clusterId: number, brokerId: number) { return getBrokersBasicInfo(clusterId, brokerId).then(this.setBrokersBasicInfo); } diff --git a/kafka-manager-console/src/store/alarm.ts b/kafka-manager-console/src/store/alarm.ts index b3e004df..e57631f0 100644 --- a/kafka-manager-console/src/store/alarm.ts +++ b/kafka-manager-console/src/store/alarm.ts @@ -181,6 +181,7 @@ class Alarm { public modifyMonitorStrategy(params: IRequestParams) { return modifyMonitorStrategy(params).then(() => { message.success('操作成功'); + window.location.href = `${urlPrefix}/alarm`; }).finally(() => this.setLoading(false)); } diff --git a/kafka-manager-console/src/store/users.ts b/kafka-manager-console/src/store/users.ts index 8d53114e..249a0187 100644 --- a/kafka-manager-console/src/store/users.ts +++ b/kafka-manager-console/src/store/users.ts @@ -19,6 +19,9 @@ export class Users { @observable public staff: IStaff[] = []; + @observable + public newPassWord: any = null; + @action.bound public setAccount(data: IUser) { setCookie([{ key: 'role', value: `${data.role}`, time: 1 }]); @@ -42,6 +45,11 @@ export class Users { this.loading = value; } + @action.bound + public setNewPassWord(value: boolean) { + this.newPassWord = value; + } + public getAccount() { getAccount().then(this.setAccount); } diff --git a/kafka-manager-console/src/types/base-type.ts b/kafka-manager-console/src/types/base-type.ts index 1170a696..605fd4fc 100644 --- a/kafka-manager-console/src/types/base-type.ts +++ b/kafka-manager-console/src/types/base-type.ts @@ -190,6 +190,7 @@ export interface IUser { chineseName?: string; department?: string; key?: number; + confirmPassword?:string } export interface IOffset { @@ -486,6 +487,17 @@ export interface IConfigure { key?: number; } +export interface IConfigGateway { + id: number; + key?: number; + modifyTime: number; + name: string; + value: string; + version: string; + type: string; + description: string; +} + export interface IEepand { brokerIdList: number[]; clusterId: number; @@ -650,8 +662,10 @@ export interface IBrokerData { export interface IController { brokerId: number; host: string; - timestamp: number; - version: number; + timestamp?: number; + version?: number; + startTime?: number; + status?: number; key?: number; } From 0270f77eaab6b14e430c142f7a4d8cc620ba41e2 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 9 Feb 2021 21:46:55 +0800 Subject: [PATCH 06/55] add upgrade doc --- docs/dev_guide/upgrade_manual/logi-km-v2.3.0.md | 17 +++++++++++++++++ docs/install_guide/create_mysql_table.sql | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 docs/dev_guide/upgrade_manual/logi-km-v2.3.0.md diff --git a/docs/dev_guide/upgrade_manual/logi-km-v2.3.0.md b/docs/dev_guide/upgrade_manual/logi-km-v2.3.0.md new file mode 100644 index 00000000..3a4196f8 --- /dev/null +++ b/docs/dev_guide/upgrade_manual/logi-km-v2.3.0.md @@ -0,0 +1,17 @@ + +--- + +![kafka-manager-logo](../../assets/images/common/logo_name.png) + +**一站式`Apache Kafka`集群指标监控与运维管控平台** + +--- + +# 升级至`2.3.0`版本 + +`2.3.0`版本在`gateway_config`表增加了一个描述说明的字段,因此需要执行下面的sql进行字段的增加。 + +```sql +ALTER TABLE `gateway_config` +ADD COLUMN `description` TEXT NULL COMMENT '描述信息' AFTER `version`; +``` diff --git a/docs/install_guide/create_mysql_table.sql b/docs/install_guide/create_mysql_table.sql index 2a015de1..065532eb 100644 --- a/docs/install_guide/create_mysql_table.sql +++ b/docs/install_guide/create_mysql_table.sql @@ -203,7 +203,8 @@ CREATE TABLE `gateway_config` ( `type` varchar(128) NOT NULL DEFAULT '' COMMENT '配置类型', `name` varchar(128) NOT NULL DEFAULT '' COMMENT '配置名称', `value` text COMMENT '配置值', - `version` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '版本信息', + `version` bigint(20) unsigned NOT NULL DEFAULT '1' COMMENT '版本信息', + `description` text COMMENT '描述信息', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), From 0f8aca382eeb1360a742026d0fa421953e5ad3c2 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 9 Feb 2021 21:47:56 +0800 Subject: [PATCH 07/55] bump version to 2.3.0 --- build.sh | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 03b1087e..f3ea8642 100644 --- a/build.sh +++ b/build.sh @@ -4,7 +4,7 @@ cd $workspace ## constant OUTPUT_DIR=./output -KM_VERSION=2.2.0 +KM_VERSION=2.3.0 APP_NAME=kafka-manager APP_DIR=${APP_NAME}-${KM_VERSION} diff --git a/pom.xml b/pom.xml index 6588d335..d4165a85 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ - 2.2.0-SNAPSHOT + 2.3.0-SNAPSHOT 2.7.0 1.5.13 From 1ed933b7ada59b01ef65f8fed588a65e5395449d Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 23 Feb 2021 16:34:21 +0800 Subject: [PATCH 08/55] support dynamic change auth --- .../manager/common/entity/pojo/ClusterDO.java | 19 +++++ .../service/cache/KafkaClientPool.java | 23 +++++- .../cache/PhysicalClusterMetadataManager.java | 28 ++++--- .../metadata/FlushClusterMetadata.java | 77 ++++++++++++++----- 4 files changed, 116 insertions(+), 31 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/ClusterDO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/ClusterDO.java index 04ee265d..5ebebc75 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/ClusterDO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/ClusterDO.java @@ -1,6 +1,7 @@ package com.xiaojukeji.kafka.manager.common.entity.pojo; import java.util.Date; +import java.util.Objects; /** * @author zengqiao @@ -116,4 +117,22 @@ public class ClusterDO implements Comparable { public int compareTo(ClusterDO clusterDO) { return this.id.compareTo(clusterDO.id); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ClusterDO clusterDO = (ClusterDO) o; + return Objects.equals(id, clusterDO.id) + && Objects.equals(clusterName, clusterDO.clusterName) + && Objects.equals(zookeeper, clusterDO.zookeeper) + && Objects.equals(bootstrapServers, clusterDO.bootstrapServers) + && Objects.equals(securityProperties, clusterDO.securityProperties) + && Objects.equals(jmxProperties, clusterDO.jmxProperties); + } + + @Override + public int hashCode() { + return Objects.hash(id, clusterName, zookeeper, bootstrapServers, securityProperties, jmxProperties); + } } \ No newline at end of file diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaClientPool.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaClientPool.java index ce0753e4..921b13ba 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaClientPool.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/KafkaClientPool.java @@ -1,8 +1,8 @@ package com.xiaojukeji.kafka.manager.service.cache; import com.alibaba.fastjson.JSONObject; -import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO; +import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.common.utils.factory.KafkaConsumerFactory; import kafka.admin.AdminClient; import org.apache.commons.pool2.impl.GenericObjectPool; @@ -103,6 +103,21 @@ public class KafkaClientPool { } } + public static void closeKafkaConsumerPool(Long clusterId) { + lock.lock(); + try { + GenericObjectPool objectPool = KAFKA_CONSUMER_POOL.remove(clusterId); + if (objectPool == null) { + return; + } + objectPool.close(); + } catch (Exception e) { + LOGGER.error("close kafka consumer pool failed, clusterId:{}.", clusterId, e); + } finally { + lock.unlock(); + } + } + public static KafkaConsumer borrowKafkaConsumerClient(ClusterDO clusterDO) { if (ValidateUtils.isNull(clusterDO)) { return null; @@ -132,7 +147,11 @@ public class KafkaClientPool { if (ValidateUtils.isNull(objectPool)) { return; } - objectPool.returnObject(kafkaConsumer); + try { + objectPool.returnObject(kafkaConsumer); + } catch (Exception e) { + LOGGER.error("return kafka consumer client failed, clusterId:{}", physicalClusterId, e); + } } public static AdminClient getAdminClient(Long clusterId) { diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java index e3b8f23f..631b254f 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/cache/PhysicalClusterMetadataManager.java @@ -4,21 +4,23 @@ import com.xiaojukeji.kafka.manager.common.bizenum.KafkaBrokerRoleEnum; import com.xiaojukeji.kafka.manager.common.constant.Constant; import com.xiaojukeji.kafka.manager.common.constant.KafkaConstant; import com.xiaojukeji.kafka.manager.common.entity.KafkaVersion; +import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO; import com.xiaojukeji.kafka.manager.common.utils.JsonUtils; import com.xiaojukeji.kafka.manager.common.utils.ListUtils; -import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.common.utils.jmx.JmxConfig; -import com.xiaojukeji.kafka.manager.common.zookeeper.znode.brokers.BrokerMetadata; -import com.xiaojukeji.kafka.manager.common.zookeeper.znode.ControllerData; -import com.xiaojukeji.kafka.manager.common.zookeeper.znode.brokers.TopicMetadata; -import com.xiaojukeji.kafka.manager.common.zookeeper.ZkConfigImpl; -import com.xiaojukeji.kafka.manager.dao.ControllerDao; import com.xiaojukeji.kafka.manager.common.utils.jmx.JmxConnectorWrap; -import com.xiaojukeji.kafka.manager.service.service.JmxService; -import com.xiaojukeji.kafka.manager.service.zookeeper.*; -import com.xiaojukeji.kafka.manager.service.service.ClusterService; +import com.xiaojukeji.kafka.manager.common.zookeeper.ZkConfigImpl; import com.xiaojukeji.kafka.manager.common.zookeeper.ZkPathUtil; +import com.xiaojukeji.kafka.manager.common.zookeeper.znode.ControllerData; +import com.xiaojukeji.kafka.manager.common.zookeeper.znode.brokers.BrokerMetadata; +import com.xiaojukeji.kafka.manager.common.zookeeper.znode.brokers.TopicMetadata; +import com.xiaojukeji.kafka.manager.dao.ControllerDao; +import com.xiaojukeji.kafka.manager.service.service.ClusterService; +import com.xiaojukeji.kafka.manager.service.service.JmxService; +import com.xiaojukeji.kafka.manager.service.zookeeper.BrokerStateListener; +import com.xiaojukeji.kafka.manager.service.zookeeper.ControllerStateListener; +import com.xiaojukeji.kafka.manager.service.zookeeper.TopicStateListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -160,8 +162,12 @@ public class PhysicalClusterMetadataManager { CLUSTER_MAP.remove(clusterId); } - public Set getClusterIdSet() { - return CLUSTER_MAP.keySet(); + public static Map getClusterMap() { + return CLUSTER_MAP; + } + + public static void updateClusterMap(ClusterDO clusterDO) { + CLUSTER_MAP.put(clusterDO.getId(), clusterDO); } public static ClusterDO getClusterFromCache(Long clusterId) { diff --git a/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/schedule/metadata/FlushClusterMetadata.java b/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/schedule/metadata/FlushClusterMetadata.java index e2c63e06..e88ad696 100644 --- a/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/schedule/metadata/FlushClusterMetadata.java +++ b/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/schedule/metadata/FlushClusterMetadata.java @@ -1,15 +1,17 @@ package com.xiaojukeji.kafka.manager.task.schedule.metadata; import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO; +import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; +import com.xiaojukeji.kafka.manager.service.cache.KafkaClientPool; import com.xiaojukeji.kafka.manager.service.cache.PhysicalClusterMetadataManager; import com.xiaojukeji.kafka.manager.service.service.ClusterService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author zengqiao @@ -25,24 +27,63 @@ public class FlushClusterMetadata { @Scheduled(cron="0/30 * * * * ?") public void flush() { - List doList = clusterService.list(); + Map dbClusterMap = clusterService.list().stream().collect(Collectors.toMap(ClusterDO::getId, Function.identity(), (key1, key2) -> key2)); - Set newClusterIdSet = new HashSet<>(); - Set oldClusterIdSet = physicalClusterMetadataManager.getClusterIdSet(); - for (ClusterDO clusterDO: doList) { - newClusterIdSet.add(clusterDO.getId()); + Map cacheClusterMap = PhysicalClusterMetadataManager.getClusterMap(); - // 添加集群 - physicalClusterMetadataManager.addNew(clusterDO); - } + // 新增的集群 + for (ClusterDO clusterDO: dbClusterMap.values()) { + if (cacheClusterMap.containsKey(clusterDO.getId())) { + // 已经存在 + continue; + } + add(clusterDO); + } - for (Long clusterId: oldClusterIdSet) { - if (newClusterIdSet.contains(clusterId)) { - continue; - } + // 移除的集群 + for (ClusterDO clusterDO: cacheClusterMap.values()) { + if (dbClusterMap.containsKey(clusterDO.getId())) { + // 已经存在 + continue; + } + remove(clusterDO.getId()); + } - // 移除集群 - physicalClusterMetadataManager.remove(clusterId); - } + // 被修改配置的集群 + for (ClusterDO dbClusterDO: dbClusterMap.values()) { + ClusterDO cacheClusterDO = cacheClusterMap.get(dbClusterDO.getId()); + if (ValidateUtils.anyNull(cacheClusterDO) || dbClusterDO.equals(cacheClusterDO)) { + // 不存在 || 相等 + continue; + } + modifyConfig(dbClusterDO); + } } + + private void add(ClusterDO clusterDO) { + if (ValidateUtils.anyNull(clusterDO)) { + return; + } + physicalClusterMetadataManager.addNew(clusterDO); + } + + private void modifyConfig(ClusterDO clusterDO) { + if (ValidateUtils.anyNull(clusterDO)) { + return; + } + PhysicalClusterMetadataManager.updateClusterMap(clusterDO); + KafkaClientPool.closeKafkaConsumerPool(clusterDO.getId()); + } + + private void remove(Long clusterId) { + if (ValidateUtils.anyNull(clusterId)) { + return; + } + // 移除缓存信息 + physicalClusterMetadataManager.remove(clusterId); + + // 清除客户端池子 + KafkaClientPool.closeKafkaConsumerPool(clusterId); + } + } \ No newline at end of file From 18e244b7562c62fc0a05ba799ab2687a4f1a2f5f Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 23 Feb 2021 17:18:49 +0800 Subject: [PATCH 09/55] reject illegal zk address --- .../service/impl/ClusterServiceImpl.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java index e1a619a8..b505bad0 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ClusterServiceImpl.java @@ -205,21 +205,31 @@ public class ClusterServiceImpl implements ClusterService { } private boolean isZookeeperLegal(String zookeeper) { + boolean status = false; + ZooKeeper zk = null; try { zk = new ZooKeeper(zookeeper, 1000, null); - } catch (Throwable t) { - return false; + for (int i = 0; i < 15; ++i) { + if (zk.getState().isConnected()) { + // 只有状态是connected的时候,才表示地址是合法的 + status = true; + break; + } + Thread.sleep(1000); + } + } catch (Exception e) { + LOGGER.error("class=ClusterServiceImpl||method=isZookeeperLegal||zookeeper={}||msg=zk address illegal||errMsg={}", zookeeper, e.getMessage()); } finally { try { if (zk != null) { zk.close(); } } catch (Exception e) { - return false; + LOGGER.error("class=ClusterServiceImpl||method=isZookeeperLegal||zookeeper={}||msg=close zk client failed||errMsg={}", zookeeper, e.getMessage()); } } - return true; + return status; } @Override From 748e81956dde06a579e10522accfc6c0c312b3db Mon Sep 17 00:00:00 2001 From: EricZeng Date: Wed, 24 Feb 2021 14:10:41 +0800 Subject: [PATCH 10/55] Update faq.md --- docs/user_guide/faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user_guide/faq.md b/docs/user_guide/faq.md index 8ab9781a..cfa6933d 100644 --- a/docs/user_guide/faq.md +++ b/docs/user_guide/faq.md @@ -76,7 +76,7 @@ - 3、数据库时区问题。 -检查MySQL的topic表,查看是否有数据,如果有数据,那么再检查设置的时区是否正确。 +检查MySQL的topic_metrics表,查看是否有数据,如果有数据,那么再检查设置的时区是否正确。 --- From e05e722387bd2151707ecfa9a2d8e6efea8a7f53 Mon Sep 17 00:00:00 2001 From: ZHAOYINRUI <51046167+ZHAOYINRUI@users.noreply.github.com> Date: Fri, 26 Feb 2021 00:01:09 +0800 Subject: [PATCH 11/55] Add files via upload --- Releases_Notes.md | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 Releases_Notes.md diff --git a/Releases_Notes.md b/Releases_Notes.md new file mode 100644 index 00000000..46b5753e --- /dev/null +++ b/Releases_Notes.md @@ -0,0 +1,97 @@ + +--- + +![kafka-manager-logo](./docs/assets/images/common/logo_name.png) + +**一站式`Apache Kafka`集群指标监控与运维管控平台** + +--- + +## v2.3.0 + +版本上线时间:2021-02-08 + + +### 能力提升 + +- 新增支持docker化部署 +- 可指定Broker作为候选controller +- 可新增并管理网关配置 +- 可获取消费组状态 +- 增加集群的JMX认证 + +### 体验优化 + +- 优化编辑用户角色、修改密码的流程 +- 新增consumerID的搜索功能 +- 优化“Topic连接信息”、“消费组重置消费偏移”、“修改Topic保存时间”的文案提示 +- 在相应位置增加《资源申请文档》链接 + +### bug修复 + +- 修复Broker监控图表时间轴展示错误的问题 +- 修复创建夜莺监控告警规则时,使用的告警周期的单位不正确的问题 + + + +## v2.2.0 + +版本上线时间:2021-01-25 + + + +### 能力提升 + +- 优化工单批量操作流程 +- 增加获取Topic75分位/99分位的实时耗时数据 +- 增加定时任务,可将无主未落DB的Topic定期写入DB + +### 体验优化 + +- 在相应位置增加《集群接入文档》链接 +- 优化物理集群、逻辑集群含义 +- 在Topic详情页、Topic扩分区操作弹窗增加展示Topic所属Region的信息 +- 优化Topic审批时,Topic数据保存时间的配置流程 +- 优化Topic/应用申请、审批时的错误提示文案 +- 优化Topic数据采样的操作项文案 +- 优化运维人员删除Topic时的提示文案 +- 优化运维人员删除Region的删除逻辑与提示文案 +- 优化运维人员删除逻辑集群的提示文案 +- 优化上传集群配置文件时的文件类型限制条件 + +### bug修复 + +- 修复填写应用名称时校验特殊字符出错的问题 +- 修复普通用户越权访问应用详情的问题 +- 修复由于Kafka版本升级,导致的数据压缩格式无法获取的问题 +- 修复删除逻辑集群或Topic之后,界面依旧展示的问题 +- 修复进行Leader rebalance操作时执行结果重复提示的问题 + + +## v2.1.0 + +版本上线时间:2020-12-19 + + + +### 体验优化 + +- 优化页面加载时的背景样式 +- 优化普通用户申请Topic权限的流程 +- 优化Topic申请配额、申请分区的权限限制 +- 优化取消Topic权限的文案提示 +- 优化申请配额表单的表单项名称 +- 优化重置消费偏移的操作流程 +- 优化创建Topic迁移任务的表单内容 +- 优化Topic扩分区操作的弹窗界面样式 +- 优化集群Broker监控可视化图表样式 +- 优化创建逻辑集群的表单内容 +- 优化集群安全协议的提示文案 + +### bug修复 + +- 修复偶发性重置消费偏移失败的问题 + + + + From efd28f8c27728f4ce229270c773d952a5cbbe13f Mon Sep 17 00:00:00 2001 From: ZHAOYINRUI <51046167+ZHAOYINRUI@users.noreply.github.com> Date: Fri, 26 Feb 2021 00:03:25 +0800 Subject: [PATCH 12/55] Update faq.md --- docs/user_guide/faq.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/user_guide/faq.md b/docs/user_guide/faq.md index cfa6933d..f62ba59f 100644 --- a/docs/user_guide/faq.md +++ b/docs/user_guide/faq.md @@ -18,6 +18,7 @@ - 6、如何使用`MySQL 8`? - 7、`Jmx`连接失败如何解决? - 8、`topic biz data not exist`错误及处理方式 +- 9、进程启动后,如何查看API文档 --- @@ -109,3 +110,7 @@ 可以在`运维管控->集群列表->Topic信息`下面,编辑申请权限的Topic,为Topic选择一个应用即可。 以上仅仅只是针对单个Topic的场景,如果你有非常多的Topic需要进行初始化的,那么此时可以在配置管理中增加一个配置,来定时的对无主的Topic进行同步,具体见:[动态配置管理 - 1、Topic定时同步任务](../dev_guide/dynamic_config_manager.md) + +### 9、进程启动后,如何查看API文档 + +- 滴滴Logi-KafkaManager采用Swagger-API工具记录API文档。Swagger-API地址: [http://IP:PORT/swagger-ui.html#/](http://IP:PORT/swagger-ui.html#/) From 9b0ab878df05916e790c5e9046d3333e6bfec0f6 Mon Sep 17 00:00:00 2001 From: Joker Date: Fri, 26 Feb 2021 19:47:03 +0800 Subject: [PATCH 13/55] bug fix: unexpected stop of the topic sync task --- .../xiaojukeji/kafka/manager/task/dispatch/op/SyncTopic2DB.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/dispatch/op/SyncTopic2DB.java b/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/dispatch/op/SyncTopic2DB.java index ae10a21d..bb069aa8 100644 --- a/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/dispatch/op/SyncTopic2DB.java +++ b/kafka-manager-task/src/main/java/com/xiaojukeji/kafka/manager/task/dispatch/op/SyncTopic2DB.java @@ -125,7 +125,7 @@ public class SyncTopic2DB extends AbstractScheduledTask { if (ValidateUtils.isNull(syncTopic2DBConfig.isAddAuthority()) || !syncTopic2DBConfig.isAddAuthority()) { // 不增加权限信息, 则直接忽略 - return; + continue; } // TODO 当前添加 Topic 和 添加 Authority 是非事务的, 中间出现异常之后, 会导致数据错误, 后续还需要优化一下 From 0c7112869a9e1aa23fc37fb664be6bd4c6633f7e Mon Sep 17 00:00:00 2001 From: Joker Date: Sat, 27 Feb 2021 22:35:35 +0800 Subject: [PATCH 14/55] bug fix:correct way to judge a user does not exist --- .../manager/account/component/sso/BaseSessionSignOn.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java index 9362d895..3aa0e703 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java @@ -57,7 +57,7 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { return null; } - if(ValidateUtils.isNull(accountResult) && authUserRegistration){ + if((ValidateUtils.isNull(accountResult) || ValidateUtils.isNull(accountResult.getData())) && authUserRegistration){ //自动注册 AccountDO accountDO = new AccountDO(); accountDO.setUsername(dto.getUsername()); @@ -105,4 +105,4 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { response.setStatus(AbstractSingleSignOn.REDIRECT_CODE); response.addHeader(AbstractSingleSignOn.HEADER_REDIRECT_KEY, ""); } -} \ No newline at end of file +} From f33e585a71e9f3d1b019fde40fb25f5acd12aad5 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Thu, 4 Mar 2021 17:51:35 +0800 Subject: [PATCH 15/55] reject req when uri contains .. --- .../kafka/manager/account/impl/LoginServiceImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java index 142dd239..591768fb 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java @@ -65,6 +65,11 @@ public class LoginServiceImpl implements LoginService { @Override public boolean checkLogin(HttpServletRequest request, HttpServletResponse response) { String uri = request.getRequestURI(); + if (uri.contains("..")) { + LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal||uri={}", uri); + return false; + } + if (!(uri.contains(ApiPrefix.API_V1_NORMAL_PREFIX) || uri.contains(ApiPrefix.API_V1_RD_PREFIX) || uri.contains(ApiPrefix.API_V1_OP_PREFIX))) { From 411ee5565323a0bb7b9a735f4adbad8324af3d79 Mon Sep 17 00:00:00 2001 From: fanghanyun Date: Fri, 5 Mar 2021 14:45:54 +0800 Subject: [PATCH 16/55] support AD LDAP --- .../common/utils/ldap/LDAPAuthentication.java | 13 ++++++++++++- .../account/component/sso/BaseSessionSignOn.java | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java index 2419901a..6406f1c3 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java @@ -1,5 +1,6 @@ package com.xiaojukeji.kafka.manager.common.utils.ldap; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -25,6 +26,9 @@ public class LDAPAuthentication { @Value(value = "${ldap.factory}") private String ldapFactory; + @Value(value = "${ldap.filter}") + private String ldapfilter; + @Value(value = "${ldap.auth-user-registration-role}") private String authUserRegistrationRole; @@ -61,7 +65,9 @@ public class LDAPAuthentication { try { SearchControls constraints = new SearchControls(); constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); - NamingEnumeration en = ctx.search("", "account=" + account, constraints); + String filter = "(&(objectClass=*)("+ldapfilter+"=" + account + "))"; + + NamingEnumeration en = ctx.search("", filter, constraints); if (en == null || !en.hasMoreElements()) { return ""; } @@ -96,6 +102,11 @@ public class LDAPAuthentication { try { String userDN = getUserDN(account,ctx); + if(StringUtils.isEmpty(userDN)){ + return valide; + } + + ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN); ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password); ctx.reconnect(null); diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java index 3aa0e703..c064ec3d 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java @@ -44,7 +44,7 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { @Override public Result loginAndGetLdap(HttpServletRequest request, HttpServletResponse response, LoginDTO dto) { if (ValidateUtils.isBlank(dto.getUsername()) || ValidateUtils.isNull(dto.getPassword())) { - return null; + return Result.buildFailure("Missing parameters"); } Result accountResult = accountService.getAccountDO(dto.getUsername()); @@ -54,7 +54,7 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { if(ldapEnabled){ //去LDAP验证账密 if(!ldapAuthentication.authenricate(dto.getUsername(),dto.getPassword())){ - return null; + return Result.buildFailure("LDAP authentication failed"); } if((ValidateUtils.isNull(accountResult) || ValidateUtils.isNull(accountResult.getData())) && authUserRegistration){ From 49fe5baf941d4409f97d6acd92a449ffdf6c38ca Mon Sep 17 00:00:00 2001 From: zengqiao Date: Fri, 5 Mar 2021 14:59:40 +0800 Subject: [PATCH 17/55] add gateway config docs --- docs/dev_guide/gateway_config_manager.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 docs/dev_guide/gateway_config_manager.md diff --git a/docs/dev_guide/gateway_config_manager.md b/docs/dev_guide/gateway_config_manager.md new file mode 100644 index 00000000..8c656531 --- /dev/null +++ b/docs/dev_guide/gateway_config_manager.md @@ -0,0 +1,10 @@ + +--- + +![kafka-manager-logo](../assets/images/common/logo_name.png) + +**一站式`Apache Kafka`集群指标监控与运维管控平台** + +--- + +# Kafka-Gateway 配置说明 \ No newline at end of file From 68bcd3c71076319ac6245e3f207d06c10b3a540c Mon Sep 17 00:00:00 2001 From: zengqiao Date: Fri, 5 Mar 2021 16:05:58 +0800 Subject: [PATCH 18/55] delete without used code --- .../common/bizenum/SinkMonitorSystemEnum.java | 45 ------------------- 1 file changed, 45 deletions(-) delete mode 100644 kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/SinkMonitorSystemEnum.java diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/SinkMonitorSystemEnum.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/SinkMonitorSystemEnum.java deleted file mode 100644 index b843a90c..00000000 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/bizenum/SinkMonitorSystemEnum.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.xiaojukeji.kafka.manager.common.bizenum; - -/** - * 是否上报监控系统 - * @author zengqiao - * @date 20/9/25 - */ -public enum SinkMonitorSystemEnum { - SINK_MONITOR_SYSTEM(0, "上报监控系统"), - NOT_SINK_MONITOR_SYSTEM(1, "不上报监控系统"), - ; - - private Integer code; - - private String message; - - SinkMonitorSystemEnum(Integer code, String message) { - this.code = code; - this.message = message; - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - @Override - public String toString() { - return "SinkMonitorSystemEnum{" + - "code=" + code + - ", message='" + message + '\'' + - '}'; - } -} From f0aba433bf022b3c9b8ede7f5fc41d26326fe88d Mon Sep 17 00:00:00 2001 From: fanghanyun Date: Mon, 8 Mar 2021 20:31:15 +0800 Subject: [PATCH 19/55] Support AD LDAP --- .../manager/common/entity/ResultStatus.java | 1 + .../common/entity/vo/ResultStatus.java | 137 ++++++++++++++++++ .../common/entity/vo/rd/ResultStatus.java | 137 ++++++++++++++++++ .../common/utils/ldap/LDAPAuthentication.java | 6 +- .../component/sso/BaseSessionSignOn.java | 3 +- .../src/main/resources/application.yml | 1 + 6 files changed, 280 insertions(+), 5 deletions(-) create mode 100644 kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java create mode 100644 kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java index 94acb56d..fd33cd9c 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java @@ -73,6 +73,7 @@ public enum ResultStatus { QUOTA_NOT_EXIST(7113, "quota not exist, please check clusterId, topicName and appId"), CONSUMER_GROUP_NOT_EXIST(7114, "consumerGroup not exist"), TOPIC_BIZ_DATA_NOT_EXIST(7115, "topic biz data not exist, please sync topic to db"), + LDAP_AUTHENTICATION_FAILED(7116, "LDAP authentication failed"), // 资源已存在 RESOURCE_ALREADY_EXISTED(7200, "资源已经存在"), diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java new file mode 100644 index 00000000..c25ab28b --- /dev/null +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java @@ -0,0 +1,137 @@ +package com.xiaojukeji.kafka.manager.common.entity; + +import com.xiaojukeji.kafka.manager.common.constant.Constant; + +/** + * 返回状态 + * @author zengqiao + * @date 20/4/16 + */ +public enum ResultStatus { + GATEWAY_INVALID_REQUEST(-1, "invalid request"), + + SUCCESS(Constant.SUCCESS, "success"), + + FAIL(1, "操作失败"), + + /** + * 操作错误[1000, 2000) + * ------------------------------------------------------------------------------------------ + */ + OPERATION_FAILED(1401, "operation failed"), + OPERATION_FORBIDDEN(1402, "operation forbidden"), + API_CALL_EXCEED_LIMIT(1403, "api call exceed limit"), + USER_WITHOUT_AUTHORITY(1404, "user without authority"), + CHANGE_ZOOKEEPER_FORBIDDEN(1405, "change zookeeper forbidden"), + + + TOPIC_OPERATION_PARAM_NULL_POINTER(1450, "参数错误"), + TOPIC_OPERATION_PARTITION_NUM_ILLEGAL(1451, "分区数错误"), + TOPIC_OPERATION_BROKER_NUM_NOT_ENOUGH(1452, "Broker数不足错误"), + TOPIC_OPERATION_TOPIC_NAME_ILLEGAL(1453, "Topic名称非法"), + TOPIC_OPERATION_TOPIC_EXISTED(1454, "Topic已存在"), + TOPIC_OPERATION_UNKNOWN_TOPIC_PARTITION(1455, "Topic未知"), + TOPIC_OPERATION_TOPIC_CONFIG_ILLEGAL(1456, "Topic配置错误"), + TOPIC_OPERATION_TOPIC_IN_DELETING(1457, "Topic正在删除"), + TOPIC_OPERATION_UNKNOWN_ERROR(1458, "未知错误"), + + /** + * 参数错误[2000, 3000) + * ------------------------------------------------------------------------------------------ + */ + PARAM_ILLEGAL(2000, "param illegal"), + CG_LOCATION_ILLEGAL(2001, "consumer group location illegal"), + ORDER_ALREADY_HANDLED(2002, "order already handled"), + APP_ID_OR_PASSWORD_ILLEGAL(2003, "app or password illegal"), + SYSTEM_CODE_ILLEGAL(2004, "system code illegal"), + CLUSTER_TASK_HOST_LIST_ILLEGAL(2005, "主机列表错误,请检查主机列表"), + JSON_PARSER_ERROR(2006, "json parser error"), + + BROKER_NUM_NOT_ENOUGH(2050, "broker not enough"), + CONTROLLER_NOT_ALIVE(2051, "controller not alive"), + CLUSTER_METADATA_ERROR(2052, "cluster metadata error"), + TOPIC_CONFIG_ERROR(2053, "topic config error"), + + /** + * 参数错误 - 资源检查错误 + * 因为外部系统的问题, 操作时引起的错误, [7000, 8000) + * ------------------------------------------------------------------------------------------ + */ + RESOURCE_NOT_EXIST(7100, "资源不存在"), + CLUSTER_NOT_EXIST(7101, "cluster not exist"), + BROKER_NOT_EXIST(7102, "broker not exist"), + TOPIC_NOT_EXIST(7103, "topic not exist"), + PARTITION_NOT_EXIST(7104, "partition not exist"), + ACCOUNT_NOT_EXIST(7105, "account not exist"), + APP_NOT_EXIST(7106, "app not exist"), + ORDER_NOT_EXIST(7107, "order not exist"), + CONFIG_NOT_EXIST(7108, "config not exist"), + IDC_NOT_EXIST(7109, "idc not exist"), + TASK_NOT_EXIST(7110, "task not exist"), + AUTHORITY_NOT_EXIST(7111, "authority not exist"), + MONITOR_NOT_EXIST(7112, "monitor not exist"), + QUOTA_NOT_EXIST(7113, "quota not exist, please check clusterId, topicName and appId"), + CONSUMER_GROUP_NOT_EXIST(7114, "consumerGroup not exist"), + TOPIC_BIZ_DATA_NOT_EXIST(7115, "topic biz data not exist, please sync topic to db"), + LDAP_AUTHENTICATION_FAILED(7116, "LDAP authentication failed"), + + + // 资源已存在 + RESOURCE_ALREADY_EXISTED(7200, "资源已经存在"), + TOPIC_ALREADY_EXIST(7201, "topic already existed"), + + // 资源重名 + RESOURCE_NAME_DUPLICATED(7300, "资源名称重复"), + + // 资源已被使用 + RESOURCE_ALREADY_USED(7400, "资源早已被使用"), + + + /** + * 因为外部系统的问题, 操作时引起的错误, [8000, 9000) + * ------------------------------------------------------------------------------------------ + */ + MYSQL_ERROR(8010, "operate database failed"), + + ZOOKEEPER_CONNECT_FAILED(8020, "zookeeper connect failed"), + ZOOKEEPER_READ_FAILED(8021, "zookeeper read failed"), + ZOOKEEPER_WRITE_FAILED(8022, "zookeeper write failed"), + ZOOKEEPER_DELETE_FAILED(8023, "zookeeper delete failed"), + + // 调用集群任务里面的agent失败 + CALL_CLUSTER_TASK_AGENT_FAILED(8030, " call cluster task agent failed"), + + // 调用监控系统失败 + CALL_MONITOR_SYSTEM_ERROR(8040, " call monitor-system failed"), + + // 存储相关的调用失败 + STORAGE_UPLOAD_FILE_FAILED(8050, "upload file failed"), + STORAGE_FILE_TYPE_NOT_SUPPORT(8051, "File type not support"), + STORAGE_DOWNLOAD_FILE_FAILED(8052, "download file failed"), + + ; + + private int code; + private String message; + + ResultStatus(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java new file mode 100644 index 00000000..c25ab28b --- /dev/null +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java @@ -0,0 +1,137 @@ +package com.xiaojukeji.kafka.manager.common.entity; + +import com.xiaojukeji.kafka.manager.common.constant.Constant; + +/** + * 返回状态 + * @author zengqiao + * @date 20/4/16 + */ +public enum ResultStatus { + GATEWAY_INVALID_REQUEST(-1, "invalid request"), + + SUCCESS(Constant.SUCCESS, "success"), + + FAIL(1, "操作失败"), + + /** + * 操作错误[1000, 2000) + * ------------------------------------------------------------------------------------------ + */ + OPERATION_FAILED(1401, "operation failed"), + OPERATION_FORBIDDEN(1402, "operation forbidden"), + API_CALL_EXCEED_LIMIT(1403, "api call exceed limit"), + USER_WITHOUT_AUTHORITY(1404, "user without authority"), + CHANGE_ZOOKEEPER_FORBIDDEN(1405, "change zookeeper forbidden"), + + + TOPIC_OPERATION_PARAM_NULL_POINTER(1450, "参数错误"), + TOPIC_OPERATION_PARTITION_NUM_ILLEGAL(1451, "分区数错误"), + TOPIC_OPERATION_BROKER_NUM_NOT_ENOUGH(1452, "Broker数不足错误"), + TOPIC_OPERATION_TOPIC_NAME_ILLEGAL(1453, "Topic名称非法"), + TOPIC_OPERATION_TOPIC_EXISTED(1454, "Topic已存在"), + TOPIC_OPERATION_UNKNOWN_TOPIC_PARTITION(1455, "Topic未知"), + TOPIC_OPERATION_TOPIC_CONFIG_ILLEGAL(1456, "Topic配置错误"), + TOPIC_OPERATION_TOPIC_IN_DELETING(1457, "Topic正在删除"), + TOPIC_OPERATION_UNKNOWN_ERROR(1458, "未知错误"), + + /** + * 参数错误[2000, 3000) + * ------------------------------------------------------------------------------------------ + */ + PARAM_ILLEGAL(2000, "param illegal"), + CG_LOCATION_ILLEGAL(2001, "consumer group location illegal"), + ORDER_ALREADY_HANDLED(2002, "order already handled"), + APP_ID_OR_PASSWORD_ILLEGAL(2003, "app or password illegal"), + SYSTEM_CODE_ILLEGAL(2004, "system code illegal"), + CLUSTER_TASK_HOST_LIST_ILLEGAL(2005, "主机列表错误,请检查主机列表"), + JSON_PARSER_ERROR(2006, "json parser error"), + + BROKER_NUM_NOT_ENOUGH(2050, "broker not enough"), + CONTROLLER_NOT_ALIVE(2051, "controller not alive"), + CLUSTER_METADATA_ERROR(2052, "cluster metadata error"), + TOPIC_CONFIG_ERROR(2053, "topic config error"), + + /** + * 参数错误 - 资源检查错误 + * 因为外部系统的问题, 操作时引起的错误, [7000, 8000) + * ------------------------------------------------------------------------------------------ + */ + RESOURCE_NOT_EXIST(7100, "资源不存在"), + CLUSTER_NOT_EXIST(7101, "cluster not exist"), + BROKER_NOT_EXIST(7102, "broker not exist"), + TOPIC_NOT_EXIST(7103, "topic not exist"), + PARTITION_NOT_EXIST(7104, "partition not exist"), + ACCOUNT_NOT_EXIST(7105, "account not exist"), + APP_NOT_EXIST(7106, "app not exist"), + ORDER_NOT_EXIST(7107, "order not exist"), + CONFIG_NOT_EXIST(7108, "config not exist"), + IDC_NOT_EXIST(7109, "idc not exist"), + TASK_NOT_EXIST(7110, "task not exist"), + AUTHORITY_NOT_EXIST(7111, "authority not exist"), + MONITOR_NOT_EXIST(7112, "monitor not exist"), + QUOTA_NOT_EXIST(7113, "quota not exist, please check clusterId, topicName and appId"), + CONSUMER_GROUP_NOT_EXIST(7114, "consumerGroup not exist"), + TOPIC_BIZ_DATA_NOT_EXIST(7115, "topic biz data not exist, please sync topic to db"), + LDAP_AUTHENTICATION_FAILED(7116, "LDAP authentication failed"), + + + // 资源已存在 + RESOURCE_ALREADY_EXISTED(7200, "资源已经存在"), + TOPIC_ALREADY_EXIST(7201, "topic already existed"), + + // 资源重名 + RESOURCE_NAME_DUPLICATED(7300, "资源名称重复"), + + // 资源已被使用 + RESOURCE_ALREADY_USED(7400, "资源早已被使用"), + + + /** + * 因为外部系统的问题, 操作时引起的错误, [8000, 9000) + * ------------------------------------------------------------------------------------------ + */ + MYSQL_ERROR(8010, "operate database failed"), + + ZOOKEEPER_CONNECT_FAILED(8020, "zookeeper connect failed"), + ZOOKEEPER_READ_FAILED(8021, "zookeeper read failed"), + ZOOKEEPER_WRITE_FAILED(8022, "zookeeper write failed"), + ZOOKEEPER_DELETE_FAILED(8023, "zookeeper delete failed"), + + // 调用集群任务里面的agent失败 + CALL_CLUSTER_TASK_AGENT_FAILED(8030, " call cluster task agent failed"), + + // 调用监控系统失败 + CALL_MONITOR_SYSTEM_ERROR(8040, " call monitor-system failed"), + + // 存储相关的调用失败 + STORAGE_UPLOAD_FILE_FAILED(8050, "upload file failed"), + STORAGE_FILE_TYPE_NOT_SUPPORT(8051, "File type not support"), + STORAGE_DOWNLOAD_FILE_FAILED(8052, "download file failed"), + + ; + + private int code; + private String message; + + ResultStatus(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java index 6406f1c3..723aaa75 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java @@ -1,5 +1,6 @@ package com.xiaojukeji.kafka.manager.common.utils.ldap; +import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -101,12 +102,9 @@ public class LDAPAuthentication { try { String userDN = getUserDN(account,ctx); - - if(StringUtils.isEmpty(userDN)){ + if(ValidateUtils.isBlank(userDN)){ return valide; } - - ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN); ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password); ctx.reconnect(null); diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java index c064ec3d..c67cca08 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java @@ -5,6 +5,7 @@ import com.xiaojukeji.kafka.manager.account.component.AbstractSingleSignOn; import com.xiaojukeji.kafka.manager.common.bizenum.AccountRoleEnum; import com.xiaojukeji.kafka.manager.common.constant.LoginConstant; import com.xiaojukeji.kafka.manager.common.entity.Result; +import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; import com.xiaojukeji.kafka.manager.common.entity.dto.normal.LoginDTO; import com.xiaojukeji.kafka.manager.common.entity.pojo.AccountDO; import com.xiaojukeji.kafka.manager.common.utils.EncryptUtil; @@ -54,7 +55,7 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { if(ldapEnabled){ //去LDAP验证账密 if(!ldapAuthentication.authenricate(dto.getUsername(),dto.getPassword())){ - return Result.buildFailure("LDAP authentication failed"); + return Result.buildFrom(ResultStatus.LDAP_AUTHENTICATION_FAILED); } if((ValidateUtils.isNull(accountResult) || ValidateUtils.isNull(accountResult.getData())) && authUserRegistration){ diff --git a/kafka-manager-web/src/main/resources/application.yml b/kafka-manager-web/src/main/resources/application.yml index 008cc048..89fca91c 100644 --- a/kafka-manager-web/src/main/resources/application.yml +++ b/kafka-manager-web/src/main/resources/application.yml @@ -89,6 +89,7 @@ ldap: url: ldap://127.0.0.1:389/ basedn: dc=tsign,dc=cn factory: com.sun.jndi.ldap.LdapCtxFactory + filter: sAMAccountName security: authentication: simple principal: cn=admin,dc=tsign,dc=cn From 0a067bce36b5e81d40780c0c96fc777e843ccf01 Mon Sep 17 00:00:00 2001 From: fanghanyun Date: Tue, 9 Mar 2021 10:19:08 +0800 Subject: [PATCH 20/55] Support AD LDAP --- .../xiaojukeji/kafka/manager/common/entity/ResultStatus.java | 2 +- .../xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java | 1 - .../kafka/manager/common/entity/vo/rd/ResultStatus.java | 2 -- .../kafka/manager/common/utils/ldap/LDAPAuthentication.java | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java index fd33cd9c..8f0f229b 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java @@ -73,7 +73,6 @@ public enum ResultStatus { QUOTA_NOT_EXIST(7113, "quota not exist, please check clusterId, topicName and appId"), CONSUMER_GROUP_NOT_EXIST(7114, "consumerGroup not exist"), TOPIC_BIZ_DATA_NOT_EXIST(7115, "topic biz data not exist, please sync topic to db"), - LDAP_AUTHENTICATION_FAILED(7116, "LDAP authentication failed"), // 资源已存在 RESOURCE_ALREADY_EXISTED(7200, "资源已经存在"), @@ -107,6 +106,7 @@ public enum ResultStatus { STORAGE_UPLOAD_FILE_FAILED(8050, "upload file failed"), STORAGE_FILE_TYPE_NOT_SUPPORT(8051, "File type not support"), STORAGE_DOWNLOAD_FILE_FAILED(8052, "download file failed"), + LDAP_AUTHENTICATION_FAILED(8053, "LDAP authentication failed"), ; diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java index c25ab28b..663dd0a6 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java @@ -73,7 +73,6 @@ public enum ResultStatus { QUOTA_NOT_EXIST(7113, "quota not exist, please check clusterId, topicName and appId"), CONSUMER_GROUP_NOT_EXIST(7114, "consumerGroup not exist"), TOPIC_BIZ_DATA_NOT_EXIST(7115, "topic biz data not exist, please sync topic to db"), - LDAP_AUTHENTICATION_FAILED(7116, "LDAP authentication failed"), // 资源已存在 diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java index c25ab28b..94acb56d 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java @@ -73,8 +73,6 @@ public enum ResultStatus { QUOTA_NOT_EXIST(7113, "quota not exist, please check clusterId, topicName and appId"), CONSUMER_GROUP_NOT_EXIST(7114, "consumerGroup not exist"), TOPIC_BIZ_DATA_NOT_EXIST(7115, "topic biz data not exist, please sync topic to db"), - LDAP_AUTHENTICATION_FAILED(7116, "LDAP authentication failed"), - // 资源已存在 RESOURCE_ALREADY_EXISTED(7200, "资源已经存在"), diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java index 723aaa75..eff3bc25 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java @@ -1,7 +1,6 @@ package com.xiaojukeji.kafka.manager.common.utils.ldap; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; -import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; From cb11e6437cc48a479c02c6ea05f63a41dfae9c30 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 9 Mar 2021 11:01:21 +0800 Subject: [PATCH 21/55] del ResultStatus in vo --- .../common/entity/vo/ResultStatus.java | 136 ------------------ .../common/entity/vo/rd/ResultStatus.java | 135 ----------------- 2 files changed, 271 deletions(-) delete mode 100644 kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java delete mode 100644 kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java deleted file mode 100644 index 663dd0a6..00000000 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/ResultStatus.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.xiaojukeji.kafka.manager.common.entity; - -import com.xiaojukeji.kafka.manager.common.constant.Constant; - -/** - * 返回状态 - * @author zengqiao - * @date 20/4/16 - */ -public enum ResultStatus { - GATEWAY_INVALID_REQUEST(-1, "invalid request"), - - SUCCESS(Constant.SUCCESS, "success"), - - FAIL(1, "操作失败"), - - /** - * 操作错误[1000, 2000) - * ------------------------------------------------------------------------------------------ - */ - OPERATION_FAILED(1401, "operation failed"), - OPERATION_FORBIDDEN(1402, "operation forbidden"), - API_CALL_EXCEED_LIMIT(1403, "api call exceed limit"), - USER_WITHOUT_AUTHORITY(1404, "user without authority"), - CHANGE_ZOOKEEPER_FORBIDDEN(1405, "change zookeeper forbidden"), - - - TOPIC_OPERATION_PARAM_NULL_POINTER(1450, "参数错误"), - TOPIC_OPERATION_PARTITION_NUM_ILLEGAL(1451, "分区数错误"), - TOPIC_OPERATION_BROKER_NUM_NOT_ENOUGH(1452, "Broker数不足错误"), - TOPIC_OPERATION_TOPIC_NAME_ILLEGAL(1453, "Topic名称非法"), - TOPIC_OPERATION_TOPIC_EXISTED(1454, "Topic已存在"), - TOPIC_OPERATION_UNKNOWN_TOPIC_PARTITION(1455, "Topic未知"), - TOPIC_OPERATION_TOPIC_CONFIG_ILLEGAL(1456, "Topic配置错误"), - TOPIC_OPERATION_TOPIC_IN_DELETING(1457, "Topic正在删除"), - TOPIC_OPERATION_UNKNOWN_ERROR(1458, "未知错误"), - - /** - * 参数错误[2000, 3000) - * ------------------------------------------------------------------------------------------ - */ - PARAM_ILLEGAL(2000, "param illegal"), - CG_LOCATION_ILLEGAL(2001, "consumer group location illegal"), - ORDER_ALREADY_HANDLED(2002, "order already handled"), - APP_ID_OR_PASSWORD_ILLEGAL(2003, "app or password illegal"), - SYSTEM_CODE_ILLEGAL(2004, "system code illegal"), - CLUSTER_TASK_HOST_LIST_ILLEGAL(2005, "主机列表错误,请检查主机列表"), - JSON_PARSER_ERROR(2006, "json parser error"), - - BROKER_NUM_NOT_ENOUGH(2050, "broker not enough"), - CONTROLLER_NOT_ALIVE(2051, "controller not alive"), - CLUSTER_METADATA_ERROR(2052, "cluster metadata error"), - TOPIC_CONFIG_ERROR(2053, "topic config error"), - - /** - * 参数错误 - 资源检查错误 - * 因为外部系统的问题, 操作时引起的错误, [7000, 8000) - * ------------------------------------------------------------------------------------------ - */ - RESOURCE_NOT_EXIST(7100, "资源不存在"), - CLUSTER_NOT_EXIST(7101, "cluster not exist"), - BROKER_NOT_EXIST(7102, "broker not exist"), - TOPIC_NOT_EXIST(7103, "topic not exist"), - PARTITION_NOT_EXIST(7104, "partition not exist"), - ACCOUNT_NOT_EXIST(7105, "account not exist"), - APP_NOT_EXIST(7106, "app not exist"), - ORDER_NOT_EXIST(7107, "order not exist"), - CONFIG_NOT_EXIST(7108, "config not exist"), - IDC_NOT_EXIST(7109, "idc not exist"), - TASK_NOT_EXIST(7110, "task not exist"), - AUTHORITY_NOT_EXIST(7111, "authority not exist"), - MONITOR_NOT_EXIST(7112, "monitor not exist"), - QUOTA_NOT_EXIST(7113, "quota not exist, please check clusterId, topicName and appId"), - CONSUMER_GROUP_NOT_EXIST(7114, "consumerGroup not exist"), - TOPIC_BIZ_DATA_NOT_EXIST(7115, "topic biz data not exist, please sync topic to db"), - - - // 资源已存在 - RESOURCE_ALREADY_EXISTED(7200, "资源已经存在"), - TOPIC_ALREADY_EXIST(7201, "topic already existed"), - - // 资源重名 - RESOURCE_NAME_DUPLICATED(7300, "资源名称重复"), - - // 资源已被使用 - RESOURCE_ALREADY_USED(7400, "资源早已被使用"), - - - /** - * 因为外部系统的问题, 操作时引起的错误, [8000, 9000) - * ------------------------------------------------------------------------------------------ - */ - MYSQL_ERROR(8010, "operate database failed"), - - ZOOKEEPER_CONNECT_FAILED(8020, "zookeeper connect failed"), - ZOOKEEPER_READ_FAILED(8021, "zookeeper read failed"), - ZOOKEEPER_WRITE_FAILED(8022, "zookeeper write failed"), - ZOOKEEPER_DELETE_FAILED(8023, "zookeeper delete failed"), - - // 调用集群任务里面的agent失败 - CALL_CLUSTER_TASK_AGENT_FAILED(8030, " call cluster task agent failed"), - - // 调用监控系统失败 - CALL_MONITOR_SYSTEM_ERROR(8040, " call monitor-system failed"), - - // 存储相关的调用失败 - STORAGE_UPLOAD_FILE_FAILED(8050, "upload file failed"), - STORAGE_FILE_TYPE_NOT_SUPPORT(8051, "File type not support"), - STORAGE_DOWNLOAD_FILE_FAILED(8052, "download file failed"), - - ; - - private int code; - private String message; - - ResultStatus(int code, String message) { - this.code = code; - this.message = message; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java deleted file mode 100644 index 94acb56d..00000000 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/ResultStatus.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.xiaojukeji.kafka.manager.common.entity; - -import com.xiaojukeji.kafka.manager.common.constant.Constant; - -/** - * 返回状态 - * @author zengqiao - * @date 20/4/16 - */ -public enum ResultStatus { - GATEWAY_INVALID_REQUEST(-1, "invalid request"), - - SUCCESS(Constant.SUCCESS, "success"), - - FAIL(1, "操作失败"), - - /** - * 操作错误[1000, 2000) - * ------------------------------------------------------------------------------------------ - */ - OPERATION_FAILED(1401, "operation failed"), - OPERATION_FORBIDDEN(1402, "operation forbidden"), - API_CALL_EXCEED_LIMIT(1403, "api call exceed limit"), - USER_WITHOUT_AUTHORITY(1404, "user without authority"), - CHANGE_ZOOKEEPER_FORBIDDEN(1405, "change zookeeper forbidden"), - - - TOPIC_OPERATION_PARAM_NULL_POINTER(1450, "参数错误"), - TOPIC_OPERATION_PARTITION_NUM_ILLEGAL(1451, "分区数错误"), - TOPIC_OPERATION_BROKER_NUM_NOT_ENOUGH(1452, "Broker数不足错误"), - TOPIC_OPERATION_TOPIC_NAME_ILLEGAL(1453, "Topic名称非法"), - TOPIC_OPERATION_TOPIC_EXISTED(1454, "Topic已存在"), - TOPIC_OPERATION_UNKNOWN_TOPIC_PARTITION(1455, "Topic未知"), - TOPIC_OPERATION_TOPIC_CONFIG_ILLEGAL(1456, "Topic配置错误"), - TOPIC_OPERATION_TOPIC_IN_DELETING(1457, "Topic正在删除"), - TOPIC_OPERATION_UNKNOWN_ERROR(1458, "未知错误"), - - /** - * 参数错误[2000, 3000) - * ------------------------------------------------------------------------------------------ - */ - PARAM_ILLEGAL(2000, "param illegal"), - CG_LOCATION_ILLEGAL(2001, "consumer group location illegal"), - ORDER_ALREADY_HANDLED(2002, "order already handled"), - APP_ID_OR_PASSWORD_ILLEGAL(2003, "app or password illegal"), - SYSTEM_CODE_ILLEGAL(2004, "system code illegal"), - CLUSTER_TASK_HOST_LIST_ILLEGAL(2005, "主机列表错误,请检查主机列表"), - JSON_PARSER_ERROR(2006, "json parser error"), - - BROKER_NUM_NOT_ENOUGH(2050, "broker not enough"), - CONTROLLER_NOT_ALIVE(2051, "controller not alive"), - CLUSTER_METADATA_ERROR(2052, "cluster metadata error"), - TOPIC_CONFIG_ERROR(2053, "topic config error"), - - /** - * 参数错误 - 资源检查错误 - * 因为外部系统的问题, 操作时引起的错误, [7000, 8000) - * ------------------------------------------------------------------------------------------ - */ - RESOURCE_NOT_EXIST(7100, "资源不存在"), - CLUSTER_NOT_EXIST(7101, "cluster not exist"), - BROKER_NOT_EXIST(7102, "broker not exist"), - TOPIC_NOT_EXIST(7103, "topic not exist"), - PARTITION_NOT_EXIST(7104, "partition not exist"), - ACCOUNT_NOT_EXIST(7105, "account not exist"), - APP_NOT_EXIST(7106, "app not exist"), - ORDER_NOT_EXIST(7107, "order not exist"), - CONFIG_NOT_EXIST(7108, "config not exist"), - IDC_NOT_EXIST(7109, "idc not exist"), - TASK_NOT_EXIST(7110, "task not exist"), - AUTHORITY_NOT_EXIST(7111, "authority not exist"), - MONITOR_NOT_EXIST(7112, "monitor not exist"), - QUOTA_NOT_EXIST(7113, "quota not exist, please check clusterId, topicName and appId"), - CONSUMER_GROUP_NOT_EXIST(7114, "consumerGroup not exist"), - TOPIC_BIZ_DATA_NOT_EXIST(7115, "topic biz data not exist, please sync topic to db"), - - // 资源已存在 - RESOURCE_ALREADY_EXISTED(7200, "资源已经存在"), - TOPIC_ALREADY_EXIST(7201, "topic already existed"), - - // 资源重名 - RESOURCE_NAME_DUPLICATED(7300, "资源名称重复"), - - // 资源已被使用 - RESOURCE_ALREADY_USED(7400, "资源早已被使用"), - - - /** - * 因为外部系统的问题, 操作时引起的错误, [8000, 9000) - * ------------------------------------------------------------------------------------------ - */ - MYSQL_ERROR(8010, "operate database failed"), - - ZOOKEEPER_CONNECT_FAILED(8020, "zookeeper connect failed"), - ZOOKEEPER_READ_FAILED(8021, "zookeeper read failed"), - ZOOKEEPER_WRITE_FAILED(8022, "zookeeper write failed"), - ZOOKEEPER_DELETE_FAILED(8023, "zookeeper delete failed"), - - // 调用集群任务里面的agent失败 - CALL_CLUSTER_TASK_AGENT_FAILED(8030, " call cluster task agent failed"), - - // 调用监控系统失败 - CALL_MONITOR_SYSTEM_ERROR(8040, " call monitor-system failed"), - - // 存储相关的调用失败 - STORAGE_UPLOAD_FILE_FAILED(8050, "upload file failed"), - STORAGE_FILE_TYPE_NOT_SUPPORT(8051, "File type not support"), - STORAGE_DOWNLOAD_FILE_FAILED(8052, "download file failed"), - - ; - - private int code; - private String message; - - ResultStatus(int code, String message) { - this.code = code; - this.message = message; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} From d5db028f57225a03da8c3e19f8c0415629f60e65 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 9 Mar 2021 15:13:55 +0800 Subject: [PATCH 22/55] optimize ldap --- .../manager/common/entity/ResultStatus.java | 2 +- .../component/ldap/LdapAuthentication.java | 74 ++++++++++--------- .../component/sso/BaseSessionSignOn.java | 37 ++-------- .../src/main/resources/application.yml | 23 +++--- 4 files changed, 56 insertions(+), 80 deletions(-) rename kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java => kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/ldap/LdapAuthentication.java (58%) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java index 8f0f229b..454a687f 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java @@ -106,7 +106,7 @@ public enum ResultStatus { STORAGE_UPLOAD_FILE_FAILED(8050, "upload file failed"), STORAGE_FILE_TYPE_NOT_SUPPORT(8051, "File type not support"), STORAGE_DOWNLOAD_FILE_FAILED(8052, "download file failed"), - LDAP_AUTHENTICATION_FAILED(8053, "LDAP authentication failed"), + LDAP_AUTHENTICATION_FAILED(8053, "ldap authentication failed"), ; diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/ldap/LdapAuthentication.java similarity index 58% rename from kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java rename to kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/ldap/LdapAuthentication.java index eff3bc25..f456c916 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/ldap/LDAPAuthentication.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/ldap/LdapAuthentication.java @@ -1,6 +1,8 @@ -package com.xiaojukeji.kafka.manager.common.utils.ldap; +package com.xiaojukeji.kafka.manager.account.component.ldap; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -15,33 +17,31 @@ import javax.naming.ldap.LdapContext; import java.util.Hashtable; @Component -public class LDAPAuthentication { +public class LdapAuthentication { + private static final Logger LOGGER = LoggerFactory.getLogger(LdapAuthentication.class); - @Value(value = "${ldap.url}") + @Value(value = "${account.ldap.url:}") private String ldapUrl; - @Value(value = "${ldap.basedn}") + @Value(value = "${account.ldap.basedn:}") private String ldapBasedn; - @Value(value = "${ldap.factory}") + @Value(value = "${account.ldap.factory:}") private String ldapFactory; - @Value(value = "${ldap.filter}") - private String ldapfilter; + @Value(value = "${account.ldap.filter:}") + private String ldapFilter; - @Value(value = "${ldap.auth-user-registration-role}") - private String authUserRegistrationRole; - - @Value(value = "${ldap.security.authentication}") + @Value(value = "${account.ldap.security.authentication:}") private String securityAuthentication; - @Value(value = "${ldap.security.principal}") + @Value(value = "${account.ldap.security.principal:}") private String securityPrincipal; - @Value(value = "${ldap.security.credentials}") + @Value(value = "${account.ldap.security.credentials:}") private String securityCredentials; - private LdapContext getConnect() { + private LdapContext getLdapContext() { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, ldapFactory); env.put(Context.PROVIDER_URL, ldapUrl + ldapBasedn); @@ -53,19 +53,19 @@ public class LDAPAuthentication { try { return new InitialLdapContext(env, null); } catch (AuthenticationException e) { - e.printStackTrace(); + LOGGER.warn("class=LdapAuthentication||method=getLdapContext||errMsg={}", e); } catch (Exception e) { - e.printStackTrace(); + LOGGER.error("class=LdapAuthentication||method=getLdapContext||errMsg={}", e); } return null; } - private String getUserDN(String account,LdapContext ctx) { + private String getUserDN(String account, LdapContext ctx) { String userDN = ""; try { SearchControls constraints = new SearchControls(); constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); - String filter = "(&(objectClass=*)("+ldapfilter+"=" + account + "))"; + String filter = "(&(objectClass=*)("+ldapFilter+"=" + account + "))"; NamingEnumeration en = ctx.search("", filter, constraints); if (en == null || !en.hasMoreElements()) { @@ -82,9 +82,8 @@ public class LDAPAuthentication { } } } catch (Exception e) { - e.printStackTrace(); + LOGGER.error("class=LdapAuthentication||method=getUserDN||account={}||errMsg={}", account, e); } - return userDN; } @@ -94,35 +93,38 @@ public class LDAPAuthentication { * @param password * @return */ - public boolean authenricate(String account, String password) { - LdapContext ctx = getConnect(); - - boolean valide = false; + public boolean authenticate(String account, String password) { + LdapContext ctx = getLdapContext(); + if (ValidateUtils.isNull(ctx)) { + return false; + } try { - String userDN = getUserDN(account,ctx); + String userDN = getUserDN(account, ctx); if(ValidateUtils.isBlank(userDN)){ - return valide; + return false; } + ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN); ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password); ctx.reconnect(null); - valide = true; - } catch (AuthenticationException e) { - System.out.println(e.toString()); + + return true; + } catch (AuthenticationException e) { + LOGGER.warn("class=LdapAuthentication||method=authenticate||account={}||errMsg={}", account, e); } catch (NamingException e) { - e.printStackTrace(); - }finally { - if(ctx!=null) { + LOGGER.warn("class=LdapAuthentication||method=authenticate||account={}||errMsg={}", account, e); + } catch (Exception e) { + LOGGER.error("class=LdapAuthentication||method=authenticate||account={}||errMsg={}", account, e); + } finally { + if(ctx != null) { try { ctx.close(); } catch (NamingException e) { - e.printStackTrace(); + LOGGER.error("class=LdapAuthentication||method=authenticate||account={}||errMsg={}", account, e); } } } - - return valide; + return false; } - } diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java index c67cca08..f3206255 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java @@ -2,7 +2,6 @@ package com.xiaojukeji.kafka.manager.account.component.sso; import com.xiaojukeji.kafka.manager.account.AccountService; import com.xiaojukeji.kafka.manager.account.component.AbstractSingleSignOn; -import com.xiaojukeji.kafka.manager.common.bizenum.AccountRoleEnum; import com.xiaojukeji.kafka.manager.common.constant.LoginConstant; import com.xiaojukeji.kafka.manager.common.entity.Result; import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; @@ -10,7 +9,7 @@ import com.xiaojukeji.kafka.manager.common.entity.dto.normal.LoginDTO; import com.xiaojukeji.kafka.manager.common.entity.pojo.AccountDO; import com.xiaojukeji.kafka.manager.common.utils.EncryptUtil; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; -import com.xiaojukeji.kafka.manager.common.utils.ldap.LDAPAuthentication; +import com.xiaojukeji.kafka.manager.account.component.ldap.LdapAuthentication; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -28,19 +27,11 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { private AccountService accountService; @Autowired - private LDAPAuthentication ldapAuthentication; + private LdapAuthentication ldapAuthentication; //是否开启ldap验证 - @Value(value = "${ldap.enabled}") - private boolean ldapEnabled; - - //ldap自动注册的默认角色。请注意:它通常来说都是低权限角色 - @Value(value = "${ldap.auth-user-registration-role}") - private String authUserRegistrationRole; - - //ldap自动注册是否开启 - @Value(value = "${ldap.auth-user-registration}") - private boolean authUserRegistration; + @Value(value = "${account.ldap.enabled:}") + private Boolean accountLdapEnabled; @Override public Result loginAndGetLdap(HttpServletRequest request, HttpServletResponse response, LoginDTO dto) { @@ -50,27 +41,15 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { Result accountResult = accountService.getAccountDO(dto.getUsername()); - //modifier limin - //判断是否激活了LDAP验证。若激活并且数据库无此用户则自动注册 - if(ldapEnabled){ + //判断是否激活了LDAP验证, 若激活则也可使用ldap进行认证 + if(!ValidateUtils.isNull(accountLdapEnabled) && accountLdapEnabled){ //去LDAP验证账密 - if(!ldapAuthentication.authenricate(dto.getUsername(),dto.getPassword())){ + if(!ldapAuthentication.authenticate(dto.getUsername(),dto.getPassword())){ return Result.buildFrom(ResultStatus.LDAP_AUTHENTICATION_FAILED); } - - if((ValidateUtils.isNull(accountResult) || ValidateUtils.isNull(accountResult.getData())) && authUserRegistration){ - //自动注册 - AccountDO accountDO = new AccountDO(); - accountDO.setUsername(dto.getUsername()); - accountDO.setRole(AccountRoleEnum.getUserRoleEnum(authUserRegistrationRole).getRole()); - accountDO.setPassword(EncryptUtil.md5(dto.getPassword())); - accountService.createAccount(accountDO); - } - return Result.buildSuc(dto.getUsername()); - } - + if (ValidateUtils.isNull(accountResult) || accountResult.failed()) { return new Result<>(accountResult.getCode(), accountResult.getMessage()); } diff --git a/kafka-manager-web/src/main/resources/application.yml b/kafka-manager-web/src/main/resources/application.yml index 89fca91c..9529dda1 100644 --- a/kafka-manager-web/src/main/resources/application.yml +++ b/kafka-manager-web/src/main/resources/application.yml @@ -11,7 +11,6 @@ spring: name: kafkamanager datasource: kafka-manager: - jdbc-url: jdbc:mysql://127.0.0.1:3306/logi_kafka_manager?characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 username: admin password: admin @@ -50,6 +49,15 @@ task: account: ldap: + enabled: false + url: ldap://127.0.0.1:389/ + basedn: dc=tsign,dc=cn + factory: com.sun.jndi.ldap.LdapCtxFactory + filter: sAMAccountName + security: + authentication: simple + principal: cn=admin,dc=tsign,dc=cn + credentials: admin kcm: enabled: false @@ -83,16 +91,3 @@ notify: topic-name: didi-kafka-notify order: detail-url: http://127.0.0.1 - -ldap: - enabled: false - url: ldap://127.0.0.1:389/ - basedn: dc=tsign,dc=cn - factory: com.sun.jndi.ldap.LdapCtxFactory - filter: sAMAccountName - security: - authentication: simple - principal: cn=admin,dc=tsign,dc=cn - credentials: admin - auth-user-registration-role: normal - auth-user-registration: true From 06d51dd0b8b74f2a4cbe2f3a29c18060ab5dea6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E8=B6=85?= Date: Tue, 9 Mar 2021 18:07:42 +0800 Subject: [PATCH 23/55] =?UTF-8?q?clipbord=E7=89=88=E6=9C=AC=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E5=9C=A82.0.6=EF=BC=8C=E5=8D=87=E7=BA=A72.0.7?= =?UTF-8?q?=E4=BC=9A=E5=BC=95=E8=B5=B7ts=E6=89=93=E5=8C=85=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kafka-manager-console/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kafka-manager-console/package.json b/kafka-manager-console/package.json index f06c4120..920fa613 100644 --- a/kafka-manager-console/package.json +++ b/kafka-manager-console/package.json @@ -1,6 +1,6 @@ { - "name": "mobx-ts-example", - "version": "1.0.0", + "name": "logi-kafka", + "version": "2.3.1", "description": "", "scripts": { "start": "webpack-dev-server", @@ -21,7 +21,7 @@ "@types/spark-md5": "^3.0.2", "antd": "^3.26.15", "clean-webpack-plugin": "^3.0.0", - "clipboard": "^2.0.6", + "clipboard": "2.0.6", "cross-env": "^7.0.2", "css-loader": "^2.1.0", "echarts": "^4.5.0", @@ -56,4 +56,4 @@ "dependencies": { "format-to-json": "^1.0.4" } -} +} \ No newline at end of file From 67c37a098414c44008936924de59fe1b9355c072 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Wed, 10 Mar 2021 13:52:09 +0800 Subject: [PATCH 24/55] optimize ldap --- .../component/sso/BaseSessionSignOn.java | 19 +++++++++++++++++++ .../src/main/resources/application.yml | 2 ++ 2 files changed, 21 insertions(+) diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java index f3206255..1ff36964 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/component/sso/BaseSessionSignOn.java @@ -2,6 +2,7 @@ package com.xiaojukeji.kafka.manager.account.component.sso; import com.xiaojukeji.kafka.manager.account.AccountService; import com.xiaojukeji.kafka.manager.account.component.AbstractSingleSignOn; +import com.xiaojukeji.kafka.manager.common.bizenum.AccountRoleEnum; import com.xiaojukeji.kafka.manager.common.constant.LoginConstant; import com.xiaojukeji.kafka.manager.common.entity.Result; import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; @@ -33,6 +34,14 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { @Value(value = "${account.ldap.enabled:}") private Boolean accountLdapEnabled; + //ldap自动注册的默认角色。请注意:它通常来说都是低权限角色 + @Value(value = "${account.ldap.auth-user-registration-role:}") + private String authUserRegistrationRole; + + //ldap自动注册是否开启 + @Value(value = "${account.ldap.auth-user-registration:}") + private boolean authUserRegistration; + @Override public Result loginAndGetLdap(HttpServletRequest request, HttpServletResponse response, LoginDTO dto) { if (ValidateUtils.isBlank(dto.getUsername()) || ValidateUtils.isNull(dto.getPassword())) { @@ -47,6 +56,16 @@ public class BaseSessionSignOn extends AbstractSingleSignOn { if(!ldapAuthentication.authenticate(dto.getUsername(),dto.getPassword())){ return Result.buildFrom(ResultStatus.LDAP_AUTHENTICATION_FAILED); } + + if((ValidateUtils.isNull(accountResult) || ValidateUtils.isNull(accountResult.getData())) && authUserRegistration){ + //自动注册 + AccountDO accountDO = new AccountDO(); + accountDO.setUsername(dto.getUsername()); + accountDO.setRole(AccountRoleEnum.getUserRoleEnum(authUserRegistrationRole).getRole()); + accountDO.setPassword(dto.getPassword()); + accountService.createAccount(accountDO); + } + return Result.buildSuc(dto.getUsername()); } diff --git a/kafka-manager-web/src/main/resources/application.yml b/kafka-manager-web/src/main/resources/application.yml index 9529dda1..1c6614e2 100644 --- a/kafka-manager-web/src/main/resources/application.yml +++ b/kafka-manager-web/src/main/resources/application.yml @@ -58,6 +58,8 @@ account: authentication: simple principal: cn=admin,dc=tsign,dc=cn credentials: admin + auth-user-registration: true + auth-user-registration-role: normal kcm: enabled: false From 2ecc877ba8073d6d5f8429732acae3c769b72499 Mon Sep 17 00:00:00 2001 From: EricZeng Date: Wed, 10 Mar 2021 15:45:48 +0800 Subject: [PATCH 25/55] fix add_cluster.md path fix add_cluster.md path --- docs/user_guide/faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user_guide/faq.md b/docs/user_guide/faq.md index f62ba59f..bb2dbf11 100644 --- a/docs/user_guide/faq.md +++ b/docs/user_guide/faq.md @@ -44,7 +44,7 @@ 逻辑集群的创建参看: -- [kafka-manager 接入集群](docs/user_guide/add_cluster/add_cluster.md) 手册,这里的Region和逻辑集群都必须添加。 +- [kafka-manager 接入集群](add_cluster/add_cluster.md) 手册,这里的Region和逻辑集群都必须添加。 --- From 2e26f8caa637d0cd40b13c66512f2e291ff941da Mon Sep 17 00:00:00 2001 From: zengqiao Date: Wed, 10 Mar 2021 19:23:29 +0800 Subject: [PATCH 26/55] add qa --- docs/user_guide/faq.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/user_guide/faq.md b/docs/user_guide/faq.md index bb2dbf11..ea1b66da 100644 --- a/docs/user_guide/faq.md +++ b/docs/user_guide/faq.md @@ -7,7 +7,7 @@ --- -# FAQ +# FAQ - 0、Github图裂问题解决 - 1、Topic申请、新建监控告警等操作时没有可选择的集群? @@ -19,6 +19,9 @@ - 7、`Jmx`连接失败如何解决? - 8、`topic biz data not exist`错误及处理方式 - 9、进程启动后,如何查看API文档 +- 10、如何创建告警组? +- 11、连接信息、耗时信息为什么没有数据? +- 12、逻辑集群申请审批通过之后为什么看不到逻辑集群? --- @@ -113,4 +116,21 @@ ### 9、进程启动后,如何查看API文档 -- 滴滴Logi-KafkaManager采用Swagger-API工具记录API文档。Swagger-API地址: [http://IP:PORT/swagger-ui.html#/](http://IP:PORT/swagger-ui.html#/) +- 滴滴Logi-KafkaManager采用Swagger-API工具记录API文档。Swagger-API地址: [http://IP:PORT/swagger-ui.html#/](http://IP:PORT/swagger-ui.html#/) + + +### 10、如何创建告警组? + +这块需要配合监控系统进行使用,现在默认已经实现了夜莺的对接,当然也可以对接自己内部的监控系统,不过需要实现一些接口。 + +具体的文档可见:[监控功能对接夜莺](../dev_guide/monitor_system_integrate_with_n9e.md)、[监控功能对接其他系统](../dev_guide/monitor_system_integrate_with_self.md) + +### 11、连接信息、耗时信息为什么没有数据? + +这块需要结合滴滴内部的kafka-gateway一同使用才会有数据,滴滴kafka-gateway暂未开源。 + +### 12、逻辑集群申请审批通过之后为什么看不到逻辑集群? + +逻辑集群的申请与审批仅仅只是一个工单流程,并不会去实际创建逻辑集群,逻辑集群的创建还需要手动去创建。 + +具体的操作可见:[kafka-manager 接入集群](add_cluster/add_cluster.md)。 From 03352142b66fb5b8ff819f170c7baf0c24d5f826 Mon Sep 17 00:00:00 2001 From: "mike.zhangliang" Date: Tue, 16 Mar 2021 14:46:38 +0800 Subject: [PATCH 27/55] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 微信加群方式补充 --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index aaa7e1d8..77729c25 100644 --- a/README.md +++ b/README.md @@ -67,11 +67,16 @@ - [滴滴Logi-KafkaManager 系列视频教程](https://mp.weixin.qq.com/s/9X7gH0tptHPtfjPPSdGO8g) - [kafka实践(十五):滴滴开源Kafka管控平台 Logi-KafkaManager研究--A叶子叶来](https://blog.csdn.net/yezonggang/article/details/113106244) -## 3 滴滴Logi开源用户钉钉交流群 +## 3 滴滴Logi开源用户交流群 + + +![image](https://user-images.githubusercontent.com/5287750/111266722-e531d800-8665-11eb-9242-3484da5a3099.png) +微信加群:关注公众号 Obsuite(官方公众号) 回复 "Logi加群" ![dingding_group](./docs/assets/images/common/dingding_group.jpg) - 钉钉群ID:32821440 - +钉钉群ID:32821440 + + ## 4 OCE认证 OCE是一个认证机制和交流平台,为滴滴Logi-KafkaManager生产用户量身打造,我们会为OCE企业提供更好的技术支持,比如专属的技术沙龙、企业一对一的交流机会、专属的答疑群等,如果贵司Logi-KafkaManager上了生产,[快来加入吧](http://obsuite.didiyun.com/open/openAuth) From 89d277219449f4583dddf3d35789c9231dd6d41a Mon Sep 17 00:00:00 2001 From: zengqiao Date: Mon, 22 Mar 2021 13:38:23 +0800 Subject: [PATCH 28/55] add faq, kafka version supported & apply logical cluster and how to handle it --- docs/user_guide/faq.md | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/docs/user_guide/faq.md b/docs/user_guide/faq.md index f62ba59f..b0866a14 100644 --- a/docs/user_guide/faq.md +++ b/docs/user_guide/faq.md @@ -9,7 +9,7 @@ # FAQ -- 0、Github图裂问题解决 +- 0、支持哪些Kafka版本? - 1、Topic申请、新建监控告警等操作时没有可选择的集群? - 2、逻辑集群 & Region的用途? - 3、登录失败? @@ -17,24 +17,15 @@ - 5、如何对接夜莺的监控告警功能? - 6、如何使用`MySQL 8`? - 7、`Jmx`连接失败如何解决? -- 8、`topic biz data not exist`错误及处理方式 -- 9、进程启动后,如何查看API文档 +- 8、`topic biz data not exist`错误及处理方式? +- 9、进程启动后,如何查看API文档? +- 10、集群申请审批通过之后,为什么还是看不到集群? --- -### 0、Github图裂问题解决 +### 0、支持哪些Kafka版本? -可以在本地机器`ping github.com`这个地址,获取到`github.com`地址的IP地址。 - -然后将IP绑定到`/etc/hosts`文件中。 - -例如 - -```shell -# 在 /etc/hosts文件中增加如下信息 - -140.82.113.3 github.com -``` +基本上只要所使用的Kafka还依赖于Zookeeper,那么该版本的主要功能基本上应该就是支持的。 --- @@ -111,6 +102,18 @@ 以上仅仅只是针对单个Topic的场景,如果你有非常多的Topic需要进行初始化的,那么此时可以在配置管理中增加一个配置,来定时的对无主的Topic进行同步,具体见:[动态配置管理 - 1、Topic定时同步任务](../dev_guide/dynamic_config_manager.md) +--- + ### 9、进程启动后,如何查看API文档 - 滴滴Logi-KafkaManager采用Swagger-API工具记录API文档。Swagger-API地址: [http://IP:PORT/swagger-ui.html#/](http://IP:PORT/swagger-ui.html#/) + +--- + +### 10、集群申请审批通过之后,为什么还是看不到集群? + +集群申请,审批通过,那块的通过只是将工单的状态修改为通过。实际集群的分配搭建等,还需要运维去手动操作。 + +Logi-KM整体设计上,用户侧看到的是逻辑集群,管控侧看到的是物理集群,因此这里的手动操作,是需要创建一个逻辑集群。 + +逻辑集群的创建,具体可以看README里面的用户文档。 From 999a2bd92935b5272f07278775136378ac17bf34 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Mon, 22 Mar 2021 17:21:12 +0800 Subject: [PATCH 29/55] fix monitor enable time illegal bug --- .../monitor/component/n9e/N9eConverter.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/kafka-manager-extends/kafka-manager-monitor/src/main/java/com/xiaojukeji/kafka/manager/monitor/component/n9e/N9eConverter.java b/kafka-manager-extends/kafka-manager-monitor/src/main/java/com/xiaojukeji/kafka/manager/monitor/component/n9e/N9eConverter.java index c69ae906..c65d9e93 100644 --- a/kafka-manager-extends/kafka-manager-monitor/src/main/java/com/xiaojukeji/kafka/manager/monitor/component/n9e/N9eConverter.java +++ b/kafka-manager-extends/kafka-manager-monitor/src/main/java/com/xiaojukeji/kafka/manager/monitor/component/n9e/N9eConverter.java @@ -5,6 +5,8 @@ import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.monitor.common.entry.*; import com.xiaojukeji.kafka.manager.monitor.component.n9e.entry.*; import com.xiaojukeji.kafka.manager.monitor.component.n9e.entry.bizenum.CategoryEnum; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.*; @@ -13,6 +15,8 @@ import java.util.*; * @date 20/8/26 */ public class N9eConverter { + private static final Logger LOGGER = LoggerFactory.getLogger(N9eConverter.class); + public static List convert2N9eMetricSinkPointList(String nid, List pointList) { if (pointList == null || pointList.isEmpty()) { return new ArrayList<>(); @@ -98,8 +102,8 @@ public class N9eConverter { n9eStrategy.setNotify_user(new ArrayList<>()); n9eStrategy.setCallback(strategyAction.getCallback()); - n9eStrategy.setEnable_stime("00:00"); - n9eStrategy.setEnable_etime("23:59"); + n9eStrategy.setEnable_stime(String.format("%02d:00", ListUtils.string2IntList(strategy.getPeriodHoursOfDay()).stream().distinct().min((e1, e2) -> e1.compareTo(e2)).get())); + n9eStrategy.setEnable_etime(String.format("%02d:59", ListUtils.string2IntList(strategy.getPeriodHoursOfDay()).stream().distinct().max((e1, e2) -> e1.compareTo(e2)).get())); n9eStrategy.setEnable_days_of_week(ListUtils.string2IntList(strategy.getPeriodDaysOfWeek())); n9eStrategy.setNeed_upgrade(0); @@ -120,6 +124,15 @@ public class N9eConverter { return strategyList; } + private static Integer getEnableHour(String enableTime) { + try { + return Integer.valueOf(enableTime.split(":")[0]); + } catch (Exception e) { + LOGGER.warn("class=N9eConverter||method=getEnableHour||enableTime={}||errMsg={}", enableTime, e.getMessage()); + } + return null; + } + public static Strategy convert2Strategy(N9eStrategy n9eStrategy, Map notifyGroupMap) { if (n9eStrategy == null) { return null; @@ -137,7 +150,16 @@ public class N9eConverter { strategy.setId(n9eStrategy.getId().longValue()); strategy.setName(n9eStrategy.getName()); strategy.setPriority(n9eStrategy.getPriority()); - strategy.setPeriodHoursOfDay("0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23"); + + List hourList = new ArrayList<>(); + Integer startHour = N9eConverter.getEnableHour(n9eStrategy.getEnable_stime()); + Integer endHour = N9eConverter.getEnableHour(n9eStrategy.getEnable_etime()); + if (!(ValidateUtils.isNullOrLessThanZero(startHour) || ValidateUtils.isNullOrLessThanZero(endHour) || endHour < startHour)) { + for (Integer hour = startHour; hour <= endHour; ++hour) { + hourList.add(hour); + } + } + strategy.setPeriodHoursOfDay(ListUtils.intList2String(hourList)); strategy.setPeriodDaysOfWeek(ListUtils.intList2String(n9eStrategy.getEnable_days_of_week())); List strategyExpressionList = new ArrayList<>(); From ed13e0d2c26b1c1231696901c8d98dc86644349a Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 23 Mar 2021 15:21:48 +0800 Subject: [PATCH 30/55] add expert config desc --- docs/dev_guide/dynamic_config_manager.md | 57 ++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/docs/dev_guide/dynamic_config_manager.md b/docs/dev_guide/dynamic_config_manager.md index 4e5d6528..0965cb48 100644 --- a/docs/dev_guide/dynamic_config_manager.md +++ b/docs/dev_guide/dynamic_config_manager.md @@ -9,6 +9,13 @@ # 动态配置管理 +## 0、目录 + +- 1、Topic定时同步任务 +- 2、专家服务——Topic分区热点 +- 3、专家服务——Topic分区不足 + + ## 1、Topic定时同步任务 ### 1.1、配置的用途 @@ -63,3 +70,53 @@ task: ] ``` +--- + +## 2、专家服务——Topic分区热点 + +在`Region`所圈定的Broker范围内,某个Topic的Leader数在这些圈定的Broker上分布不均衡时,我们认为该Topic是存在热点的Topic。 + +备注:单纯的查看Leader数的分布,确实存在一定的局限性,这块欢迎贡献更多的热点定义于代码。 + + +Topic分区热点相关的动态配置(页面在运维管控->平台管理->配置管理): + +配置Key: +``` +REGION_HOT_TOPIC_CONFIG +``` + +配置Value: +```json +{ + "maxDisPartitionNum": 2, # Region内Broker间的leader数差距超过2时,则认为是存在热点的Topic + "minTopicBytesInUnitB": 1048576, # 流量低于该值的Topic不做统计 + "ignoreClusterIdList": [ # 忽略的集群 + 50 + ] +} +``` + +--- + +## 3、专家服务——Topic分区不足 + +总流量除以分区数,超过指定值时,则我们认为存在Topic分区不足。 + +Topic分区不足相关的动态配置(页面在运维管控->平台管理->配置管理): + +配置Key: +``` +TOPIC_INSUFFICIENT_PARTITION_CONFIG +``` + +配置Value: +```json +{ + "maxBytesInPerPartitionUnitB": 3145728, # 单分区流量超过该值, 则认为分区不去 + "minTopicBytesInUnitB": 1048576, # 流量低于该值的Topic不做统计 + "ignoreClusterIdList": [ # 忽略的集群 + 50 + ] +} +``` \ No newline at end of file From eebf1b89b1955befb67cea5d823220d78e1a6b37 Mon Sep 17 00:00:00 2001 From: zhangfenhua Date: Mon, 29 Mar 2021 11:53:50 +0800 Subject: [PATCH 31/55] =?UTF-8?q?nginx=E9=85=8D=E7=BD=AE=E6=89=8B=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/install_guide/install_guide_nginx_cn.md | 94 ++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 docs/install_guide/install_guide_nginx_cn.md diff --git a/docs/install_guide/install_guide_nginx_cn.md b/docs/install_guide/install_guide_nginx_cn.md new file mode 100644 index 00000000..ad55f947 --- /dev/null +++ b/docs/install_guide/install_guide_nginx_cn.md @@ -0,0 +1,94 @@ +--- + +![kafka-manager-logo](../assets/images/common/logo_name.png) + +**一站式`Apache Kafka`集群指标监控与运维管控平台** + +--- + +## nginx配置-安装手册 + +# 一、独立部署 + +请参考参考:[kafka-manager 安装手册](install_guide_cn.md) + +# 二、nginx配置 + +## 1、独立部署配置 + +``` + #nginx 根目录访问配置如下 + location / { + proxy_pass http://ip:port; + } +``` + +## 2、前后端分离&配置多个静态资源 + +以下配置解决`nginx代理多个静态资源`,实现项目前后端分离,版本更新迭代。 + +### 1、源码下载 + +根据所需版本下载对应代码,下载地址:[Github 下载地址](https://github.com/didi/Logi-KafkaManager) + +### 2、修改webpack.config.js 配置文件 + +修改`kafka-manager-console`模块 `webpack.config.js` +以下所有xxxx为nginx代理路径和打包静态文件加载前缀,xxxx可根据需求自行更改。 + +``` + cd kafka-manager-console + vi webpack.config.js + + # publicPath默认打包方式根目录下,修改为nginx代理访问路径。 + let publicPath = '/xxxx'; +``` + +### 3、打包 + +``` + + npm cache clean --force && npm install + +``` + +ps:如果打包过程中报错,运行`npm install clipboard@2.0.6`,相反请忽略! + +### 4、部署 + +#### 1、前段静态文件部署 + +静态资源 `../kafka-manager-web/src/main/resources/templates` + +上传到指定目录,目前以`root目录`做demo + +#### 2、上传jar包并启动,请参考:[kafka-manager 安装手册](install_guide_cn.md) + +#### 3、修改nginx 配置 + +``` + location /xxxx { + # 静态文件存放位置 + alias /root/templates; + try_files $uri $uri/ /xxxx/index.html; + index index.html; + } + + location /api { + proxy_pass http://ip:port; + } + #后代端口建议使用/api,如果冲突可以使用以下配置 + #location /api/v2 { + # proxy_pass http://ip:port; + #} + #location /api/v1 { + # proxy_pass http://ip:port; + #} +``` + + + + + + + From 648af61116cc9f3de71cbc48791db3c36533ca18 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Mon, 29 Mar 2021 21:21:23 +0800 Subject: [PATCH 32/55] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E7=94=B1=E6=8E=A5=E5=8F=A3=E9=BB=91=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E8=BD=AC=E6=88=90=E6=8E=A5=E5=8F=A3=E7=99=BD=E5=90=8D?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kafka/manager/common/constant/ApiPrefix.java | 5 ++--- .../manager/account/impl/LoginServiceImpl.java | 14 +++++++------- .../kafka/manager/web/api/HealthController.java | 5 +++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java index 3690514f..a6784204 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java @@ -7,8 +7,8 @@ package com.xiaojukeji.kafka.manager.common.constant; */ public class ApiPrefix { public static final String API_PREFIX = "/api/"; - public static final String API_V1_PREFIX = API_PREFIX + "v1/"; - public static final String API_V2_PREFIX = API_PREFIX + "v2/"; + private static final String API_V1_PREFIX = API_PREFIX + "v1/"; + private static final String API_V2_PREFIX = API_PREFIX + "v2/"; // console public static final String API_V1_SSO_PREFIX = API_V1_PREFIX + "sso/"; @@ -18,7 +18,6 @@ public class ApiPrefix { // open public static final String API_V1_THIRD_PART_PREFIX = API_V1_PREFIX + "third-part/"; - public static final String API_V2_THIRD_PART_PREFIX = API_V2_PREFIX + "third-part/"; // gateway public static final String GATEWAY_API_V1_PREFIX = "/gateway" + API_V1_PREFIX; diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java index 591768fb..b168b754 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java @@ -64,16 +64,16 @@ public class LoginServiceImpl implements LoginService { @Override public boolean checkLogin(HttpServletRequest request, HttpServletResponse response) { - String uri = request.getRequestURI(); - if (uri.contains("..")) { - LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal||uri={}", uri); + String uri = request.getRequestURI().replace("//", "/"); + if (uri.contains("/../") || uri.contains("/./")) { + LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal, contains /../ or /./||uri={}", uri); return false; } - if (!(uri.contains(ApiPrefix.API_V1_NORMAL_PREFIX) - || uri.contains(ApiPrefix.API_V1_RD_PREFIX) - || uri.contains(ApiPrefix.API_V1_OP_PREFIX))) { - // 白名单接口, 直接忽略登录 + if (uri.startsWith(ApiPrefix.API_V1_SSO_PREFIX) + || uri.startsWith(ApiPrefix.API_V1_THIRD_PART_PREFIX) + || uri.startsWith(ApiPrefix.GATEWAY_API_V1_PREFIX)) { + // 白名单接口直接true return true; } diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/HealthController.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/HealthController.java index c632eb0a..cc9a9732 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/HealthController.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/HealthController.java @@ -1,5 +1,6 @@ package com.xiaojukeji.kafka.manager.web.api; +import com.xiaojukeji.kafka.manager.common.constant.ApiPrefix; import com.xiaojukeji.kafka.manager.common.entity.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -14,9 +15,9 @@ import springfox.documentation.annotations.ApiIgnore; * @date 20/6/18 */ @ApiIgnore -@Api(description = "web应用探活接口(REST)") +@Api(tags = "web应用探活接口(REST)") @RestController -@RequestMapping("api/") +@RequestMapping(ApiPrefix.API_V1_THIRD_PART_PREFIX) public class HealthController { @ApiIgnore From 9e7450c012c9ab8eb86e8c76b290d833f5451a5b Mon Sep 17 00:00:00 2001 From: zengqiao Date: Wed, 31 Mar 2021 19:45:18 +0800 Subject: [PATCH 33/55] =?UTF-8?q?=E6=8B=92=E7=BB=9D=E5=8C=85=E5=90=AB./?= =?UTF-8?q?=E6=88=96/=E8=BF=9E=E7=BB=AD=E8=BF=87=E5=A4=9A=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kafka/manager/account/impl/LoginServiceImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java index b168b754..91af67b3 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java @@ -64,11 +64,13 @@ public class LoginServiceImpl implements LoginService { @Override public boolean checkLogin(HttpServletRequest request, HttpServletResponse response) { - String uri = request.getRequestURI().replace("//", "/"); - if (uri.contains("/../") || uri.contains("/./")) { - LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal, contains /../ or /./||uri={}", uri); + String uri = request.getRequestURI(); + if (uri.contains("./") || uri.contains("///")) { + LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal, contains ../ or ./ or ///||uri={}", uri); + singleSignOn.setRedirectToLoginPage(response); return false; } + uri = uri.replaceAll("//", "/"); if (uri.startsWith(ApiPrefix.API_V1_SSO_PREFIX) || uri.startsWith(ApiPrefix.API_V1_THIRD_PART_PREFIX) From 1059b7376b5e5562fea26dd7cfb2e4a21469185a Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 6 Apr 2021 10:01:29 +0800 Subject: [PATCH 34/55] forbiden request when uri contain .. --- .../kafka/manager/account/impl/LoginServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java index 91af67b3..92ccce58 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java @@ -65,8 +65,8 @@ public class LoginServiceImpl implements LoginService { @Override public boolean checkLogin(HttpServletRequest request, HttpServletResponse response) { String uri = request.getRequestURI(); - if (uri.contains("./") || uri.contains("///")) { - LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal, contains ../ or ./ or ///||uri={}", uri); + if (uri.contains("..") || uri.contains("./") || uri.contains("///")) { + LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal, contains .. or ./ or ///||uri={}", uri); singleSignOn.setRedirectToLoginPage(response); return false; } From b9bb1c775dd093e1ad8cf77178bd758eb9b55469 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 6 Apr 2021 10:26:21 +0800 Subject: [PATCH 35/55] change uri filter rule --- .../kafka/manager/common/constant/ApiPrefix.java | 7 +++++-- .../kafka/manager/account/impl/LoginServiceImpl.java | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java index a6784204..f193f39d 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java @@ -8,10 +8,13 @@ package com.xiaojukeji.kafka.manager.common.constant; public class ApiPrefix { public static final String API_PREFIX = "/api/"; private static final String API_V1_PREFIX = API_PREFIX + "v1/"; - private static final String API_V2_PREFIX = API_PREFIX + "v2/"; + + // login + public static final String API_V1_SSO_PREFIX = API_V1_PREFIX + "sso/"; + public static final String API_V1_SSO_LOGIN = API_V1_SSO_PREFIX + "login"; + public static final String API_V1_SSO_LOGOUT = API_V1_SSO_PREFIX + "logout"; // console - public static final String API_V1_SSO_PREFIX = API_V1_PREFIX + "sso/"; public static final String API_V1_NORMAL_PREFIX = API_V1_PREFIX + "normal/"; public static final String API_V1_RD_PREFIX = API_V1_PREFIX + "rd/"; public static final String API_V1_OP_PREFIX = API_V1_PREFIX + "op/"; diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java index 92ccce58..e0919f54 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java @@ -72,7 +72,8 @@ public class LoginServiceImpl implements LoginService { } uri = uri.replaceAll("//", "/"); - if (uri.startsWith(ApiPrefix.API_V1_SSO_PREFIX) + if (uri.equals(ApiPrefix.API_V1_SSO_LOGIN) + || uri.equals(ApiPrefix.API_V1_SSO_LOGOUT) || uri.startsWith(ApiPrefix.API_V1_THIRD_PART_PREFIX) || uri.startsWith(ApiPrefix.GATEWAY_API_V1_PREFIX)) { // 白名单接口直接true From 5f1a839620b52a5e2afd1a4fb6fa6184a7cf6924 Mon Sep 17 00:00:00 2001 From: shirenchuang Date: Tue, 6 Apr 2021 12:09:52 +0800 Subject: [PATCH 36/55] =?UTF-8?q?=E5=8D=87=E7=BA=A7mysql=E9=A9=B1=E5=8A=A8?= =?UTF-8?q?=EF=BC=9B=E6=94=AF=E6=8C=81Mysql=208.0+?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kafka-manager-web/src/main/resources/application.yml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kafka-manager-web/src/main/resources/application.yml b/kafka-manager-web/src/main/resources/application.yml index 1c6614e2..58ad509f 100644 --- a/kafka-manager-web/src/main/resources/application.yml +++ b/kafka-manager-web/src/main/resources/application.yml @@ -14,7 +14,7 @@ spring: jdbc-url: jdbc:mysql://127.0.0.1:3306/logi_kafka_manager?characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 username: admin password: admin - driver-class-name: com.mysql.jdbc.Driver + driver-class-name: com.mysql.cj.jdbc.Driver main: allow-bean-definition-overriding: true diff --git a/pom.xml b/pom.xml index d4165a85..6c9d117f 100644 --- a/pom.xml +++ b/pom.xml @@ -180,7 +180,7 @@ mysql mysql-connector-java - 5.1.41 + 8.0.11 From 0f4082031522f04f3cac793d27a21c032e28c874 Mon Sep 17 00:00:00 2001 From: zwOvO <9742263582@qq.com> Date: Fri, 9 Apr 2021 11:41:06 +0800 Subject: [PATCH 37/55] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8impor?= =?UTF-8?q?t=E3=80=81=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kafka/manager/service/service/ClusterService.java | 1 - .../kafka/manager/service/service/RegionService.java | 1 - .../kafka/manager/service/service/impl/AdminServiceImpl.java | 4 ---- .../manager/service/service/impl/ConsumerServiceImpl.java | 1 - .../web/api/versionone/normal/NormalAccountController.java | 3 +-- .../api/versionone/thirdpart/ThirdPartClusterController.java | 3 +-- 6 files changed, 2 insertions(+), 11 deletions(-) diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ClusterService.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ClusterService.java index 2feb321b..35c4be8d 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ClusterService.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/ClusterService.java @@ -4,7 +4,6 @@ import com.xiaojukeji.kafka.manager.common.entity.Result; import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; import com.xiaojukeji.kafka.manager.common.entity.ao.ClusterDetailDTO; import com.xiaojukeji.kafka.manager.common.entity.ao.cluster.ControllerPreferredCandidate; -import com.xiaojukeji.kafka.manager.common.entity.dto.op.ControllerPreferredCandidateDTO; import com.xiaojukeji.kafka.manager.common.entity.vo.normal.cluster.ClusterNameDTO; import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO; import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterMetricsDO; diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/RegionService.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/RegionService.java index 8ab072fe..40c92a5c 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/RegionService.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/RegionService.java @@ -1,7 +1,6 @@ package com.xiaojukeji.kafka.manager.service.service; import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; -import com.xiaojukeji.kafka.manager.common.entity.dto.rd.RegionDTO; import com.xiaojukeji.kafka.manager.common.entity.pojo.RegionDO; import java.util.List; diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/AdminServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/AdminServiceImpl.java index b49e41a3..26d7ef4d 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/AdminServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/AdminServiceImpl.java @@ -340,10 +340,6 @@ public class AdminServiceImpl implements AdminService { @Override public ResultStatus modifyTopicConfig(ClusterDO clusterDO, String topicName, Properties properties, String operator) { ResultStatus rs = TopicCommands.modifyTopicConfig(clusterDO, topicName, properties); - if (!ResultStatus.SUCCESS.equals(rs)) { - return rs; - } - return rs; } } diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ConsumerServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ConsumerServiceImpl.java index 0d60d828..913316ef 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ConsumerServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/ConsumerServiceImpl.java @@ -8,7 +8,6 @@ import com.xiaojukeji.kafka.manager.common.entity.ao.consumer.ConsumeDetailDTO; import com.xiaojukeji.kafka.manager.common.entity.ao.consumer.ConsumerGroup; import com.xiaojukeji.kafka.manager.common.entity.ao.consumer.ConsumerGroupSummary; import com.xiaojukeji.kafka.manager.common.entity.pojo.ClusterDO; -import com.xiaojukeji.kafka.manager.common.utils.ListUtils; import com.xiaojukeji.kafka.manager.common.zookeeper.znode.brokers.TopicMetadata; import com.xiaojukeji.kafka.manager.common.entity.ao.PartitionOffsetDTO; import com.xiaojukeji.kafka.manager.common.exception.ConfigException; diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/normal/NormalAccountController.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/normal/NormalAccountController.java index 9b35ec87..455bd460 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/normal/NormalAccountController.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/normal/NormalAccountController.java @@ -9,7 +9,6 @@ import com.xiaojukeji.kafka.manager.common.entity.vo.common.AccountSummaryVO; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.common.utils.SpringTool; import com.xiaojukeji.kafka.manager.common.constant.ApiPrefix; -import com.xiaojukeji.kafka.manager.web.api.versionone.gateway.GatewayHeartbeatController; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; @@ -62,4 +61,4 @@ public class NormalAccountController { AccountRoleEnum accountRoleEnum = accountService.getAccountRoleFromCache(username); return new Result<>(new AccountRoleVO(username, accountRoleEnum.getRole())); } -} \ No newline at end of file +} diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/thirdpart/ThirdPartClusterController.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/thirdpart/ThirdPartClusterController.java index e379256f..58c4f1b0 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/thirdpart/ThirdPartClusterController.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/api/versionone/thirdpart/ThirdPartClusterController.java @@ -7,7 +7,6 @@ import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; import com.xiaojukeji.kafka.manager.common.entity.metrics.BrokerMetrics; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.common.zookeeper.znode.brokers.BrokerMetadata; -import com.xiaojukeji.kafka.manager.openapi.common.vo.ThirdPartBrokerOverviewVO; import com.xiaojukeji.kafka.manager.service.cache.PhysicalClusterMetadataManager; import com.xiaojukeji.kafka.manager.service.service.BrokerService; import io.swagger.annotations.Api; @@ -52,4 +51,4 @@ public class ThirdPartClusterController { return new Result<>(underReplicated.equals(0)); } -} \ No newline at end of file +} From 8f10624073a573c59a1312ebe30feb7f2e2effc1 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Mon, 12 Apr 2021 17:58:24 +0800 Subject: [PATCH 38/55] add jmx prometheus jar --- .../jmx_prometheus_javaagent-0.14.0.jar | Bin 0 -> 413862 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 container/dockerfiles/docker-depends/jmx_prometheus_javaagent-0.14.0.jar diff --git a/container/dockerfiles/docker-depends/jmx_prometheus_javaagent-0.14.0.jar b/container/dockerfiles/docker-depends/jmx_prometheus_javaagent-0.14.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..54b633bfb78d09b4bb70255195be47e8bc770c76 GIT binary patch literal 413862 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

    Z4yy9Sc8T?N38RV4)YjSxI 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≫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 Date: Wed, 14 Apr 2021 12:29:59 +0800 Subject: [PATCH 39/55] =?UTF-8?q?=E5=BA=94=E7=94=A8=E4=B8=8B=E7=BA=BF?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kafka/manager/bpm/order/impl/DeleteAppOrder.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java index 44aa9a0e..92173945 100644 --- a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java +++ b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java @@ -23,6 +23,7 @@ import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * @author zhongyuankai @@ -94,7 +95,11 @@ public class DeleteAppOrder extends AbstractAppOrder { } // 判断app是否对topic有权限 List authorityList = authorityService.getAuthority(orderAppExtension.getAppId()); - if (!ValidateUtils.isEmptyList(authorityList)) { + // 过滤权限列表中access=0的 + List newAuthorityList = authorityList.stream() + .filter(authorityDO -> authorityDO.getAccess() != 0) + .collect(Collectors.toList()); + if (!ValidateUtils.isEmptyList(newAuthorityList)) { return ResultStatus.OPERATION_FORBIDDEN; } if (appService.deleteApp(appDO, userName) > 0) { From 2a57c260cc2c9a878ce9a58841cbdb2d1191777d Mon Sep 17 00:00:00 2001 From: zengqiao Date: Wed, 14 Apr 2021 19:40:19 +0800 Subject: [PATCH 40/55] =?UTF-8?q?=E9=80=9A=E8=BF=87=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=B1=BB=E7=9A=84RequestMapping=E6=B3=A8=E8=A7=A3=E6=9D=A5?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=BD=93=E5=89=8D=E8=AF=B7=E6=B1=82=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E9=9C=80=E8=A6=81=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/common/constant/ApiPrefix.java | 2 -- .../kafka/manager/account/LoginService.java | 2 +- .../account/impl/LoginServiceImpl.java | 15 ++++---- .../web/inteceptor/PermissionInterceptor.java | 34 ++++++++++++++++++- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java index f193f39d..b90918eb 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java @@ -11,8 +11,6 @@ public class ApiPrefix { // login public static final String API_V1_SSO_PREFIX = API_V1_PREFIX + "sso/"; - public static final String API_V1_SSO_LOGIN = API_V1_SSO_PREFIX + "login"; - public static final String API_V1_SSO_LOGOUT = API_V1_SSO_PREFIX + "logout"; // console public static final String API_V1_NORMAL_PREFIX = API_V1_PREFIX + "normal/"; diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/LoginService.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/LoginService.java index 98e8bab1..707d4908 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/LoginService.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/LoginService.java @@ -16,5 +16,5 @@ public interface LoginService { void logout(HttpServletRequest request, HttpServletResponse response, Boolean needJump2LoginPage); - boolean checkLogin(HttpServletRequest request, HttpServletResponse response); + boolean checkLogin(HttpServletRequest request, HttpServletResponse response, String classRequestMappingValue); } \ No newline at end of file diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java index e0919f54..7c82053f 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java @@ -63,19 +63,16 @@ public class LoginServiceImpl implements LoginService { } @Override - public boolean checkLogin(HttpServletRequest request, HttpServletResponse response) { - String uri = request.getRequestURI(); - if (uri.contains("..") || uri.contains("./") || uri.contains("///")) { - LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal, contains .. or ./ or ///||uri={}", uri); + public boolean checkLogin(HttpServletRequest request, HttpServletResponse response, String classRequestMappingValue) { + if (ValidateUtils.isNull(classRequestMappingValue)) { + LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal||uri={}", request.getRequestURI()); singleSignOn.setRedirectToLoginPage(response); return false; } - uri = uri.replaceAll("//", "/"); - if (uri.equals(ApiPrefix.API_V1_SSO_LOGIN) - || uri.equals(ApiPrefix.API_V1_SSO_LOGOUT) - || uri.startsWith(ApiPrefix.API_V1_THIRD_PART_PREFIX) - || uri.startsWith(ApiPrefix.GATEWAY_API_V1_PREFIX)) { + if (classRequestMappingValue.equals(ApiPrefix.API_V1_SSO_PREFIX) + || classRequestMappingValue.equals(ApiPrefix.API_V1_THIRD_PART_PREFIX) + || classRequestMappingValue.equals(ApiPrefix.GATEWAY_API_V1_PREFIX)) { // 白名单接口直接true return true; } diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/PermissionInterceptor.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/PermissionInterceptor.java index 6286cace..bf4b88d8 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/PermissionInterceptor.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/PermissionInterceptor.java @@ -1,8 +1,13 @@ package com.xiaojukeji.kafka.manager.web.inteceptor; import com.xiaojukeji.kafka.manager.account.LoginService; +import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; @@ -15,6 +20,8 @@ import javax.servlet.http.HttpServletResponse; */ @Component public class PermissionInterceptor implements HandlerInterceptor { + private static final Logger LOGGER = LoggerFactory.getLogger(PermissionInterceptor.class); + @Autowired private LoginService loginService; @@ -28,6 +35,31 @@ public class PermissionInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - return loginService.checkLogin(request, response); + + String classRequestMappingValue = null; + try { + classRequestMappingValue = getClassRequestMappingValue(handler); + } catch (Exception e) { + LOGGER.error("class=PermissionInterceptor||method=preHandle||uri={}||msg=parse class request-mapping failed", request.getRequestURI(), e); + } + return loginService.checkLogin(request, response, classRequestMappingValue); + } + + private String getClassRequestMappingValue(Object handler) { + RequestMapping classRM = null; + if(handler instanceof HandlerMethod) { + HandlerMethod hm = (HandlerMethod)handler; + classRM = hm.getMethod().getDeclaringClass().getAnnotation(RequestMapping.class); + } else if(handler instanceof org.springframework.web.servlet.mvc.Controller) { + org.springframework.web.servlet.mvc.Controller hm = (org.springframework.web.servlet.mvc.Controller)handler; + Class hmClass = hm.getClass(); + classRM = hmClass.getAnnotation(RequestMapping.class); + } else { + classRM = handler.getClass().getAnnotation(RequestMapping.class); + } + if (ValidateUtils.isNull(classRM) || classRM.value().length < 0) { + return null; + } + return classRM.value()[0]; } } From 1141d4b83320927a8489780ddb2625972471717f Mon Sep 17 00:00:00 2001 From: zengqiao Date: Thu, 15 Apr 2021 18:12:21 +0800 Subject: [PATCH 41/55] =?UTF-8?q?=E9=80=9A=E8=BF=87=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=B1=BB=E7=9A=84RequestMapping=E6=B3=A8=E8=A7=A3=E6=9D=A5?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=BD=93=E5=89=8D=E8=AF=B7=E6=B1=82=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E6=9C=89=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/account/impl/LoginServiceImpl.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java index 7c82053f..61719b4f 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java @@ -84,7 +84,7 @@ public class LoginServiceImpl implements LoginService { return false; } - boolean status = checkAuthority(request, accountService.getAccountRoleFromCache(username)); + boolean status = checkAuthority(classRequestMappingValue, accountService.getAccountRoleFromCache(username)); if (status) { HttpSession session = request.getSession(); session.setAttribute(LoginConstant.SESSION_USERNAME_KEY, username); @@ -94,19 +94,18 @@ public class LoginServiceImpl implements LoginService { return false; } - private boolean checkAuthority(HttpServletRequest request, AccountRoleEnum accountRoleEnum) { - String uri = request.getRequestURI(); - if (uri.contains(ApiPrefix.API_V1_NORMAL_PREFIX)) { + private boolean checkAuthority(String classRequestMappingValue, AccountRoleEnum accountRoleEnum) { + if (classRequestMappingValue.equals(ApiPrefix.API_V1_NORMAL_PREFIX)) { // normal 接口都可以访问 return true; } - if (uri.contains(ApiPrefix.API_V1_RD_PREFIX) ) { - // RD 接口 OP 或者 RD 可以访问 + if (classRequestMappingValue.equals(ApiPrefix.API_V1_RD_PREFIX) ) { + // RD 接口, OP 或者 RD 可以访问 return AccountRoleEnum.RD.equals(accountRoleEnum) || AccountRoleEnum.OP.equals(accountRoleEnum); } - if (uri.contains(ApiPrefix.API_V1_OP_PREFIX)) { + if (classRequestMappingValue.equals(ApiPrefix.API_V1_OP_PREFIX)) { // OP 接口只有 OP 可以访问 return AccountRoleEnum.OP.equals(accountRoleEnum); } From 1fdecf8defe261b97aa66b1391d99cd3cd895748 Mon Sep 17 00:00:00 2001 From: shirenchuang Date: Mon, 19 Apr 2021 10:17:29 +0800 Subject: [PATCH 42/55] =?UTF-8?q?=E4=B8=8B=E7=BA=BF=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=20=E5=88=A4=E6=96=AD=E5=85=88?= =?UTF-8?q?=E4=B8=8B=E7=BA=BFtopic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xiaojukeji/kafka/manager/common/entity/ResultStatus.java | 3 +++ .../kafka/manager/bpm/order/impl/DeleteAppOrder.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java index 454a687f..0f8aebd6 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java @@ -25,6 +25,9 @@ public enum ResultStatus { CHANGE_ZOOKEEPER_FORBIDDEN(1405, "change zookeeper forbidden"), + APP_OFFLINE_FORBIDDEN(1406, "先下线topic,才能下线应用~"), + + TOPIC_OPERATION_PARAM_NULL_POINTER(1450, "参数错误"), TOPIC_OPERATION_PARTITION_NUM_ILLEGAL(1451, "分区数错误"), TOPIC_OPERATION_BROKER_NUM_NOT_ENOUGH(1452, "Broker数不足错误"), diff --git a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java index 44aa9a0e..6127abc2 100644 --- a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java +++ b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java @@ -95,7 +95,7 @@ public class DeleteAppOrder extends AbstractAppOrder { // 判断app是否对topic有权限 List authorityList = authorityService.getAuthority(orderAppExtension.getAppId()); if (!ValidateUtils.isEmptyList(authorityList)) { - return ResultStatus.OPERATION_FORBIDDEN; + return ResultStatus.APP_OFFLINE_FORBIDDEN; } if (appService.deleteApp(appDO, userName) > 0) { return ResultStatus.SUCCESS; From b67a162d3f4ff174a2bce8fbf5fdbb6092044003 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Mon, 19 Apr 2021 14:13:48 +0800 Subject: [PATCH 43/55] bump version to v2.3.1 --- build.sh | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index f3ea8642..a6e86d7d 100644 --- a/build.sh +++ b/build.sh @@ -4,7 +4,7 @@ cd $workspace ## constant OUTPUT_DIR=./output -KM_VERSION=2.3.0 +KM_VERSION=2.3.1 APP_NAME=kafka-manager APP_DIR=${APP_NAME}-${KM_VERSION} diff --git a/pom.xml b/pom.xml index d4165a85..33d4dafe 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ - 2.3.0-SNAPSHOT + 2.3.1-SNAPSHOT 2.7.0 1.5.13 From e3a59b76eb5795c140b51212ca30341046a47790 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Mon, 19 Apr 2021 20:31:40 +0800 Subject: [PATCH 44/55] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=A0=E7=A9=BA=E4=B9=8B=E5=90=8E,=20=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E8=A2=AB=E6=9B=B4=E6=96=B0=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kafka/manager/dao/gateway/impl/AppDaoImpl.java | 7 ++++--- .../kafka/manager/dao/gateway/impl/AuthorityDaoImpl.java | 9 +++++---- .../xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java | 9 +++++---- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AppDaoImpl.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AppDaoImpl.java index 62475b9b..c14367fc 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AppDaoImpl.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AppDaoImpl.java @@ -78,13 +78,14 @@ public class AppDaoImpl implements AppDao { * 更新APP缓存 */ private synchronized void updateTopicCache(List doList, long timestamp) { + if (APP_CACHE_LATEST_UPDATE_TIME == Constant.START_TIMESTAMP) { + APP_MAP.clear(); + } + if (doList == null || doList.isEmpty() || APP_CACHE_LATEST_UPDATE_TIME >= timestamp) { // 本次无数据更新, 或者本次更新过时 时, 忽略本次更新 return; } - if (APP_CACHE_LATEST_UPDATE_TIME == Constant.START_TIMESTAMP) { - APP_MAP.clear(); - } for (AppDO elem: doList) { APP_MAP.put(elem.getAppId(), elem); diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AuthorityDaoImpl.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AuthorityDaoImpl.java index 1b5df873..c7bac9e0 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AuthorityDaoImpl.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/gateway/impl/AuthorityDaoImpl.java @@ -93,7 +93,7 @@ public class AuthorityDaoImpl implements AuthorityDao { private void updateAuthorityCache() { - Long timestamp = System.currentTimeMillis(); + long timestamp = System.currentTimeMillis(); if (timestamp + 1000 <= AUTHORITY_CACHE_LATEST_UPDATE_TIME) { // 近一秒内的请求不走db @@ -109,13 +109,14 @@ public class AuthorityDaoImpl implements AuthorityDao { * 更新Topic缓存 */ private synchronized void updateAuthorityCache(List doList, Long timestamp) { + if (AUTHORITY_CACHE_LATEST_UPDATE_TIME == Constant.START_TIMESTAMP) { + AUTHORITY_MAP.clear(); + } + if (doList == null || doList.isEmpty() || AUTHORITY_CACHE_LATEST_UPDATE_TIME >= timestamp) { // 本次无数据更新, 或者本次更新过时 时, 忽略本次更新 return; } - if (AUTHORITY_CACHE_LATEST_UPDATE_TIME == Constant.START_TIMESTAMP) { - AUTHORITY_MAP.clear(); - } for (AuthorityDO elem: doList) { Map> doMap = diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java index 3c1ba335..58a989c6 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java @@ -92,7 +92,7 @@ public class TopicDaoImpl implements TopicDao { } private void updateTopicCache() { - Long timestamp = System.currentTimeMillis(); + long timestamp = System.currentTimeMillis(); if (timestamp + 1000 <= TOPIC_CACHE_LATEST_UPDATE_TIME) { // 近一秒内的请求不走db @@ -108,13 +108,14 @@ public class TopicDaoImpl implements TopicDao { * 更新Topic缓存 */ private synchronized void updateTopicCache(List doList, Long timestamp) { + if (TOPIC_CACHE_LATEST_UPDATE_TIME == Constant.START_TIMESTAMP) { + TOPIC_MAP.clear(); + } + if (doList == null || doList.isEmpty() || TOPIC_CACHE_LATEST_UPDATE_TIME >= timestamp) { // 本次无数据更新, 或者本次更新过时 时, 忽略本次更新 return; } - if (TOPIC_CACHE_LATEST_UPDATE_TIME == Constant.START_TIMESTAMP) { - TOPIC_MAP.clear(); - } for (TopicDO elem: doList) { Map doMap = TOPIC_MAP.getOrDefault(elem.getClusterId(), new ConcurrentHashMap<>()); From e6dd1119be974470324138372eb37b59e19e41ff Mon Sep 17 00:00:00 2001 From: zengqiao Date: Wed, 14 Apr 2021 19:40:19 +0800 Subject: [PATCH 45/55] =?UTF-8?q?=E9=80=9A=E8=BF=87=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=B1=BB=E7=9A=84RequestMapping=E6=B3=A8=E8=A7=A3=E6=9D=A5?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=BD=93=E5=89=8D=E8=AF=B7=E6=B1=82=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E9=9C=80=E8=A6=81=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/common/constant/ApiPrefix.java | 2 -- .../kafka/manager/account/LoginService.java | 2 +- .../account/impl/LoginServiceImpl.java | 15 ++++---- .../web/inteceptor/PermissionInterceptor.java | 34 ++++++++++++++++++- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java index f193f39d..b90918eb 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/ApiPrefix.java @@ -11,8 +11,6 @@ public class ApiPrefix { // login public static final String API_V1_SSO_PREFIX = API_V1_PREFIX + "sso/"; - public static final String API_V1_SSO_LOGIN = API_V1_SSO_PREFIX + "login"; - public static final String API_V1_SSO_LOGOUT = API_V1_SSO_PREFIX + "logout"; // console public static final String API_V1_NORMAL_PREFIX = API_V1_PREFIX + "normal/"; diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/LoginService.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/LoginService.java index 98e8bab1..707d4908 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/LoginService.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/LoginService.java @@ -16,5 +16,5 @@ public interface LoginService { void logout(HttpServletRequest request, HttpServletResponse response, Boolean needJump2LoginPage); - boolean checkLogin(HttpServletRequest request, HttpServletResponse response); + boolean checkLogin(HttpServletRequest request, HttpServletResponse response, String classRequestMappingValue); } \ No newline at end of file diff --git a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java index e0919f54..7c82053f 100644 --- a/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java +++ b/kafka-manager-extends/kafka-manager-account/src/main/java/com/xiaojukeji/kafka/manager/account/impl/LoginServiceImpl.java @@ -63,19 +63,16 @@ public class LoginServiceImpl implements LoginService { } @Override - public boolean checkLogin(HttpServletRequest request, HttpServletResponse response) { - String uri = request.getRequestURI(); - if (uri.contains("..") || uri.contains("./") || uri.contains("///")) { - LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal, contains .. or ./ or ///||uri={}", uri); + public boolean checkLogin(HttpServletRequest request, HttpServletResponse response, String classRequestMappingValue) { + if (ValidateUtils.isNull(classRequestMappingValue)) { + LOGGER.error("class=LoginServiceImpl||method=checkLogin||msg=uri illegal||uri={}", request.getRequestURI()); singleSignOn.setRedirectToLoginPage(response); return false; } - uri = uri.replaceAll("//", "/"); - if (uri.equals(ApiPrefix.API_V1_SSO_LOGIN) - || uri.equals(ApiPrefix.API_V1_SSO_LOGOUT) - || uri.startsWith(ApiPrefix.API_V1_THIRD_PART_PREFIX) - || uri.startsWith(ApiPrefix.GATEWAY_API_V1_PREFIX)) { + if (classRequestMappingValue.equals(ApiPrefix.API_V1_SSO_PREFIX) + || classRequestMappingValue.equals(ApiPrefix.API_V1_THIRD_PART_PREFIX) + || classRequestMappingValue.equals(ApiPrefix.GATEWAY_API_V1_PREFIX)) { // 白名单接口直接true return true; } diff --git a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/PermissionInterceptor.java b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/PermissionInterceptor.java index 6286cace..bf4b88d8 100644 --- a/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/PermissionInterceptor.java +++ b/kafka-manager-web/src/main/java/com/xiaojukeji/kafka/manager/web/inteceptor/PermissionInterceptor.java @@ -1,8 +1,13 @@ package com.xiaojukeji.kafka.manager.web.inteceptor; import com.xiaojukeji.kafka.manager.account.LoginService; +import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; @@ -15,6 +20,8 @@ import javax.servlet.http.HttpServletResponse; */ @Component public class PermissionInterceptor implements HandlerInterceptor { + private static final Logger LOGGER = LoggerFactory.getLogger(PermissionInterceptor.class); + @Autowired private LoginService loginService; @@ -28,6 +35,31 @@ public class PermissionInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - return loginService.checkLogin(request, response); + + String classRequestMappingValue = null; + try { + classRequestMappingValue = getClassRequestMappingValue(handler); + } catch (Exception e) { + LOGGER.error("class=PermissionInterceptor||method=preHandle||uri={}||msg=parse class request-mapping failed", request.getRequestURI(), e); + } + return loginService.checkLogin(request, response, classRequestMappingValue); + } + + private String getClassRequestMappingValue(Object handler) { + RequestMapping classRM = null; + if(handler instanceof HandlerMethod) { + HandlerMethod hm = (HandlerMethod)handler; + classRM = hm.getMethod().getDeclaringClass().getAnnotation(RequestMapping.class); + } else if(handler instanceof org.springframework.web.servlet.mvc.Controller) { + org.springframework.web.servlet.mvc.Controller hm = (org.springframework.web.servlet.mvc.Controller)handler; + Class hmClass = hm.getClass(); + classRM = hmClass.getAnnotation(RequestMapping.class); + } else { + classRM = handler.getClass().getAnnotation(RequestMapping.class); + } + if (ValidateUtils.isNull(classRM) || classRM.value().length < 0) { + return null; + } + return classRM.value()[0]; } } From 22a513ba220c5ca7e09af91ad2c85dfe07bc1579 Mon Sep 17 00:00:00 2001 From: shirenchuang Date: Tue, 6 Apr 2021 12:09:52 +0800 Subject: [PATCH 46/55] =?UTF-8?q?=E5=8D=87=E7=BA=A7mysql=E9=A9=B1=E5=8A=A8?= =?UTF-8?q?=EF=BC=9B=E6=94=AF=E6=8C=81Mysql=208.0+?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kafka-manager-web/src/main/resources/application.yml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kafka-manager-web/src/main/resources/application.yml b/kafka-manager-web/src/main/resources/application.yml index 1c6614e2..58ad509f 100644 --- a/kafka-manager-web/src/main/resources/application.yml +++ b/kafka-manager-web/src/main/resources/application.yml @@ -14,7 +14,7 @@ spring: jdbc-url: jdbc:mysql://127.0.0.1:3306/logi_kafka_manager?characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 username: admin password: admin - driver-class-name: com.mysql.jdbc.Driver + driver-class-name: com.mysql.cj.jdbc.Driver main: allow-bean-definition-overriding: true diff --git a/pom.xml b/pom.xml index d4165a85..6c9d117f 100644 --- a/pom.xml +++ b/pom.xml @@ -180,7 +180,7 @@ mysql mysql-connector-java - 5.1.41 + 8.0.11 From 357c496aadd1b6c620a91a4359fc85c63b5b2011 Mon Sep 17 00:00:00 2001 From: shirenchuang Date: Mon, 19 Apr 2021 10:17:29 +0800 Subject: [PATCH 47/55] =?UTF-8?q?=E4=B8=8B=E7=BA=BF=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=20=E5=88=A4=E6=96=AD=E5=85=88?= =?UTF-8?q?=E4=B8=8B=E7=BA=BFtopic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xiaojukeji/kafka/manager/common/entity/ResultStatus.java | 3 +++ .../kafka/manager/bpm/order/impl/DeleteAppOrder.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java index 454a687f..0f8aebd6 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java @@ -25,6 +25,9 @@ public enum ResultStatus { CHANGE_ZOOKEEPER_FORBIDDEN(1405, "change zookeeper forbidden"), + APP_OFFLINE_FORBIDDEN(1406, "先下线topic,才能下线应用~"), + + TOPIC_OPERATION_PARAM_NULL_POINTER(1450, "参数错误"), TOPIC_OPERATION_PARTITION_NUM_ILLEGAL(1451, "分区数错误"), TOPIC_OPERATION_BROKER_NUM_NOT_ENOUGH(1452, "Broker数不足错误"), diff --git a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java index 44aa9a0e..6127abc2 100644 --- a/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java +++ b/kafka-manager-extends/kafka-manager-bpm/src/main/java/com/xiaojukeji/kafka/manager/bpm/order/impl/DeleteAppOrder.java @@ -95,7 +95,7 @@ public class DeleteAppOrder extends AbstractAppOrder { // 判断app是否对topic有权限 List authorityList = authorityService.getAuthority(orderAppExtension.getAppId()); if (!ValidateUtils.isEmptyList(authorityList)) { - return ResultStatus.OPERATION_FORBIDDEN; + return ResultStatus.APP_OFFLINE_FORBIDDEN; } if (appService.deleteApp(appDO, userName) > 0) { return ResultStatus.SUCCESS; From ad4e39c0888ecced58035eadac7fb8b9d507ecfe Mon Sep 17 00:00:00 2001 From: PengShuaixin Date: Tue, 20 Apr 2021 11:22:11 +0800 Subject: [PATCH 48/55] =?UTF-8?q?=E5=BA=94=E7=94=A8=E4=B8=8B=E7=BA=BF?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=9D=83=E9=99=90=E5=88=97=E8=A1=A8=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/impl/AuthorityServiceImpl.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/AuthorityServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/AuthorityServiceImpl.java index 4f804107..876966f7 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/AuthorityServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/AuthorityServiceImpl.java @@ -4,13 +4,14 @@ import com.alibaba.fastjson.JSONObject; import com.xiaojukeji.kafka.manager.common.bizenum.ModuleEnum; import com.xiaojukeji.kafka.manager.common.bizenum.OperateEnum; import com.xiaojukeji.kafka.manager.common.bizenum.OperationStatusEnum; +import com.xiaojukeji.kafka.manager.common.bizenum.TopicAuthorityEnum; +import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; +import com.xiaojukeji.kafka.manager.common.entity.ao.gateway.TopicQuota; import com.xiaojukeji.kafka.manager.common.entity.pojo.OperateRecordDO; import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.AuthorityDO; import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.KafkaAclDO; -import com.xiaojukeji.kafka.manager.dao.gateway.AuthorityDao; -import com.xiaojukeji.kafka.manager.common.entity.ao.gateway.TopicQuota; -import com.xiaojukeji.kafka.manager.common.entity.ResultStatus; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; +import com.xiaojukeji.kafka.manager.dao.gateway.AuthorityDao; import com.xiaojukeji.kafka.manager.dao.gateway.KafkaAclDao; import com.xiaojukeji.kafka.manager.service.service.OperateRecordService; import com.xiaojukeji.kafka.manager.service.service.gateway.AuthorityService; @@ -20,10 +21,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * @author zhongyuankai @@ -163,8 +162,14 @@ public class AuthorityServiceImpl implements AuthorityService { } if (ValidateUtils.isEmptyList(doList)) { return new ArrayList<>(); + } else { + assert doList != null; + // 过滤权限列表中access=0的 + List newList = doList.stream() + .filter(authorityDO -> !TopicAuthorityEnum.DENY.getCode().equals(authorityDO.getAccess())) + .collect(Collectors.toList()); + return newList; } - return doList; } @Override From 3e1544294b6dc77aa1902b399ff1fd4497971345 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 20 Apr 2021 17:22:26 +0800 Subject: [PATCH 49/55] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E6=95=88?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/impl/AuthorityServiceImpl.java | 18 ++++++------- .../notify/OrderApplyNotifyService.java | 26 +------------------ .../manager/notify/common/NotifyConstant.java | 18 ------------- 3 files changed, 9 insertions(+), 53 deletions(-) delete mode 100644 kafka-manager-extends/kafka-manager-notify/src/main/java/com/xiaojukeji/kafka/manager/notify/common/NotifyConstant.java diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/AuthorityServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/AuthorityServiceImpl.java index 876966f7..f5fad493 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/AuthorityServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/gateway/impl/AuthorityServiceImpl.java @@ -1,6 +1,5 @@ package com.xiaojukeji.kafka.manager.service.service.gateway.impl; -import com.alibaba.fastjson.JSONObject; import com.xiaojukeji.kafka.manager.common.bizenum.ModuleEnum; import com.xiaojukeji.kafka.manager.common.bizenum.OperateEnum; import com.xiaojukeji.kafka.manager.common.bizenum.OperationStatusEnum; @@ -10,6 +9,7 @@ import com.xiaojukeji.kafka.manager.common.entity.ao.gateway.TopicQuota; import com.xiaojukeji.kafka.manager.common.entity.pojo.OperateRecordDO; import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.AuthorityDO; import com.xiaojukeji.kafka.manager.common.entity.pojo.gateway.KafkaAclDO; +import com.xiaojukeji.kafka.manager.common.utils.JsonUtils; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import com.xiaojukeji.kafka.manager.dao.gateway.AuthorityDao; import com.xiaojukeji.kafka.manager.dao.gateway.KafkaAclDao; @@ -119,7 +119,7 @@ public class AuthorityServiceImpl implements AuthorityService { operateRecordDO.setModuleId(ModuleEnum.AUTHORITY.getCode()); operateRecordDO.setOperateId(OperateEnum.DELETE.getCode()); operateRecordDO.setResource(topicName); - operateRecordDO.setContent(JSONObject.toJSONString(content)); + operateRecordDO.setContent(JsonUtils.toJSONString(content)); operateRecordDO.setOperator(operator); operateRecordService.insert(operateRecordDO); } catch (Exception e) { @@ -149,7 +149,7 @@ public class AuthorityServiceImpl implements AuthorityService { } catch (Exception e) { LOGGER.error("get authority failed, clusterId:{} topicName:{}.", clusterId, topicName, e); } - return null; + return Collections.emptyList(); } @Override @@ -162,14 +162,12 @@ public class AuthorityServiceImpl implements AuthorityService { } if (ValidateUtils.isEmptyList(doList)) { return new ArrayList<>(); - } else { - assert doList != null; - // 过滤权限列表中access=0的 - List newList = doList.stream() - .filter(authorityDO -> !TopicAuthorityEnum.DENY.getCode().equals(authorityDO.getAccess())) - .collect(Collectors.toList()); - return newList; } + + // 去除掉权限列表中无权限的数据 + return doList.stream() + .filter(authorityDO -> !TopicAuthorityEnum.DENY.getCode().equals(authorityDO.getAccess())) + .collect(Collectors.toList()); } @Override diff --git a/kafka-manager-extends/kafka-manager-notify/src/main/java/com/xiaojukeji/kafka/manager/notify/OrderApplyNotifyService.java b/kafka-manager-extends/kafka-manager-notify/src/main/java/com/xiaojukeji/kafka/manager/notify/OrderApplyNotifyService.java index 35caf21f..c5756217 100644 --- a/kafka-manager-extends/kafka-manager-notify/src/main/java/com/xiaojukeji/kafka/manager/notify/OrderApplyNotifyService.java +++ b/kafka-manager-extends/kafka-manager-notify/src/main/java/com/xiaojukeji/kafka/manager/notify/OrderApplyNotifyService.java @@ -1,14 +1,7 @@ package com.xiaojukeji.kafka.manager.notify; -import com.xiaojukeji.kafka.manager.common.entity.ao.account.Account; -import com.xiaojukeji.kafka.manager.common.entity.pojo.OrderDO; import com.xiaojukeji.kafka.manager.common.events.OrderApplyEvent; -import com.xiaojukeji.kafka.manager.notify.common.NotifyConstant; -import com.xiaojukeji.kafka.manager.notify.notifyer.AbstractNotifyService; -import com.xiaojukeji.kafka.manager.notify.common.OrderNotifyTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -19,27 +12,10 @@ import org.springframework.stereotype.Service; */ @Service("orderApplyNotifyService") public class OrderApplyNotifyService implements ApplicationListener { - @Autowired - private AbstractNotifyService notifyService; - - @Value("${notify.order.detail-url}") - private String orderDetailUrl; @Async @Override public void onApplicationEvent(OrderApplyEvent orderApplyEvent) { - OrderDO orderDO = orderApplyEvent.getOrderDO(); - String detailUrl = String.format(orderDetailUrl, orderDO.getId(), orderApplyEvent.getIdc()); - for (Account account : NotifyConstant.accountList) { - notifyService.sendMsg(account.getUsername(), - OrderNotifyTemplate.getNotify2OrderHandlerMessage( - account.getChineseName(), - orderDO.getApplicant(), - orderDO.getTitle(), - detailUrl - ) - ); - } - + // todo 工单通知 } } \ No newline at end of file diff --git a/kafka-manager-extends/kafka-manager-notify/src/main/java/com/xiaojukeji/kafka/manager/notify/common/NotifyConstant.java b/kafka-manager-extends/kafka-manager-notify/src/main/java/com/xiaojukeji/kafka/manager/notify/common/NotifyConstant.java deleted file mode 100644 index da4e2737..00000000 --- a/kafka-manager-extends/kafka-manager-notify/src/main/java/com/xiaojukeji/kafka/manager/notify/common/NotifyConstant.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.xiaojukeji.kafka.manager.notify.common; - -import com.xiaojukeji.kafka.manager.common.bizenum.AccountRoleEnum; -import com.xiaojukeji.kafka.manager.common.entity.ao.account.Account; - -import java.util.Arrays; -import java.util.List; - -/** - * @author zengqiao - * @date 20/8/27 - */ -public class NotifyConstant { - - public static final List accountList = Arrays.asList( - new Account("xuzhengxi", "徐正熙", "", AccountRoleEnum.OP) - ); -} \ No newline at end of file From 59df5b24fe8d1ec2791f48c7385b79de7791b688 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Tue, 20 Apr 2021 19:28:36 +0800 Subject: [PATCH 50/55] =?UTF-8?q?broker=E5=85=83=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=AD=E5=A2=9E=E5=8A=A0Rack=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znode/brokers/BrokerMetadata.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/znode/brokers/BrokerMetadata.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/znode/brokers/BrokerMetadata.java index 51c4b06b..3c179b4f 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/znode/brokers/BrokerMetadata.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/znode/brokers/BrokerMetadata.java @@ -1,8 +1,5 @@ package com.xiaojukeji.kafka.manager.common.zookeeper.znode.brokers; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.List; /** @@ -18,12 +15,11 @@ import java.util.List; * "host":null, * "timestamp":"1546632983233", * "port":-1, - * "version":4 + * "version":4, + * "rack": "CY" * } */ public class BrokerMetadata implements Cloneable { - private final static Logger LOGGER = LoggerFactory.getLogger(TopicMetadata.class); - private long clusterId; private int brokerId; @@ -43,6 +39,8 @@ public class BrokerMetadata implements Cloneable { private long timestamp; + private String rack; + public long getClusterId() { return clusterId; } @@ -107,14 +105,12 @@ public class BrokerMetadata implements Cloneable { this.timestamp = timestamp; } - @Override - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException var3) { - LOGGER.error("clone BrokerMetadata failed.", var3); - } - return null; + public String getRack() { + return rack; + } + + public void setRack(String rack) { + this.rack = rack; } @Override @@ -128,6 +124,7 @@ public class BrokerMetadata implements Cloneable { ", jmxPort=" + jmx_port + ", version='" + version + '\'' + ", timestamp=" + timestamp + + ", rack='" + rack + '\'' + '}'; } } From d6559be3fc1c05f6b0cde485f6faf53ad9110227 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Thu, 22 Apr 2021 16:06:37 +0800 Subject: [PATCH 51/55] =?UTF-8?q?=E9=83=A8=E5=88=86=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=8E=B7=E5=8F=96Topic=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=97=B6=E4=B8=8D=E8=B5=B0=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/service/service/TopicManagerService.java | 2 ++ .../service/service/impl/TopicManagerServiceImpl.java | 8 ++++++++ .../manager/service/service/impl/TopicServiceImpl.java | 2 +- .../java/com/xiaojukeji/kafka/manager/dao/TopicDao.java | 2 ++ .../xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java | 7 ++++++- 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/TopicManagerService.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/TopicManagerService.java index 5a1fc11b..cfa2920f 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/TopicManagerService.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/TopicManagerService.java @@ -22,6 +22,8 @@ import java.util.Map; public interface TopicManagerService { List listAll(); + List getByClusterIdFromCache(Long clusterId); + List getByClusterId(Long clusterId); TopicDO getByTopicName(Long clusterId, String topicName); diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicManagerServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicManagerServiceImpl.java index 6ee9a499..1d761eb8 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicManagerServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicManagerServiceImpl.java @@ -95,6 +95,14 @@ public class TopicManagerServiceImpl implements TopicManagerService { return new ArrayList<>(); } + @Override + public List getByClusterIdFromCache(Long clusterId) { + if (clusterId == null) { + return new ArrayList<>(); + } + return topicDao.getByClusterIdFromCache(clusterId); + } + @Override public List getByClusterId(Long clusterId) { if (clusterId == null) { diff --git a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java index 5dea0561..63191888 100644 --- a/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java +++ b/kafka-manager-core/src/main/java/com/xiaojukeji/kafka/manager/service/service/impl/TopicServiceImpl.java @@ -381,7 +381,7 @@ public class TopicServiceImpl implements TopicService { return new ArrayList<>(); } - List topicDOList = topicManagerService.getByClusterId(clusterId); + List topicDOList = topicManagerService.getByClusterIdFromCache(clusterId); if (ValidateUtils.isNull(topicDOList)) { topicDOList = new ArrayList<>(); } diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicDao.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicDao.java index 64e089a6..9a4511a5 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicDao.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/TopicDao.java @@ -15,6 +15,8 @@ public interface TopicDao { TopicDO getByTopicName(Long clusterId, String topicName); + List getByClusterIdFromCache(Long clusterId); + List getByClusterId(Long clusterId); List getByAppId(String appId); diff --git a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java index 58a989c6..fa61734f 100644 --- a/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java +++ b/kafka-manager-dao/src/main/java/com/xiaojukeji/kafka/manager/dao/impl/TopicDaoImpl.java @@ -62,11 +62,16 @@ public class TopicDaoImpl implements TopicDao { } @Override - public List getByClusterId(Long clusterId) { + public List getByClusterIdFromCache(Long clusterId) { updateTopicCache(); return new ArrayList<>(TOPIC_MAP.getOrDefault(clusterId, Collections.emptyMap()).values()); } + @Override + public List getByClusterId(Long clusterId) { + return sqlSession.selectList("TopicDao.getByClusterId", clusterId); + } + @Override public List getByAppId(String appId) { return sqlSession.selectList("TopicDao.getByAppId", appId); From c65ec68e461cb106c60b5aa4fff777363c64f02b Mon Sep 17 00:00:00 2001 From: Liu-XinYuan <879928098@qq.com> Date: Thu, 22 Apr 2021 18:30:23 +0800 Subject: [PATCH 52/55] fix create topic failed when not specify peak_byte_in --- .../entity/dto/op/topic/TopicCreationDTO.java | 13 ++++++++++++- .../kafka/manager/common/entity/pojo/TopicDO.java | 3 ++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/op/topic/TopicCreationDTO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/op/topic/TopicCreationDTO.java index 66c26c5b..b92ef7c1 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/op/topic/TopicCreationDTO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/op/topic/TopicCreationDTO.java @@ -40,6 +40,9 @@ public class TopicCreationDTO extends ClusterTopicDTO { @ApiModelProperty(value = "Topic属性列表") private Properties properties; + @ApiModelProperty(value = "最大写入字节数") + private Long peakBytesIn; + public String getAppId() { return appId; } @@ -104,6 +107,14 @@ public class TopicCreationDTO extends ClusterTopicDTO { this.properties = properties; } + public Long getPeakBytesIn() { + return peakBytesIn; + } + + public void setPeakBytesIn(Long peakBytesIn) { + this.peakBytesIn = peakBytesIn; + } + @Override public String toString() { return "TopicCreationDTO{" + @@ -135,4 +146,4 @@ public class TopicCreationDTO extends ClusterTopicDTO { } return true; } -} \ No newline at end of file +} diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/TopicDO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/TopicDO.java index b4b56712..7ee0cbbc 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/TopicDO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/TopicDO.java @@ -95,6 +95,7 @@ public class TopicDO { topicDO.setClusterId(dto.getClusterId()); topicDO.setTopicName(dto.getTopicName()); topicDO.setDescription(dto.getDescription()); + topicDO.setPeakBytesIn(dto.getPeakBytesIn() == null ? -1L : dto.getPeakBytesIn()); return topicDO; } -} \ No newline at end of file +} From 57a48dadaae6065ed55b16265f60fb84bdfe6f41 Mon Sep 17 00:00:00 2001 From: Liu-XinYuan <879928098@qq.com> Date: Thu, 22 Apr 2021 18:44:34 +0800 Subject: [PATCH 53/55] modify from obj ==null to ValidateUtils.isNull --- .../xiaojukeji/kafka/manager/common/entity/pojo/TopicDO.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/TopicDO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/TopicDO.java index 7ee0cbbc..ecb97e47 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/TopicDO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/pojo/TopicDO.java @@ -1,6 +1,7 @@ package com.xiaojukeji.kafka.manager.common.entity.pojo; import com.xiaojukeji.kafka.manager.common.entity.dto.op.topic.TopicCreationDTO; +import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import java.util.Date; @@ -95,7 +96,7 @@ public class TopicDO { topicDO.setClusterId(dto.getClusterId()); topicDO.setTopicName(dto.getTopicName()); topicDO.setDescription(dto.getDescription()); - topicDO.setPeakBytesIn(dto.getPeakBytesIn() == null ? -1L : dto.getPeakBytesIn()); + topicDO.setPeakBytesIn(ValidateUtils.isNull(dto.getPeakBytesIn()) ? -1L : dto.getPeakBytesIn()); return topicDO; } } From 82a60a884a1092f9b633613106a6387b0c5c9ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=85=89?= Date: Fri, 23 Apr 2021 14:06:55 +0800 Subject: [PATCH 54/55] Add files via upload --- .../jmx_prometheus_javaagent-0.15.0.jar | Bin 0 -> 418240 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 container/dockerfiles/docker-depends/jmx_prometheus_javaagent-0.15.0.jar diff --git a/container/dockerfiles/docker-depends/jmx_prometheus_javaagent-0.15.0.jar b/container/dockerfiles/docker-depends/jmx_prometheus_javaagent-0.15.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..d896a21709c445b8b096d25764ddb21121d3f809 GIT binary patch literal 418240 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 z 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

    @|14|*d4uX15oLOXdAF0@S$R0lUR(K%q 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

    jXl$SGJhc_F=Q&J+ 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 literal 0 HcmV?d00001 From a476476bd181383b886311fa61577d4792c027d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=85=89?= Date: Fri, 23 Apr 2021 14:10:40 +0800 Subject: [PATCH 55/55] Update Dockerfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加进程管理器tini 防止僵尸应用 升级基础镜像到Java 16 alpine 默认使用官方jar 包 默认开启JMX 监控 --- container/dockerfiles/Dockerfile | 33 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/container/dockerfiles/Dockerfile b/container/dockerfiles/Dockerfile index d8a3d158..1ffe27e4 100644 --- a/container/dockerfiles/Dockerfile +++ b/container/dockerfiles/Dockerfile @@ -1,14 +1,11 @@ -FROM openjdk:8-jdk-alpine3.9 +FROM openjdk:16-jdk-alpine3.13 LABEL author="yangvipguang" -ENV VERSION 2.1.0 -ENV JAR_PATH kafka-manager-web/target -COPY $JAR_PATH/kafka-manager-web-$VERSION-SNAPSHOT.jar /tmp/app.jar -COPY $JAR_PATH/application.yml /km/ +ENV VERSION 2.3.1 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories -RUN apk add --no-cache --virtual .build-deps \ +RUN apk add --no-cache --virtual .build-deps \ font-adobe-100dpi \ ttf-dejavu \ fontconfig \ @@ -19,26 +16,28 @@ RUN apk add --no-cache --virtual .build-deps \ tomcat-native \ && apk del .build-deps +RUN apk add --no-cache tini + + + + ENV AGENT_HOME /opt/agent/ WORKDIR /tmp + +COPY $JAR_PATH/kafka-manager.jar app.jar +# COPY application.yml application.yml ##默认使用helm 挂载,防止敏感配置泄露 + COPY docker-depends/config.yaml $AGENT_HOME -COPY docker-depends/jmx_prometheus_javaagent-0.14.0.jar $AGENT_HOME - -ENV JAVA_AGENT="-javaagent:$AGENT_HOME/jmx_prometheus_javaagent-0.14.0.jar=9999:$AGENT_HOME/config.yaml" +COPY docker-depends/jmx_prometheus_javaagent-0.15.0.jar $AGENT_HOME +ENV JAVA_AGENT="-javaagent:$AGENT_HOME/jmx_prometheus_javaagent-0.15.0.jar=9999:$AGENT_HOME/config.yaml" ENV JAVA_HEAP_OPTS="-Xms1024M -Xmx1024M -Xmn100M " - ENV JAVA_OPTS="-verbose:gc \ - -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:/tmp/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps \ -XX:MaxMetaspaceSize=256M -XX:+DisableExplicitGC -XX:+UseStringDeduplication \ -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:-UseContainerSupport" -#-Xlog:gc -Xlog:gc* -Xlog:gc+heap=trace -Xlog:safepoint - EXPOSE 8080 9999 -ENTRYPOINT ["sh","-c","java -jar $JAVA_HEAP_OPTS $JAVA_OPTS /tmp/app.jar --spring.config.location=/km/application.yml"] - -## 默认不带Prometheus JMX监控,需要可以自行取消以下注释并注释上面一行默认Entrypoint 命令。 -## ENTRYPOINT ["sh","-c","java -jar $JAVA_AGENT $JAVA_HEAP_OPTS $JAVA_OPTS /tmp/app.jar --spring.config.location=/km/application.yml"] +ENTRYPOINT ["tini", "--"] +CMD ["sh","-c","java -jar $JAVA_AGENT $JAVA_HEAP_OPTS $JAVA_OPTS app.jar --spring.config.location=application.yml"]