diff --git a/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml b/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml
index 459ab49f..53e9feaf 100644
--- a/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml
+++ b/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml
@@ -17,7 +17,7 @@
2021.0.4.0
1.8.6
1.6.0
- 2.1.2
+ 2.2.0
3.1.3
1.0.11
diff --git a/ruoyi-visual/ruoyi-nacos/pom.xml b/ruoyi-visual/ruoyi-nacos/pom.xml
index 0054d2c8..c7890452 100644
--- a/ruoyi-visual/ruoyi-nacos/pom.xml
+++ b/ruoyi-visual/ruoyi-nacos/pom.xml
@@ -27,7 +27,7 @@
jar
- 2.1.2
+ 2.2.0
${project.basedir}/src/main/resources/lib
@@ -72,6 +72,13 @@
system
${nacos.lib.path}/nacos-consistency-${nacos.version}.jar
+
+ com.alibaba.nacos
+ nacos-contrl-plugin
+ ${nacos.version}
+ system
+ ${nacos.lib.path}/nacos-contrl-plugin-${nacos.version}.jar
+
com.alibaba.nacos
nacos-core
@@ -100,6 +107,13 @@
system
${nacos.lib.path}/nacos-plugin-default-impl-${nacos.version}.jar
+
+ com.alibaba.nacos
+ nacos-prometheus
+ ${nacos.version}
+ system
+ ${nacos.lib.path}/nacos-prometheus-${nacos.version}.jar
+
com.alibaba.nacos
nacos-sys
@@ -107,6 +121,26 @@
system
${nacos.lib.path}/nacos-sys-${nacos.version}.jar
+
+ com.alibaba.nacos
+ nacos-custom-environment-plugin
+ ${nacos.version}
+
+
+ com.alibaba.nacos
+ nacos-datasource-plugin
+ ${nacos.version}
+
+
+ com.alibaba.nacos
+ nacos-encryption-plugin
+ ${nacos.version}
+
+
+ com.alibaba.nacos
+ nacos-trace-plugin
+ ${nacos.version}
+
com.alibaba.nacos
nacos-common
@@ -120,6 +154,12 @@
org.springframework.boot
spring-boot-starter-web
+
+
+ org.apache.logging.log4j
+ *
+
+
org.springframework.boot
@@ -208,6 +248,10 @@
io.micrometer
micrometer-registry-elastic
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
io.envoyproxy.controlplane
@@ -216,11 +260,6 @@
-
-
- org.slf4j
- log4j-over-slf4j
-
org.slf4j
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/HealthController.java b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/HealthController.java
index f95cba77..f5b0e981 100644
--- a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/HealthController.java
+++ b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/HealthController.java
@@ -16,7 +16,7 @@
package com.alibaba.nacos.console.controller;
-import com.alibaba.nacos.config.server.service.repository.PersistService;
+import com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService;
import com.alibaba.nacos.naming.controllers.OperatorController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,13 +40,13 @@ public class HealthController {
private static final Logger LOGGER = LoggerFactory.getLogger(HealthController.class);
- private final PersistService persistService;
+ private final ConfigInfoPersistService configInfoPersistService;
private final OperatorController apiCommands;
@Autowired
- public HealthController(PersistService persistService, OperatorController apiCommands) {
- this.persistService = persistService;
+ public HealthController(ConfigInfoPersistService configInfoPersistService, OperatorController apiCommands) {
+ this.configInfoPersistService = configInfoPersistService;
this.apiCommands = apiCommands;
}
@@ -90,7 +90,7 @@ public class HealthController {
private boolean isConfigReadiness() {
// check db
try {
- persistService.configInfoCount("");
+ configInfoPersistService.configInfoCount("");
return true;
} catch (Exception e) {
LOGGER.error("Config health check fail.", e);
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java
index 642b8cf4..90c86dce 100644
--- a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java
+++ b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java
@@ -16,27 +16,20 @@
package com.alibaba.nacos.console.controller;
+import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.auth.annotation.Secured;
import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.model.RestResultUtils;
import com.alibaba.nacos.common.utils.StringUtils;
-import com.alibaba.nacos.config.server.model.TenantInfo;
-import com.alibaba.nacos.config.server.service.repository.PersistService;
-import com.alibaba.nacos.console.enums.NamespaceTypeEnum;
+import com.alibaba.nacos.config.server.service.repository.CommonPersistService;
import com.alibaba.nacos.console.model.Namespace;
import com.alibaba.nacos.console.model.NamespaceAllInfo;
+import com.alibaba.nacos.console.service.NamespaceOperationService;
import com.alibaba.nacos.plugin.auth.constant.ActionTypes;
import com.alibaba.nacos.plugin.auth.impl.constant.AuthConstants;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
-import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.regex.Pattern;
@@ -49,28 +42,17 @@ import java.util.regex.Pattern;
@RestController
@RequestMapping("/v1/console/namespaces")
public class NamespaceController {
-
+
@Autowired
- private PersistService persistService;
-
+ private CommonPersistService commonPersistService;
+
+ @Autowired
+ private NamespaceOperationService namespaceOperationService;
+
private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+");
-
+
private static final int NAMESPACE_ID_MAX_LENGTH = 128;
-
- private static final String DEFAULT_NAMESPACE = "public";
-
- private static final int DEFAULT_QUOTA = 200;
-
- private static final String DEFAULT_CREATE_SOURCE = "nacos";
-
- private static final String DEFAULT_NAMESPACE_SHOW_NAME = "Public";
-
- private static final String DEFAULT_NAMESPACE_DESCRIPTION = "Public Namespace";
-
- private static final String DEFAULT_TENANT = "";
-
- private static final String DEFAULT_KP = "1";
-
+
/**
* Get namespace list.
*
@@ -78,21 +60,9 @@ public class NamespaceController {
*/
@GetMapping
public RestResult> getNamespaces() {
- // TODO 获取用kp
- List tenantInfos = persistService.findTenantByKp(DEFAULT_KP);
- Namespace namespace0 = new Namespace("", DEFAULT_NAMESPACE, DEFAULT_QUOTA,
- persistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType());
- List namespaces = new ArrayList<>();
- namespaces.add(namespace0);
- for (TenantInfo tenantInfo : tenantInfos) {
- int configCount = persistService.configInfoCount(tenantInfo.getTenantId());
- Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(),
- tenantInfo.getTenantDesc(), DEFAULT_QUOTA, configCount, NamespaceTypeEnum.CUSTOM.getType());
- namespaces.add(namespaceTmp);
- }
- return RestResultUtils.success(namespaces);
+ return RestResultUtils.success(namespaceOperationService.getNamespaceList());
}
-
+
/**
* get namespace all info by namespace id.
*
@@ -100,20 +70,10 @@ public class NamespaceController {
* @return namespace all info
*/
@GetMapping(params = "show=all")
- public NamespaceAllInfo getNamespace(@RequestParam("namespaceId") String namespaceId) {
- // TODO 获取用kp
- if (StringUtils.isBlank(namespaceId)) {
- return new NamespaceAllInfo(namespaceId, DEFAULT_NAMESPACE_SHOW_NAME, DEFAULT_QUOTA,
- persistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType(),
- DEFAULT_NAMESPACE_DESCRIPTION);
- } else {
- TenantInfo tenantInfo = persistService.findTenantByKp(DEFAULT_KP, namespaceId);
- int configCount = persistService.configInfoCount(namespaceId);
- return new NamespaceAllInfo(namespaceId, tenantInfo.getTenantName(), DEFAULT_QUOTA, configCount,
- NamespaceTypeEnum.CUSTOM.getType(), tenantInfo.getTenantDesc());
- }
+ public NamespaceAllInfo getNamespace(@RequestParam("namespaceId") String namespaceId) throws NacosException {
+ return namespaceOperationService.getNamespace(namespaceId);
}
-
+
/**
* create namespace.
*
@@ -126,7 +86,6 @@ public class NamespaceController {
public Boolean createNamespace(@RequestParam("customNamespaceId") String namespaceId,
@RequestParam("namespaceName") String namespaceName,
@RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
- // TODO 获取用kp
if (StringUtils.isBlank(namespaceId)) {
namespaceId = UUID.randomUUID().toString();
} else {
@@ -137,15 +96,14 @@ public class NamespaceController {
if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) {
return false;
}
- if (persistService.tenantInfoCountByTenantId(namespaceId) > 0) {
- return false;
- }
}
- persistService.insertTenantInfoAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc,
- DEFAULT_CREATE_SOURCE, System.currentTimeMillis());
- return true;
+ try {
+ return namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc);
+ } catch (NacosException e) {
+ return false;
+ }
}
-
+
/**
* check namespaceId exist.
*
@@ -157,9 +115,9 @@ public class NamespaceController {
if (StringUtils.isBlank(namespaceId)) {
return false;
}
- return (persistService.tenantInfoCountByTenantId(namespaceId) > 0);
+ return (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0);
}
-
+
/**
* edit namespace.
*
@@ -173,11 +131,9 @@ public class NamespaceController {
public Boolean editNamespace(@RequestParam("namespace") String namespace,
@RequestParam("namespaceShowName") String namespaceShowName,
@RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
- // TODO 获取用kp
- persistService.updateTenantNameAtomic(DEFAULT_KP, namespace, namespaceShowName, namespaceDesc);
- return true;
+ return namespaceOperationService.editNamespace(namespace, namespaceShowName, namespaceDesc);
}
-
+
/**
* del namespace by id.
*
@@ -186,9 +142,8 @@ public class NamespaceController {
*/
@DeleteMapping
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE)
- public Boolean deleteConfig(@RequestParam("namespaceId") String namespaceId) {
- persistService.removeTenantInfoAtomic(DEFAULT_KP, namespaceId);
- return true;
+ public Boolean deleteNamespace(@RequestParam("namespaceId") String namespaceId) {
+ return namespaceOperationService.removeNamespace(namespaceId);
}
-
+
}
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java
new file mode 100644
index 00000000..d9e0f1d6
--- /dev/null
+++ b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 1999-2022 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.alibaba.nacos.console.controller.v2;
+
+import com.alibaba.nacos.api.annotation.NacosApi;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.exception.api.NacosApiException;
+import com.alibaba.nacos.api.model.v2.ErrorCode;
+import com.alibaba.nacos.api.model.v2.Result;
+import com.alibaba.nacos.auth.annotation.Secured;
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.alibaba.nacos.console.model.Namespace;
+import com.alibaba.nacos.console.model.NamespaceAllInfo;
+import com.alibaba.nacos.console.model.form.NamespaceForm;
+import com.alibaba.nacos.console.service.NamespaceOperationService;
+import com.alibaba.nacos.plugin.auth.constant.ActionTypes;
+import com.alibaba.nacos.plugin.auth.constant.SignType;
+import com.alibaba.nacos.plugin.auth.impl.constant.AuthConstants;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.UUID;
+import java.util.regex.Pattern;
+
+/**
+ * NamespaceControllerV2.
+ *
+ * @author dongyafei
+ * @date 2022/8/16
+ */
+@NacosApi
+@RestController
+@RequestMapping(path = "/v2/console/namespace")
+public class NamespaceControllerV2 {
+
+ private final NamespaceOperationService namespaceOperationService;
+
+ public NamespaceControllerV2(NamespaceOperationService namespaceOperationService) {
+ this.namespaceOperationService = namespaceOperationService;
+ }
+
+ private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+");
+
+ private static final int NAMESPACE_ID_MAX_LENGTH = 128;
+
+ /**
+ * Get namespace list.
+ *
+ * @return namespace list
+ */
+ @GetMapping("/list")
+ public Result> getNamespaceList() {
+ return Result.success(namespaceOperationService.getNamespaceList());
+ }
+
+ /**
+ * get namespace all info by namespace id.
+ *
+ * @param namespaceId namespaceId
+ * @return namespace all info
+ */
+ @GetMapping()
+ @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX
+ + "namespaces", action = ActionTypes.READ, signType = SignType.CONSOLE)
+ public Result getNamespace(@RequestParam("namespaceId") String namespaceId)
+ throws NacosException {
+ return Result.success(namespaceOperationService.getNamespace(namespaceId));
+ }
+
+ /**
+ * create namespace.
+ *
+ * @param namespaceForm namespaceForm.
+ * @return whether create ok
+ */
+ @PostMapping
+ @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX
+ + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE)
+ public Result createNamespace(NamespaceForm namespaceForm) throws NacosException {
+
+ namespaceForm.validate();
+
+ String namespaceId = namespaceForm.getNamespaceId();
+ String namespaceName = namespaceForm.getNamespaceName();
+ String namespaceDesc = namespaceForm.getNamespaceDesc();
+
+ if (StringUtils.isBlank(namespaceId)) {
+ namespaceId = UUID.randomUUID().toString();
+ } else {
+ namespaceId = namespaceId.trim();
+ if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) {
+ throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE,
+ "namespaceId [" + namespaceId + "] mismatch the pattern");
+ }
+ if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) {
+ throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE,
+ "too long namespaceId, over " + NAMESPACE_ID_MAX_LENGTH);
+ }
+ }
+ return Result.success(namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc));
+ }
+
+ /**
+ * edit namespace.
+ *
+ * @param namespaceForm namespace params
+ * @return whether edit ok
+ */
+ @PutMapping
+ @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX
+ + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE)
+ public Result editNamespace(NamespaceForm namespaceForm) throws NacosException {
+ namespaceForm.validate();
+ return Result.success(namespaceOperationService
+ .editNamespace(namespaceForm.getNamespaceId(), namespaceForm.getNamespaceName(),
+ namespaceForm.getNamespaceDesc()));
+ }
+
+ /**
+ * delete namespace by id.
+ *
+ * @param namespaceId namespace ID
+ * @return whether delete ok
+ */
+ @DeleteMapping
+ @Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX
+ + "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE)
+ public Result deleteNamespace(@RequestParam("namespaceId") String namespaceId) {
+ return Result.success(namespaceOperationService.removeNamespace(namespaceId));
+ }
+}
diff --git a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java
index c9e34d03..04b7abde 100644
--- a/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java
+++ b/ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java
@@ -16,10 +16,10 @@
package com.alibaba.nacos.console.exception;
-import com.alibaba.nacos.plugin.auth.exception.AccessException;
import com.alibaba.nacos.common.model.RestResultUtils;
import com.alibaba.nacos.common.utils.ExceptionUtil;
import com.alibaba.nacos.core.utils.Commons;
+import com.alibaba.nacos.plugin.auth.exception.AccessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
@@ -37,19 +37,20 @@ import javax.servlet.http.HttpServletRequest;
*/
@ControllerAdvice
public class ConsoleExceptionHandler {
-
+
private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleExceptionHandler.class);
-
+
@ExceptionHandler(AccessException.class)
private ResponseEntity handleAccessException(AccessException e) {
+ LOGGER.error("got exception. {}", e.getErrMsg());
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getErrMsg());
}
-
+
@ExceptionHandler(IllegalArgumentException.class)
private ResponseEntity handleIllegalArgumentException(IllegalArgumentException e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ExceptionUtil.getAllExceptionMsg(e));
}
-
+
@ExceptionHandler(Exception.class)
private ResponseEntity