Spring Cloud Alibaba组件-Nacos Config

Spring Cloud Alibaba组件-Nacos Config

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

一、读取配置

1. 引入依赖

新建一个nacos-config的spring cloud项目中添加spring-cloud-starter-alibaba-nacos-config依赖

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

2. Nacos中新建配置

启动nacos服务,登录并打开配置管理的配置列表,新建配置。

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

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。注意dataId是以 properties(默认的文件扩展名方式)为扩展名
  • 另外项目还会读取dataId${prefix}的配置,即dataId 为服务名的配置。当${prefix}${prefix}-${spring.profiles.active}.${file-extension}这两种配置文件都存在且其中有相同的配置属性时,后者的优先级更高,会覆盖前者中相同属性的值。

新建两个配置,DataId分别为nacos-service-dev.yaml和nacos-service-pro.yaml,并在其配置内容中分别添加以下内容:

#nacos-service-dev.yaml
user:
    name: 张三
current:
    env: dev
#nacos-service-pro.yaml
user:
    name: 李四
current:
    env: pro

Spring Cloud Alibaba组件-Nacos Config_第1张图片

Spring Cloud Alibaba组件-Nacos Config_第2张图片

3. 项目中配置

必须使用 bootstrap.properties或bootstrap.yml 配置文件来配置nacos的相关内容。

spring:
  profiles:
    active: dev
  application:
    name: nacos-service
  cloud:
    nacos:
      # 当nacos客户端的配置中nacos.core.auth.enabled=true时,username、password不能省略
      username: nacos
      password: nacos
      config:
        server-addr: 127.0.0.1:8848
        # 声明dataid的扩展名,默认为properties
        file-extension: yaml
        #配置动态感知 默认为true
        refresh-enabled: true
        namespace: public

要注意的是: 这里依赖引入的是nacos-config,而不是nacos-discovery,配置方式还是有所差异的,所以直接nacos.username而不是nacos.discovery.username;还有一点当nacos开启权限认证时,也就是将nacos客户端的conf/application.properties文件中nacos.core.auth.enabled属性值改为了true,这时项目配置中的username和password是不能省略的。

其中通过spring.cloud.nacos.config.file-extension指定dataid的文件扩展名。

4. 代码中动态获取配置信息

spring-cloud-starter-alibaba-nacos-config 支持配置的动态更新,当配置变更时,应用程序中能够获取到最新的值。也可以通过配置 spring.cloud.nacos.config.refresh-enabled=false 来关闭动态刷新。

4.1 @Value获取值并通过@RefreshScope注解实现动态感知

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新。

package com.xc.nacos.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author wyp
 */
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${user.name}")
    private String name;

    @RequestMapping("/getName")
    public String getName() {
        System.out.println("name = " + name);
        return name;
    }
}

当使用@Value获取属性不存在时,项目启动报错。

4.2 通过ConfigurableApplicationContext获取并实现动态感知

先在启动类中获取ConfigurableApplicationContext对象

package com.xc.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * @author wyp
 */
@SpringBootApplication
public class NacosApplication {

    private static ConfigurableApplicationContext applicationContext;

    public static void main(String[] args) {
        NacosApplication.applicationContext = SpringApplication.run(NacosApplication.class, args);
    }

    public static ConfigurableApplicationContext getApplicationContext() {
        return applicationContext;
    }
}

之后便可以通过ConfigurableApplicationContext对象.getEnvironment().getProperty(键)获取,如下:

String username = NacosApplication.getApplicationContext().getEnvironment().getProperty("user.name");

5. 支持自定义 namespace 的配置

命名空间用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

在项目中没有明确指定 spring.cloud.nacos.config.namespace 配置的情况下, 默认使用的是 Nacos 上 public 这个namespae。此外 spring.cloud.nacos.config.namespace 的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。如果需要使用自定义的命名空间,可以通过以下配置来实现:

spring.cloud.nacos.config.namespace=18b83298-12e2-4186-94b0-dff6cee3a8c9

6. 支持自定义group的配置

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

spring.cloud.nacos.config.group=CUSTOM_GROUP

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

通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。

7.1 extension-configs

spring.cloud.nacos.config.extension-configs中extension-configs是一个Config类集合。Config类中有三个属性,dataId、group(默认为"DEFAULT_GROUP")、refresh(默认为false)。

spring:
  cloud:
    nacos:
      config:
        extension-configs:
          # [0]
          - data-id: nacos-service.common.e1.properties
            refresh: true
            group: DEFAULT_GROUP
          # [1]
          - data-id: nacos-service.common.e2.properties
            refresh: true
            group: DEFAULT_GROUP

上面配置添加了在默认的组 DEFAULT_GROUP且支持配置的动态刷新的两个配置,extension-configs中的配置项优先级靠索引值大小,索引值越大的优先级越大。

7.2 shared-configs

spring.cloud.nacos.config.shared-configs中shared-configs是一个Config类集合。用法和extension-configs一样。

spring:
  cloud:
    nacos:
      config:
        shared-configs[0]:
          data-id: nacos-service.common.s1.properties
          refresh: true
          group: DEFAULT_GROUP
        shared-configs[1]:
          data-id: nacos-service.common.s2.properties
          refresh: true
          group: DEFAULT_GROUP

上面配置添加了在默认的组 DEFAULT_GROUP且支持配置的动态刷新的两个配置,shared-configs中的配置项优先级靠索引值大小,索引值越大的优先级越大。

7.3 extension-configs与shared-configs比较

两者的data-id属性值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。

extension-configs的优先级大于shared-configs,所以shared-configs更加清晰的在多个应用间配置共享的 Data Id。

8. 配置优先级

上面一共提到了四种配置:

  • ${prefix}-${spring.profiles.active}.${file-extension}
  • ${prefix}
  • extension-configs
  • shared-configs

优先级从大到小为①②③④。

你可能感兴趣的:(Spring,Cloud,Alibaba,java,spring,boot,spring,cloud)