Procházet zdrojové kódy

update nacos 2.1.2 => 2.2.0 适配升级

疯狂的狮子li před 3 roky
rodič
revize
78985f076b
25 změnil soubory, kde provedl 633 přidání a 97 odebrání
  1. 1 1
      ruoyi-common/ruoyi-common-alibaba-bom/pom.xml
  2. 45 6
      ruoyi-visual/ruoyi-nacos/pom.xml
  3. 5 5
      ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/HealthController.java
  4. 30 75
      ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/NamespaceController.java
  5. 146 0
      ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/controller/v2/NamespaceControllerV2.java
  6. 6 5
      ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java
  7. 131 0
      ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java
  8. 111 0
      ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java
  9. 149 0
      ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java
  10. 7 3
      ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties
  11. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-auth-2.2.0.jar
  12. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-cmdb-2.2.0.jar
  13. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-config-2.1.2.jar
  14. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-config-2.2.0.jar
  15. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-consistency-2.2.0.jar
  16. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-contrl-plugin-2.2.0.jar
  17. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-core-2.2.0.jar
  18. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-istio-2.2.0.jar
  19. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-naming-2.1.2.jar
  20. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-naming-2.2.0.jar
  21. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-plugin-default-impl-2.2.0.jar
  22. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-prometheus-2.2.0.jar
  23. binární
      ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-sys-2.2.0.jar
  24. 2 2
      ruoyi-visual/ruoyi-nacos/src/main/resources/static/index.html
  25. 0 0
      ruoyi-visual/ruoyi-nacos/src/main/resources/static/js/main.js

+ 1 - 1
ruoyi-common/ruoyi-common-alibaba-bom/pom.xml

@@ -17,7 +17,7 @@
         <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
         <sentinel.version>1.8.6</sentinel.version>
         <seata.version>1.6.0</seata.version>
-        <nacos.client.version>2.1.2</nacos.client.version>
+        <nacos.client.version>2.2.0</nacos.client.version>
         <dubbo.version>3.1.3</dubbo.version>
         <spring.context.support.version>1.0.11</spring.context.support.version>
     </properties>

+ 45 - 6
ruoyi-visual/ruoyi-nacos/pom.xml

@@ -27,7 +27,7 @@
     <packaging>jar</packaging>
 
     <properties>
-        <nacos.version>2.1.2</nacos.version>
+        <nacos.version>2.2.0</nacos.version>
         <nacos.lib.path>${project.basedir}/src/main/resources/lib</nacos.lib.path>
     </properties>
 
@@ -72,6 +72,13 @@
             <scope>system</scope>
             <systemPath>${nacos.lib.path}/nacos-consistency-${nacos.version}.jar</systemPath>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-contrl-plugin</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-contrl-plugin-${nacos.version}.jar</systemPath>
+        </dependency>
         <dependency>
             <groupId>com.alibaba.nacos</groupId>
             <artifactId>nacos-core</artifactId>
@@ -100,6 +107,13 @@
             <scope>system</scope>
             <systemPath>${nacos.lib.path}/nacos-plugin-default-impl-${nacos.version}.jar</systemPath>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-prometheus</artifactId>
+            <version>${nacos.version}</version>
+            <scope>system</scope>
+            <systemPath>${nacos.lib.path}/nacos-prometheus-${nacos.version}.jar</systemPath>
+        </dependency>
         <dependency>
             <groupId>com.alibaba.nacos</groupId>
             <artifactId>nacos-sys</artifactId>
@@ -107,6 +121,26 @@
             <scope>system</scope>
             <systemPath>${nacos.lib.path}/nacos-sys-${nacos.version}.jar</systemPath>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-custom-environment-plugin</artifactId>
