赞
踩
Nacos 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序。
使用 Spring Cloud Alibaba Nacos Config 基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理能力。
请使用组 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格式的配置项:
图 2. 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
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
禁用自动刷新。
当 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
.
从 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
我们可以看到:
spring.cloud.nacos.config.ext-config[n].data-id
。spring.cloud.nacos.config.ext-config[n].group
。如果未指定,则使用 DEFAULT_GROUP。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
我们可以看到:
spring.cloud.nacos.config.shared-dataids
,数据 id 用逗号分隔。spring.cloud.nacos.config.refreshable-dataids
用于控制在更新配置时动态刷新哪些数据id,以及应用程序可以检索到最新的配置值。数据 ID 用逗号分隔。如果未指定,所有共享数据 id 将不会被动态刷新。Nacos Config 在内部提供了一个 Endpoint,对应的端点 id 为nacos-config
.
端点暴露的 json 包含三个属性:
以下显示了服务实例如何访问 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" }] }
设置 spring.cloud.nacos.config.enabled = false 以禁用 Spring Cloud Nacos Config AutoConfiguration。
下面是 Nacos Config 的 starter 的其他配置:
配置 | 钥匙 | 默认值 | 描述 |
---|---|---|---|
服务器地址 | spring.cloud.nacos.config.server-addr | Nacos Server监听的IP和端口 | |
来自 nacos 配置的 Dataid | spring.cloud.nacos.config.name | 先取前缀,再取名字,最后取spring.application.name | |
来自 nacos 配置的 Dataid | spring.cloud.nacos.config.prefix | 先取前缀,再取名字,最后取spring.application.name | |
nacos 配置内容的编码 | spring.cloud.nacos.config.encode | nacos 配置内容的编码 | |
用于 nacos 配置的 GROUP | spring.cloud.nacos.config.group | DEFAULT_GROUP | 用于 nacos 配置的 GROUP |
nacos config dataId 的后缀,也是配置内容的文件扩展名。 | spring.cloud.nacos.config.fileExtension | properties | nacos config dataId的后缀,也是config内容的文件扩展名(现在支持properties或者yaml(yml)) |
从 nacos 获取配置超时 | spring.cloud.nacos.config.timeout | 3000 | 从 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.contextPath | Nacos Server的上下文路径 | |
集群名称 | spring.cloud.nacos.config.clusterName | 集群名称 | |
共享配置的Dataid | spring.cloud.nacos.config.sharedDataids | 共享配置的Dataid,用“,”分隔 | |
共享配置的动态刷新 dataid | spring.cloud.nacos.config.refreshableDataids | 共享配置的动态刷新dataid,用“,”分割 | |
自定义数据标识 | spring.cloud.nacos.config.extConfig | 这是一个列表,由Config POJO构建。Config 有 3 个属性dataId ,group 和refresh |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。