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格式的配置项:
图 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 包含三个属性:
- 来源:当前应用程序配置数据信息
- RefreshHistory:配置刷新历史
- 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-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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY