SpringCloudAliBaba之Nacos配置中心:轻松管理配置文件

文章目录

      • 1、Nacos配置中心使用
        • 1.1、快速开始
      • 2、基于 dataid 为 yaml 的文件扩展名配置方式
      • 3、支持配置的动态更新
      • 4、可支持profile粒度的配置
      • 5、支持自定义 namespace 的配置
      • 6、支持自定义 Group 的配置
      • 7、支持自定义扩展的 Data Id 配置
      • 8、配置的优先级
      • 9、补充@RefreshScope

1、Nacos配置中心使用

官方文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

Nacos提供用于存储配置和其他元数据的key/value存储,为分布式系统中的外部化配置提供服务器和客户端支持。使用Spring Cloud Alibaba Nacos Config,你可以在Nacos Server集中管理你Spring Cloud 应用的外部属性配置。

springcloud config 对比

三大优势

  • springcloud config大部分场景结合git使用,动态变更还需要依赖Spring Cloud Bus 消息总线来通过所有的客户端变化。
  • springclound config不提供可视化界面
  • nacos config使用长轮询配置,一旦配置变更,通知Provide的过程非常的迅速,从速度上秒杀springcloud config几条街

1.1、快速开始

准备配置,nacos server中新建nacos-config.properties

Data ID:    nacos-config.properties

Group  :    DEFAULT_GROUP

配置格式:    Properties

配置内容:   user.name=齐菁菁
            user.age=123456

注意:dataid是以properties(默认的文件扩展名方式)为扩展名

客户端使用方式

创建一个标准的SpringBoot项目,并引入依赖

<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>

启动项:

@SpringBootApplication
public class ConfigApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
        String userName = applicationContext.getEnvironment().getProperty("user.name");
        String userAge = applicationContext.getEnvironment().getProperty("user.age");
        System.err.println("user name :"+userName+"; age: "+userAge);
    }
}

在运行此 Example 之前, 必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址,例如:

bootstrap.properties

spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

启动这个 Example,可以看到如下输出结果:

user name :齐菁菁; age: 123456

2、基于 dataid 为 yaml 的文件扩展名配置方式

spring-cloud-starter-alibaba-nacos-config 对于 yaml 格式也是完美支持的。这个时候只需要完成以下两步:

1、在应用的 bootstrap.properties配置文件中显示的声明 dataid 文件扩展名。如下所示

spring:
  cloud:
    nacos:
      config:
        #修改默认配置文件扩展名(默认是properties)
        file-extension: yaml

2、新建一个dataid为yml的配置

Data ID:        nacos-config.yaml

Group  :        DEFAULT_GROUP

配置格式:        YAML

配置内容:        user:
  			      name: nacos-config.yaml
                  age: 68  

这两步完成后,重启测试程序,可以看到如下输出结果。

2018-11-02 14:59:00.484  INFO 32928 --- [main] 
user name :nacos-config-yaml; age: 68
2018-11-02 14:59:00.529  INFO 32928 --- [-127.0.0.1:8848] 

3、支持配置的动态更新

spring-cloud-starter-alibaba-nacos-config 也支持配置的动态更新,启动 Spring Boot 应用测试的代码如下:

@SpringBootApplication
public class ConfigApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
        while(true) {
            //当动态配置刷新时,会更新到 Enviroment中,因此这里每隔一秒中从Enviroment中获取配置
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            System.err.println("user name :" + userName + "; age: " + userAge);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}

如下所示,当变更user.name时,应用程序中能够获取到最新的值:

user name :齐菁菁; age: 123456
user name :齐菁菁; age: 123456
2022-06-26 20:11:16.652  WARN 10812 --- [34.254.160_8847] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [user.name]
user name :qijingjing; age: 123456
user name :qijingjing; age: 123456
user name :qijingjing; age: 123456
user name :qijingjing; age: 123456

你可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新

4、可支持profile粒度的配置

spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 ${spring.application.name}.${file-extension:properties} 为前缀的基础配置,还加载了dataid为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。

spring:
  profiles:
    active: develop

Nacos 上新增一个dataid为:nacos-config-develop.yaml的基础配置,如下所示:

Data ID:        nacos-config-develop.yaml

Group  :        DEFAULT_GROUP

配置格式:        YAML

配置内容:        current.env: develop-env

启动 Spring Boot 应用测试的代码如下:

@SpringBootApplication
public class ConfigApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
        while(true) {
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            //获取当前部署的环境
            String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
            System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}

启动后,可见控制台的输出结果:

in develop-env enviroment; user name :nacos-config.yaml; age: 68

结论:我们的nacos-config.yamlnacos-config-develop.yaml都起到了作用

知识补充:profile>默认配置文件,优先级大的会覆盖优先级小的,然后形成互补

如果需要切换环境(例如生产环境),只需要更改${spring.profiles.active}参数配置即可。同时在Nacos添加dataid为:nacos-config-product.yaml的配置即可

5、支持自定义 namespace 的配置

最佳配置:

  • namespace:代表不同环境,如开发、测试、生产环境
  • group: 代表项目,如XX医疗项目,XX电商项目
  • dataid:每个项目下面有若干个微服务,每个配置集(dataid)是一个微服务的主配置文件

在nacos server里面创建一个新的命名空间,例如dev

SpringCloudAliBaba之Nacos配置中心:轻松管理配置文件_第1张图片

在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:

spring:
  cloud:
    nacos:
      config:
        # 默认命名空间是public,这里需要填写dev命名空间的环境值
        namespace: f5fa5d97-b3df-4e3e-8aa6-6ad7bc3640bf

然后克隆几个配置文件到dev环境,启动类测试运行即可。

注意:该配置必须放在 bootstrap.yml文件中。此外 spring.cloud.nacos.config.namespace 的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespae,否则将会导致读取不到正确的配置。

6、支持自定义 Group 的配置

在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:

spring:
  cloud:
    nacos:
      config:
        # 组(默认是DEFAULT_GROUP)
        group: STORE_GROUP

克隆配置文件到这个STORE_GROUP组即可

注意:该配置必须放在 bootstrap.yml文件中。并且在添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group 的配置值一致。

7、支持自定义扩展的 Data Id 配置

在之前的基础上加入新的代码:

spring:
  cloud:
    nacos:
      config:
        shared-configs:
          - data-id: com.lili.store.properties
            #不指定的话默认为DEFAULT_GROUP
            group: STORE_GROUP
            # 自定读取刷新配置
            refresh: true
        extension-configs[0]:
          data-id: com.lili.store1.properties
          #不指定的话默认为DEFAULT_GROUP
          group: STORE_GROUP
          # 自定读取刷新配置
          refresh: true

添加两个配置:

Data ID:        com.lili.store.properties

Group  :        STORE_GROUP

配置格式:        properties

配置内容:        user.sex=男
Data ID:        com.lili.store1.properties

Group  :        STORE_GROUP

配置格式:        properties

配置内容:        user.sex=女

启动测试类

@SpringBootApplication
public class ConfigApplication {

    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
        while(true) {
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            String userSex = applicationContext.getEnvironment().getProperty("user.sex");
            //获取当前部署的环境
            String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
            System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge + ";sex: "+ userSex);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}

结果:

in dev-namespace enviroment; user name :nacos-namespace.yaml; age: 68;sex: 女

8、配置的优先级

profile > 默认配置文件 > extension-configs(下标越大优先级越大) > shard-configs(下标越大优先级越大)

9、补充@RefreshScope

@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解即可

@RestController
@RefreshScope
public class HelloController {
    @Value("${user.name}")
    private String name;
    @RequestMapping("/show")
    public String hello(){
        return this.name;
    }
}

你可能感兴趣的:(springcloud,java,spring,cloud,微服务)