Spring Cloud 阿里巴巴 Nacos 配置

本文介绍了如何使用SpringCloudAlibabaNacos进行配置管理,包括引入NacosConfig启动器、配置DataId和GROUP、配置服务器、客户端使用、动态配置更新、Profile级别配置以及命名空间和自定义组的支持。Nacos提供了一种方便的方式,用于构建云原生应用的动态服务发现和配置管理。
摘要由CSDN通过智能技术生成

Spring Cloud 阿里巴巴 Nacos 配置

Nacos 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序。

使用 Spring Cloud Alibaba Nacos Config 基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理能力。

如何引入 Nacos Config 进行配置

请使用组 ID 为com.alibaba.cloud和工件 ID 为的启动器spring-cloud-starter-alibaba-nacos-config

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

快速开始

Nacos Config 使用 DataId 和 GROUP 来确定配置。

下图是DataId使用myDataid,GROUP使用DEFAULT_GROUP,配置了一个Properties格式的配置项:

TB1N2nxbRr0gK0jSZFnXXbRRXXa 2448 1194

图 2. Nacos 配置项

初始化 Nacos 服务器

具体的启动方式可以参考Spring Cloud Alibaba Nacos Discovery部分的“Nacos服务器启动”部分。

Nacos Server启动后,添加如何配置:

Data ID:    nacos-config.properties

Group  :    DEFAULT_GROUP

Configuration format:    Properties

Configuration content:   user.name=nacos-config-properties
            user.age=90
客户端上的使用

如果您想使用 Nacos 来管理您的应用程序的外部化配置,请使用组 ID 为 ascom.alibaba.cloud和工件 ID 为的 starter spring-cloud-starter-alibaba-nacos-config

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

现在我们可以创建一个标准的 Spring Boot 应用程序。