+            <version>${nacos.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-datasource-plugin</artifactId>
+            <version>${nacos.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-encryption-plugin</artifactId>
+            <version>${nacos.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-trace-plugin</artifactId>
+            <version>${nacos.version}</version>
+        </dependency>
         <dependency>
             <groupId>com.alibaba.nacos</groupId>
             <artifactId>nacos-common</artifactId>
@@ -120,6 +154,12 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.logging.log4j</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -208,6 +248,10 @@
             <groupId>io.micrometer</groupId>
             <artifactId>micrometer-registry-elastic</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>io.envoyproxy.controlplane</groupId>
@@ -216,11 +260,6 @@
         </dependency>
 
         <!-- log -->
-        <!-- log4j通过slf4j来代理 -->
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>log4j-over-slf4j</artifactId>
-        </dependency>
         <!-- apache commons logging通过slf4j来代理 -->
         <dependency>
             <groupId>org.slf4j</groupId>

+ 5 - 5
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);

+ 30 - 75
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 CommonPersistService commonPersistService;
+
     @Autowired
-    private PersistService persistService;
-    
+    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<List<Namespace>> getNamespaces() {
-        // TODO 获取用kp
-        List<TenantInfo> tenantInfos = persistService.findTenantByKp(DEFAULT_KP);
-        Namespace namespace0 = new Namespace("", DEFAULT_NAMESPACE, DEFAULT_QUOTA,
-                persistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType());
-        List<Namespace> 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);
     }
-    
+
 }

+ 146 - 0
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<List<Namespace>> 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<NamespaceAllInfo> 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<Boolean> 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<Boolean> 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<Boolean> deleteNamespace(@RequestParam("namespaceId") String namespaceId) {
+        return Result.success(namespaceOperationService.removeNamespace(namespaceId));
+    }
+}

+ 6 - 5
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<String> handleAccessException(AccessException e) {
+        LOGGER.error("got exception. {}", e.getErrMsg());
         return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getErrMsg());
     }
-    
+
     @ExceptionHandler(IllegalArgumentException.class)
     private ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException e) {
         return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ExceptionUtil.getAllExceptionMsg(e));
     }
-    
+
     @ExceptionHandler(Exception.class)
     private ResponseEntity<Object> handleException(HttpServletRequest request, Exception e) {
         String uri = request.getRequestURI();

+ 131 - 0
ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java

@@ -0,0 +1,131 @@
+/*
+ * 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.exception;
+
+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.common.utils.ExceptionUtil;
+import com.alibaba.nacos.plugin.auth.exception.AccessException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.Order;
+import org.springframework.dao.DataAccessException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.converter.HttpMessageConversionException;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.web.HttpMediaTypeException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import javax.servlet.ServletException;
+import java.io.IOException;
+
+/**
+ * Exception Handler for Nacos API.
+ * @author dongyafei
+ * @date 2022/7/22
+ */
+
+@Order(-1)
+@ControllerAdvice(annotations = {NacosApi.class})
+@ResponseBody
+public class NacosApiExceptionHandler {
+    
+    private static final Logger LOGGER = LoggerFactory.getLogger(NacosApiExceptionHandler.class);
+    
+    @ExceptionHandler(NacosApiException.class)
+    public ResponseEntity<Result<String>> handleNacosApiException(NacosApiException e) {
+        LOGGER.error("got exception. {} {}", e.getErrAbstract(), e.getErrMsg());
+        return ResponseEntity.status(e.getErrCode()).body(new Result<>(e.getDetailErrCode(), e.getErrAbstract(), e.getErrMsg()));
+    }
+    
+    @ExceptionHandler(NacosException.class)
+    public ResponseEntity<Result<String>> handleNacosException(NacosException e) {
+        LOGGER.error("got exception. {}", e.getErrMsg());
+        return ResponseEntity.status(e.getErrCode()).body(Result.failure(ErrorCode.SERVER_ERROR, e.getErrMsg()));
+    }
+    
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(HttpMessageNotReadableException.class)
+    public Result<String> handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
+        LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
+        return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage());
+    }
+    
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(HttpMessageConversionException.class)
+    public Result<String> handleHttpMessageConversionException(HttpMessageConversionException e) {
+        LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
+        return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage());
+    }
+    
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(NumberFormatException.class)
+    public Result<String> handleNumberFormatException(NumberFormatException e) {
+        LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
+        return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage());
+    }
+    
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(IllegalArgumentException.class)
+    public Result<String> handleIllegalArgumentException(IllegalArgumentException e) {
+        LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
+        return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage());
+    }
+    
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(MissingServletRequestParameterException.class)
+    public Result<String> handleMissingServletRequestParameterException(MissingServletRequestParameterException e) {
+        LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
+        return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage());
+    }
+    
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    @ExceptionHandler(HttpMediaTypeException.class)
+    public Result<String> handleHttpMediaTypeException(HttpMediaTypeException e) {
+        LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
+        return Result.failure(ErrorCode.MEDIA_TYPE_ERROR, e.getMessage());
+    }
+    
+    @ResponseStatus(HttpStatus.FORBIDDEN)
+    @ExceptionHandler(AccessException.class)
+    public Result<String> handleAccessException(AccessException e) {
+        LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
+        return Result.failure(ErrorCode.ACCESS_DENIED, e.getErrMsg());
+    }
+    
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    @ExceptionHandler(value = {DataAccessException.class, ServletException.class, IOException.class})
+    public Result<String> handleDataAccessException(Exception e) {
+        LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
+        return Result.failure(ErrorCode.DATA_ACCESS_ERROR, e.getMessage());
+    }
+    
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    @ExceptionHandler(Exception.class)
+    public Result<String> handleOtherException(Exception e) {
+        LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
+        return Result.failure(e.getMessage());
+    }
+}

+ 111 - 0
ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/model/form/NamespaceForm.java

@@ -0,0 +1,111 @@
+/*
+ * 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.model.form;
+
+import com.alibaba.nacos.api.exception.NacosException;
+import com.alibaba.nacos.api.exception.api.NacosApiException;
+import com.alibaba.nacos.api.model.v2.ErrorCode;
+import org.springframework.http.HttpStatus;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * NamespaceForm.
+ * @author dongyafei
+ * @date 2022/8/16
+ */
+public class NamespaceForm implements Serializable {
+    
+    private static final long serialVersionUID = -1078976569495343487L;
+    
+    private String namespaceId;
+    
+    private String namespaceName;
+    
+    private String namespaceDesc;
+    
+    public NamespaceForm() {
+    }
+    
+    public NamespaceForm(String namespaceId, String namespaceName, String namespaceDesc) {
+        this.namespaceId = namespaceId;
+        this.namespaceName = namespaceName;
+        this.namespaceDesc = namespaceDesc;
+    }
+    
+    public String getNamespaceId() {
+        return namespaceId;
+    }
+    
+    public void setNamespaceId(String namespaceId) {
+        this.namespaceId = namespaceId;
+    }
+    
+    public String getNamespaceName() {
+        return namespaceName;
+    }
+    
+    public void setNamespaceName(String namespaceName) {
+        this.namespaceName = namespaceName;
+    }
+    
+    public String getNamespaceDesc() {
+        return namespaceDesc;
+    }
+    
+    public void setNamespaceDesc(String namespaceDesc) {
+        this.namespaceDesc = namespaceDesc;
+    }
+    
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        NamespaceForm that = (NamespaceForm) o;
+        return Objects.equals(namespaceId, that.namespaceId) && Objects.equals(namespaceName, that.namespaceName)
+                && Objects.equals(namespaceDesc, that.namespaceDesc);
+    }
+    
+    @Override
+    public int hashCode() {
+        return Objects.hash(namespaceId, namespaceName, namespaceDesc);
+    }
+    
+    @Override
+    public String toString() {
+        return "NamespaceVo{" + "namespaceId='" + namespaceId + '\'' + ", namespaceName='" + namespaceName + '\''
+                + ", namespaceDesc='" + namespaceDesc + '\'' + '}';
+    }
+    
+    /**
+     * check required param.
+     * @throws NacosException NacosException
+     */
+    public void validate() throws NacosException {
+        if (null == namespaceId) {
+            throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, "required parameter 'namespaceId' is missing");
+        }
+        if (null == namespaceName) {
+            throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, "required parameter 'namespaceName' is missing");
+        }
+    }
+}

+ 149 - 0
ruoyi-visual/ruoyi-nacos/src/main/java/com/alibaba/nacos/console/service/NamespaceOperationService.java

@@ -0,0 +1,149 @@
+/*
+ * 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.service;
+
+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.common.utils.StringUtils;
+import com.alibaba.nacos.config.server.model.TenantInfo;
+import com.alibaba.nacos.config.server.service.repository.CommonPersistService;
+import com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService;
+import com.alibaba.nacos.console.enums.NamespaceTypeEnum;
+import com.alibaba.nacos.console.model.Namespace;
+import com.alibaba.nacos.console.model.NamespaceAllInfo;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * NamespaceOperationService.
+ *
+ * @author dongyafei
+ * @date 2022/8/16
+ */
+
+@Service
+public class NamespaceOperationService {
+    
+    private final ConfigInfoPersistService configInfoPersistService;
+    
+    private final CommonPersistService commonPersistService;
+    
+    private static final String DEFAULT_NAMESPACE = "public";
+    
+    private static final String DEFAULT_NAMESPACE_SHOW_NAME = "Public";
+    
+    private static final String DEFAULT_NAMESPACE_DESCRIPTION = "Public Namespace";
+    
+    private static final int DEFAULT_QUOTA = 200;
+    
+    private static final String DEFAULT_CREATE_SOURCE = "nacos";
+    
+    private static final String DEFAULT_TENANT = "";
+    
+    private static final String DEFAULT_KP = "1";
+    
+    public NamespaceOperationService(ConfigInfoPersistService configInfoPersistService,
+            CommonPersistService commonPersistService) {
+        this.configInfoPersistService = configInfoPersistService;
+        this.commonPersistService = commonPersistService;
+    }
+    
+    public List<Namespace> getNamespaceList() {
+        // TODO 获取用kp
+        List<TenantInfo> tenantInfos = commonPersistService.findTenantByKp(DEFAULT_KP);
+        
+        Namespace namespace0 = new Namespace("", DEFAULT_NAMESPACE, DEFAULT_QUOTA,
+                configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType());
+        List<Namespace> namespaceList = new ArrayList<>();
+        namespaceList.add(namespace0);
+        
+        for (TenantInfo tenantInfo : tenantInfos) {
+            int configCount = configInfoPersistService.configInfoCount(tenantInfo.getTenantId());
+            Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(),
+                    tenantInfo.getTenantDesc(), DEFAULT_QUOTA, configCount, NamespaceTypeEnum.CUSTOM.getType());
+            namespaceList.add(namespaceTmp);
+        }
+        return namespaceList;
+    }
+    
+    /**
+     * query namespace by namespace id.
+     *
+     * @param namespaceId namespace Id.
+     * @return NamespaceAllInfo.
+     */
+    public NamespaceAllInfo getNamespace(String namespaceId) throws NacosException {
+        // TODO 获取用kp
+        if (StringUtils.isBlank(namespaceId)) {
+            return new NamespaceAllInfo(namespaceId, DEFAULT_NAMESPACE_SHOW_NAME, DEFAULT_QUOTA,
+                    configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType(),
+                    DEFAULT_NAMESPACE_DESCRIPTION);
+        } else {
+            TenantInfo tenantInfo = commonPersistService.findTenantByKp(DEFAULT_KP, namespaceId);
+            if (null == tenantInfo) {
+                throw new NacosApiException(HttpStatus.NOT_FOUND.value(), ErrorCode.NAMESPACE_NOT_EXIST,
+                        "namespaceId [ " + namespaceId + " ] not exist");
+            }
+            int configCount = configInfoPersistService.configInfoCount(namespaceId);
+            return new NamespaceAllInfo(namespaceId, tenantInfo.getTenantName(), DEFAULT_QUOTA, configCount,
+                    NamespaceTypeEnum.CUSTOM.getType(), tenantInfo.getTenantDesc());
+        }
+    }
+    
+    /**
+     * create namespace.
+     *
+     * @param namespaceId   namespace ID
+     * @param namespaceName namespace Name
+     * @param namespaceDesc namespace Desc
+     * @return whether create ok
+     */
+    public Boolean createNamespace(String namespaceId, String namespaceName, String namespaceDesc)
+            throws NacosException {
+        // TODO 获取用kp
+        if (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0) {
+            throw new NacosApiException(HttpStatus.INTERNAL_SERVER_ERROR.value(), ErrorCode.NAMESPACE_ALREADY_EXIST,
+                    "namespaceId [" + namespaceId + "] already exist");
+        }
+    
+        commonPersistService
+                .insertTenantInfoAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc, DEFAULT_CREATE_SOURCE,
+                        System.currentTimeMillis());
+        return true;
+    }
+    
+    /**
+     * edit namespace.
+     */
+    public Boolean editNamespace(String namespaceId, String namespaceName, String namespaceDesc) {
+        // TODO 获取用kp
+        commonPersistService.updateTenantNameAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc);
+        return true;
+    }
+    
+    /**
+     * remove namespace.
+     */
+    public Boolean removeNamespace(String namespaceId) {
+        commonPersistService.removeTenantInfoAtomic(DEFAULT_KP, namespaceId);
+        return true;
+    }
+}

