zoukankan      html  css  js  c++  java
  • Nacos 多环境配置

    本文探讨Nacos作为配置中心,如何实现不同环境(开发、测试、灰度、正式)的配置管理问题

    就像Maven用groupId、artifactId、version三者来定位jar包在仓库中的位置一样,Nacos也提供了 Namespace (命名空间) 、Data ID (配置集ID)、 Group (组) 来确定一个配置文件(或者叫配置集)

    由此,实现多环境配置的方案也有三种:

    1、用命名空间(namespace)来区分不同的环境,一个命名空间对应一个环境;

    2、用配置组(group)来区分不同的环境,命名空间用默认的public即可,一个组对应一种环境;

    3、用配置集ID(Data ID)名称来区分不同的环境,命名空间和组用默认的即可,通过文件命名来区分;

    接下来,逐个来看

    http://{host}:{port}/nacos

    http://{host}:{port}/nacos/index.html

    默认用户名密码都是nacos

    为了方便演示,这里建了一个名为example的Spring Boot项目

    pom.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     4     <modelVersion>4.0.0</modelVersion>
     5     <parent>
     6         <groupId>org.springframework.boot</groupId>
     7         <artifactId>spring-boot-starter-parent</artifactId>
     8         <version>2.3.6.RELEASE</version>
     9         <relativePath/> <!-- lookup parent from repository -->
    10     </parent>
    11     <groupId>com.example</groupId>
    12     <artifactId>example</artifactId>
    13     <version>0.0.1-SNAPSHOT</version>
    14     <name>example</name>
    15 
    16     <properties>
    17         <java.version>1.8</java.version>
    18         <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
    19     </properties>
    20 
    21     <dependencies>
    22         <dependency>
    23             <groupId>org.springframework.boot</groupId>
    24             <artifactId>spring-boot-starter-web</artifactId>
    25         </dependency>
    26         <dependency>
    27             <groupId>com.alibaba.cloud</groupId>
    28             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    29         </dependency>
    30     </dependencies>
    31 
    32     <dependencyManagement>
    33         <dependencies>
    34             <dependency>
    35                 <groupId>com.alibaba.cloud</groupId>
    36                 <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    37                 <version>${spring-cloud-alibaba.version}</version>
    38                 <type>pom</type>
    39                 <scope>import</scope>
    40             </dependency>
    41         </dependencies>
    42     </dependencyManagement>
    43 
    44     <build>
    45         <plugins>
    46             <plugin>
    47                 <groupId>org.springframework.boot</groupId>
    48                 <artifactId>spring-boot-maven-plugin</artifactId>
    49             </plugin>
    50         </plugins>
    51     </build>
    52 
    53 </project>
    

    bootstrap.yml

    spring:
      application:
        name: example
      cloud:
        nacos:
          config:
            server-addr: 192.168.100.10:8848
            file-extension: yaml
    

    HelloController.java

    package com.example.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author ChengJianSheng
     * @data 2020/11/19
     */
    @RestController
    @RequestMapping("/hello")
    @RefreshScope
    public class HelloController {
    
        @Value("${greet.hello}")
        private String greet;
    
        @GetMapping("/sayHi")
        public String sayHi() {
            return greet;
        }
    }

    1. 利用 Data ID 命名 来区分环境

    利用Data ID命名来区分环境,命名空间和组默认即可

    在 Nacos Spring Cloud 中,dataId 的完整格式如下:

     ${prefix}-${spring.profiles.active}.${file-extension}
    
    • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置 
    • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
    • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

    用命令行启动也是一样的

    例如:

    java -Dspring.profiles.active=test -jar example-0.0.1-SNAPSHOT.jar

    2. 利用 Group 来区分环境

    项目不变,我们把spring.application.name改成example2

    命名空间用默认的public

    java -Dspring.cloud.nacos.config.group=DEV_GROUP -jar example-0.0.1-SNAPSHOT.jar

     

    java -Dspring.cloud.nacos.config.group=TEST_GROUP -jar example-0.0.1-SNAPSHOT.jar

    java -Dspring.profiles.active=test -Dspring.cloud.nacos.config.group=TEST_GROUP -jar example-0.0.1-SNAPSHOT.jar

    如果是这样的话,这个时候,Data ID 命名就应该是 example2-test.yaml 

    3.  利用 Namespace 区分环境

    创建命名空间的时候,如果不指定ID,则自动生成的id就是这样的uuid字符串,我们还是自己指定一个有意义的ID吧

    java -Dspring.cloud.nacos.config.namespace=ns_dev -jar example-0.0.1-SNAPSHOT.jar

     

    java -Dspring.profiles.active=dev -Dspring.cloud.nacos.config.namespace=ns_dev -jar example-0.0.1-SNAPSHOT.jar

     

    java -Dspring.cloud.nacos.config.namespace=ns_test -jar example-0.0.1-SNAPSHOT.jar

     

    java -Dspring.profiles.active=test 
         -Dspring.cloud.nacos.config.namespace=ns_test 
         -Dspring.cloud.nacos.config.group=TEST_GROUP 
         -jar example-0.0.1-SNAPSHOT.jar
    

    4.  小结

    第一种,用 Data ID 区分环境,虽然简单,但是每个项目要创建4个配置文件,随着项目的增多,都在一个命名空间下回显得很混乱,查找起来也不是很方便,而且不利于做权限控制

    第二种,用Group区分,问题也是一样的

    综上,最好的是用Namespace区分环境,清晰明了,而且有利于做权限控制

    https://nacos.io/zh-cn/docs/concepts.html

  • 相关阅读:
    我的知识库(4) java获取页面编码(Z)
    知识库(3)JAVA 正则表达式 (超详细)
    The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts
    某人总结的《英语听力的技巧 》,挺搞的
    我的知识库(5)java单例模式详解
    构建可扩展程序
    SerialPort (RS232 Serial COM Port) in C# .NET
    Python学习笔记——String、Sequences
    UI题目我的答案
    jQuery学习系列学会操纵Form表单元素(1)
  • 原文地址:https://www.cnblogs.com/cjsblog/p/14007311.html
Copyright © 2011-2022 走看看