@SpringBootApplication
public class NacosConfigApplication {

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

在运行这个例子之前,我们需要在 bootstrap.properties 中配置 Nacos 服务器的地址。例如:

引导程序属性

# DataId By default, the `spring.application.name` configuration is combined with the file extension (the configuration format uses properties by default), and the GROUP is not configured to use DEFAULT_GROUP by default. Therefore, the Nacos Config configuration corresponding to the configuration file has a DataId of nacos-config.properties and a GROUP of DEFAULT_GROUP
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

如果使用域名访问 Nacos,格式spring.cloud.nacos.config.server-addr应为Domain name:port. 例如,如果 Nacos 域名是 abc.com.nacos,listerner 端口是 80,那么配置应该是spring.cloud.nacos.config.server-addr=abc.com.nacos:80. 80 端口不能省略。

运行此示例,您可以看到以下输出:

2018-11-02 14:24:51.638  INFO 32700 --- [main] c.a.demo.provider.NacosConfigApplication    : Started NacosConfigApplication in 14.645 seconds (JVM running for 15.139)
user name :nacos-config-properties; age: 90
2018-11-02 14:24:51.688  INFO 32700 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@a8c5e74: startup date [Fri Nov 02 14:24:51 CST 2018]; root of context hierarchy

使用 YAML 格式的 DataId 添加配置

Nacos Config 也支持 yaml 格式。您只需完成以下 2 个步骤。

1、在bootstrap.properties文件中添加如下行声明DataId的格式为yaml。如下:

引导程序属性

spring.cloud.nacos.config.file-extension=yaml

2、在Nacos控制台添加DataId为yaml格式的配置,如下图:

Data ID:        nacos-config.yaml

Group  :        DEFAULT_GROUP

Configuration format:        YAML

Configuration content:        user.name: nacos-config-yaml
                              user.age: 68

完成前两步后,重新启动测试程序,您将看到如下结果。

2018-11-02 14:59:00.484  INFO 32928 --- [main] c.a.demo.provider.NacosConfigApplication:Started NacosConfigApplication in 14.183 seconds (JVM running for 14.671)
user name :nacos-config-yaml; age: 68
2018-11-02 14:59:00.529  INFO 32928 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@265a478e: startup date [Fri Nov 02 14:59:00 CST 2018]; root of context hierarchy

支持动态配置更新

Nacos Config 还支持动态配置更新。启动Spring Boot应用测试的代码如下:

@SpringBootApplication
public class NacosConfigApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
        while(true) {
            //When configurations are refreshed dynamically, they will be updated in the Enviroment, therefore here we retrieve configurations from Environment every other second.
            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 :nacos-config-yaml; age: 68
user name :nacos-config-yaml; age: 68
user name :nacos-config-yaml; age: 68
2018-11-02 15:04:25.069  INFO 32957 --- [-127.0.0.1:8848] o.s.boot.SpringApplication               : Started application in 0.144 seconds (JVM running for 71.752)
2018-11-02 15:04:25.070  INFO 32957 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@10c89124: startup date [Fri Nov 02 15:04:25 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@6520af7
2018-11-02 15:04:25.071  INFO 32957 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6520af7: startup date [Fri Nov 02 15:04:24 CST 2018]; root of context hierarchy
//Read the updated value from Enviroment
user name :nacos-config-yaml-update; age: 68
user name :nacos-config-yaml-update; age: 68

您可以使用此设置spring.cloud.nacos.config.refresh.enabled=false禁用自动刷新。

支持profile级别的配置

当 Nacos Config 加载配置时,也会加载DataId 为${spring.application.name}. ${file-extension:properties}、 DataId 为 的基本配置${spring.application.name}-${profile}. ${file-extension:properties}。如果需要使用来自不同环境的不同配置,可以使用${spring.profiles.active}Spring 提供的配置。

spring.profiles.active=develop

在配置文件中指定时,${spring.profiles.active} 必须放在 bootstrap.properties 中。

在Nacos中添加一个基础配置,DataId为nacos-config-develop.yaml,如下图:

Data ID:        nacos-config-develop.yaml

Group  :        DEFAULT_GROUP

Configuration format:        YAML

Configuration content:        current.env: develop-env

运行以下 Spring Boot 应用程序测试代码:

@SpringBootApplication
public class NacosConfigApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
        while(true) {
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            //Get the current deployment environment
            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-update; age: 68
2018-11-02 15:34:25.013  INFO 33014 --- [ Thread-11] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6f1c29b7: startup date [Fri Nov 02 15:33:57 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@63355449

要切换到生产环境,只需要更改${spring.profiles.active}. 如下图所示:

spring.profiles.active=product

同时,在你的生产环境的 Nacos 中添加带有 DataId 的基本配置。例如,您可以在生产环境的 Nacos 中添加 DataId 为 nacos-config-product.yaml 的配置:

Data ID:        nacos-config-product.yaml

Group  :        DEFAULT_GROUP

Configuration format:        YAML

Configuration content:        current.env: product-env

启动测试程序,您将看到以下结果:

in product-env enviroment; user name :nacos-config-yaml-update; age: 68
2018-11-02 15:42:14.628  INFO 33024 --- [Thread-11] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6aa8e115: startup date [Fri Nov 02 15:42:03 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@19bb07ed

在本例中,我们使用spring.profiles.active=<profilename>方法将配置编码到配置文件中。在实际场景中,这个变量需要在不同的环境中有所不同。您可以使用该-Dspring.profiles.active=<profile>参数指定配置,以便您可以轻松地在不同环境之间切换。

支持自定义命名空间

关于 Nacos 中的命名空间的详细信息,请参阅Nacos 概念

命名空间用于隔离不同租户的配置。组和数据 ID 在不同的命名空间中可以相同。命名空间的典型场景是不同环境的配置隔离,例如开发/测试环境和生产环境(配置和服务等)的隔离。

如果没有指定命名空间,则使用 Nacos 的“公共”命名空间${spring.cloud.nacos.config.namespace}。您还可以通过以下方式指定自定义命名空间:

spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7

此配置必须在 bootstrap.properties 文件中。的值spring.cloud.nacos.config.namespace是命名空间的id,id的值可以从Nacos控制台获取。添加配置时不要选择其他命名空间。否则无法正确检索配置。

支持自定义组

{spring.cloud.nacos.config.group}未定义配置时,默认使用 DEFAULT_GROUP 。如果需要定义自己的组,可以在以下属性中定义:

spring.cloud.nacos.config.group=DEVELOP_GROUP

此配置必须在 bootstrap.properties 文件中,且 Group 的值必须与spring.cloud.nacos.config.group.

支持自定义数据 ID

从 Spring Cloud Alibaba Nacos Config 开始,data id 可以自定义。这部分的详细设计可以参考Github issue。以下是一个完整的示例:

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

# config external configuration
# 1. Data Id is in the default group of DEFAULT_GROUP, and dynamic refresh of configurations is not supported.
spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties

# 2. Data Id is not in the default group, and dynamic refresh of configurations is not supported.
spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP

# 3. Data Id is not in the default group and dynamic referesh of configurations is supported.
spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUP
spring.cloud.nacos.config.ext-config[2].refresh=true

我们可以看到:

  • 通过配置支持多个数据ID spring.cloud.nacos.config.ext-config[n].data-id
  • 通过配置自定义数据组spring.cloud.nacos.config.ext-config[n].group。如果未指定,则使用 DEFAULT_GROUP。
  • 通过配置更改配置时,控制此数据id是否支持动态刷新配置spring.cloud.nacos.config.ext-config[n].refresh。默认情况下不支持。

当同时配置多个 Data Id 时,优先级由 中的“n”值定义spring.cloud.nacos.config.ext-config[n].data-id。值越大,优先级越高。

的值spring.cloud.nacos.config.ext-config[n].data-id必须有一个文件扩展名,它可以是属性或 yaml/yml。中的设置spring.cloud.nacos.config.file-extension对自定义 Data Id 文件扩展名没有任何影响。

自定义 Data Id 的配置允许在多个应用程序之间共享配置,也可以支持一个应用程序的多个配置。

为了更清晰地在多个应用程序之间共享数据id,还可以使用以下方法:

spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.properties
spring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties

我们可以看到:

  • 可以使用 配置多个共享数据 id spring.cloud.nacos.config.shared-dataids,数据 id 用逗号分隔。
  • spring.cloud.nacos.config.refreshable-dataids用于控制在更新配置时动态刷新哪些数据id,以及应用程序可以检索到最新的配置值。数据 ID 用逗号分隔。如果未指定,所有共享数据 id 将不会被动态刷新。

Nacos 配置端点

Nacos Config 在内部提供了一个 Endpoint,对应的端点 id 为nacos-config.

端点暴露的 json 包含三个属性:

  1. 来源:当前应用程序配置数据信息
  2. RefreshHistory:配置刷新历史
  3. NacosConfigProperties:显示当前服务的当前基本 Nacos 配置

以下显示了服务实例如何访问 Endpoint:

{
	"NacosConfigProperties": {
		"serverAddr": "127.0.0.1:8848",
		"encode": null,
		"group": "DEFAULT_GROUP",
		"prefix": null,
		"fileExtension": "properties",
		"timeout": 3000,
		"endpoint": null,
		"namespace": null,
		"accessKey": null,
		"secretKey": null,
		"contextPath": null,
		"clusterName": null,
		"name": null,
		"sharedDataids": "base-common.properties,common.properties",
		"refreshableDataids": "common.properties",
		"extConfig": null
	},
	"RefreshHistory": [{
		"timestamp": "2019-07-29 11:20:04",
		"dataId": "nacos-config-example.properties",
		"md5": "7d5d7f1051ff6571e2ec9f90887d9d91"
	}],
	"Sources": [{
		"lastSynced": "2019-07-29 11:19:04",
		"dataId": "common.properties"
	}, {
		"lastSynced": "2019-07-29 11:19:04",
		"dataId": "base-common.properties"
	}, {
		"lastSynced": "2019-07-29 11:19:04",
		"dataId": "nacos-config-example.properties"
	}]
}

禁用 Nacos 配置自动配置

设置 spring.cloud.nacos.config.enabled = false 以禁用 Spring Cloud Nacos Config AutoConfiguration。

关于 Nacos Config Starter 配置的更多信息

下面是 Nacos Config 的 starter 的其他配置:

配置钥匙默认值描述
服务器地址spring.cloud.nacos.config.server-addrNacos Server监听的IP和端口
来自 nacos 配置的 Dataidspring.cloud.nacos.config.name先取前缀,再取名字,最后取spring.application.name
来自 nacos 配置的 Dataidspring.cloud.nacos.config.prefix先取前缀,再取名字,最后取spring.application.name
nacos 配置内容的编码spring.cloud.nacos.config.encodenacos 配置内容的编码
用于 nacos 配置的 GROUPspring.cloud.nacos.config.groupDEFAULT_GROUP用于 nacos 配置的 GROUP
nacos config dataId 的后缀,也是配置内容的文件扩展名。spring.cloud.nacos.config.fileExtensionpropertiesnacos config dataId的后缀,也是config内容的文件扩展名(现在支持properties或者yaml(yml))
从 nacos 获取配置超时spring.cloud.nacos.config.timeout3000从 nacos 获取配置超时
端点spring.cloud.nacos.config.endpoint端点
命名空间spring.cloud.nacos.config.namespace命名空间
访问密钥spring.cloud.nacos.config.accessKey阿里云账号accesskey
密钥spring.cloud.nacos.config.secretKey阿里云账号秘钥
Nacos Server的上下文路径spring.cloud.nacos.config.contextPathNacos Server的上下文路径
集群名称spring.cloud.nacos.config.clusterName集群名称
共享配置的Dataidspring.cloud.nacos.config.sharedDataids共享配置的Dataid,用“,”分隔
共享配置的动态刷新 dataidspring.cloud.nacos.config.refreshableDataids共享配置的动态刷新dataid,用“,”分割
自定义数据标识spring.cloud.nacos.config.extConfig这是一个列表,由ConfigPOJO构建。Config有 3 个属性dataIdgrouprefresh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕布辕门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值