+ 7 - 3
ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties

@@ -31,8 +31,9 @@ server.error.include-message=ON_PARAM
 
 spring.application.name=ruoyi-nacos
 #*************** Config Module Related Configurations ***************#
-### If use MySQL as datasource:
-spring.datasource.platform=mysql
+### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
+spring.sql.init.platform=mysql
+nacos.plugin.datasource.log.enabled=true
 
 ### Count of DB:
 db.num=1
@@ -139,6 +140,8 @@ nacos.core.auth.plugin.nacos.token.secret.key=SecretKey0123456789012345678901234
 #nacos.core.auth.ldap.userDn=cn=admin,${nacos.core.auth.ldap.basedc}
 #nacos.core.auth.ldap.password=admin
 #nacos.core.auth.ldap.userdn=cn={0},dc=example,dc=org
+#nacos.core.auth.ldap.filter.prefix=uid
+#nacos.core.auth.ldap.case.sensitive=true
 
 
 #*************** Istio Related Configurations ***************#
@@ -189,4 +192,5 @@ nacos.istio.mcp.server.enabled=false
 # nacos.core.protocol.raft.data.read_index_type=ReadOnlySafe
 ### rpc request timeout, default 5 seconds
 # nacos.core.protocol.raft.data.rpc_request_timeout_ms=5000
-
+### enable to support prometheus service discovery
+#nacos.prometheus.metrics.enabled=true

binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-auth-2.1.2.jar → ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-auth-2.2.0.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-cmdb-2.1.2.jar → ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-cmdb-2.2.0.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-config-2.1.2.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-config-2.2.0.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-consistency-2.1.2.jar → ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-consistency-2.2.0.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-contrl-plugin-2.2.0.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-core-2.1.2.jar → ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-core-2.2.0.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-istio-2.1.2.jar → ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-istio-2.2.0.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-naming-2.1.2.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-naming-2.2.0.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-plugin-default-impl-2.1.2.jar → ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-plugin-default-impl-2.2.0.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-prometheus-2.2.0.jar


binární
ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-sys-2.1.2.jar → ruoyi-visual/ruoyi-nacos/src/main/resources/lib/nacos-sys-2.2.0.jar


+ 2 - 2
ruoyi-visual/ruoyi-nacos/src/main/resources/static/index.html

@@ -35,7 +35,7 @@
 	<link rel="stylesheet" type="text/css" href="console-ui/public/css/icon.css">
 	<link rel="stylesheet" type="text/css" href="console-ui/public/css/font-awesome.css">
 	<!-- 第三方css结束 -->
-<link href="./css/main.css?1309f9b6b4e9f81858cb" rel="stylesheet"></head>
+<link href="./css/main.css?c18229e4d79449526734" rel="stylesheet"></head>
 
 <body>
 	<div id="root" style="overflow:hidden"></div>
@@ -56,6 +56,6 @@
 	<script src="console-ui/public/js/merge.js"></script>
 	<script src="console-ui/public/js/loader.js"></script>
 	<!-- 第三方js结束 -->
-<script type="text/javascript" src="./js/main.js?1309f9b6b4e9f81858cb"></script></body>
+<script type="text/javascript" src="./js/main.js?c18229e4d79449526734"></script></body>
 
 </html>

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
ruoyi-visual/ruoyi-nacos/src/main/resources/static/js/main.js


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů