nacos主要提供了以下几个功能:
1、配置中心
2、服务发现和服务健康监测
3、动态DNS
4、服务及其元数据管理
常用的功能是配置中心、服务发现
本文主要是对Nacos Config 官方文档的补充,官方文档地址:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
本文样例代码:
https://nacos.io/zh-cn/docs/deployment.html
跟spring cloud config 类似,但是更易用,轻量,运维成本也更低
Data ID: nacos-config.properties
Group : DEFAULT_GROUP
配置格式: Properties
配置内容: user.name=nacos-config-properties
user.age=90
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--需要引入该jar才能使bootstrap配置文件生效-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
本文所有配置文件都是配置到bootstrap.properties
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
配置全局开关 默认true开启
spring.cloud.nacos.config.enabled = true
配置文件扩展
spring.cloud.nacos.config.file-extension=yaml
dataid必须要带扩展名,且和file-extension配置相同,原因上面已讲述
在项目的任何地方获取Environment对象都可以拉取nacos配置
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :"+userName+"; age: "+userAge);
}
}
注意当你使用域名的方式来访问 Nacos 时,spring.cloud.nacos.config.server-addr 配置的方式为 域名:port。 例如 Nacos 的域名为abc.com.nacos,监听的端口为 80,则 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。 注意 80 端口不能省略。
spring.cloud.nacos.config.refresh-enabled
通过注解获取
@Configuration
@ConfigurationProperties
@Value
@Configuration;@ConfigurationProperties需要结合@RefreshScope注解来动态刷新配置
所以在项目中建议使用@Value来拉取配置
@Value("${user.name}")
private String userName
单机部署时有时会遇到拉取不到配置的坑,这时重启nacos即可。
可以使用Open-API 拼接url直接访问配置检查是否有问题
http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=xxxx.yaml&group=DEFAULT_GROUP
若配置正确却读取不到配置,重启即可
通过spring的配置参数来指定profile:
spring.profiles.active
nacos会先加载\({spring.application.name}.\){file-extension:properties} 为前缀的基础配置,
然后再加载dataid为 \({spring.application.name}-\){profile}.${file-extension:properties} 的基础配置,且若配置名称相同后者会覆盖前者
此案例中我们通过 spring.profiles.active=
spring.cloud.nacos.config.namespace=[命名空间id]
默认为public这个保留空间
spring.cloud.nacos.config.group=[group名称]
默认DEFAULT_GROUP
所以项目默认是读取namespace为public中的DEFAULT_GROUP组下的\({spring.application.name}.\){file-extension:properties}配置文件,且都会拉取一遍这个配置,相当于默认兜底配置
配置文件
spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties
# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP
# 3、Data Id 既不在默认的组,也支持动态刷新
# 配置data-id名称 必须带扩展名称
spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties
# group值
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
# 是否动态刷新 默认不支持
spring.cloud.nacos.config.extension-configs[2].refresh=true
通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
为了更加清晰的在多个应用间配置共享的 Data Id ,你可以通过以下的方式来配置:
# 配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml
# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1
# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
spring.cloud.nacos.config.shared-configs[0].refresh=true
可以看到:
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
当三种方式共同使用时,他们的一个优先级关系是:A < B < C
三种方式的加载源码在NacosPropertySourceLocator 类locate方法
this.loadSharedConfiguration(composite);
this.loadExtConfiguration(composite);
this.loadApplicationConfiguration(composite, dataIdPrefix, this.nacosConfigProperties, env);
由此也可以得出优先级关系A < B < C
无论哪种方式配置参数不同的命名空间之间的配置不会共享
多环境部署,例如:DEV TEST PRO
不同项目之间配置独立不共享
多个项目之间共享部分配置,比如注册中心地址等
单个项目多个配置文件
同一部署环境中不同情况配置
灰度发布
原文:https://www.cnblogs.com/zh-ch/p/13171096.html