NacosConfig是一个重要的服务配置中心,它在微服务架构中起到了关键的作用。以下是NacosConfig的主要作用:
- 集中管理配置:NacosConfig提供了用于存储配置和其他元数据的key/value存储功能,使得开发者可以在Nacos Server上集中管理Spring Cloud应用的外部属性配置。这样,服务之间的配置信息可以得到统一管理和维护,简化了配置管理流程。
- 支持动态配置:NacosConfig支持动态配置,这意味着在配置发生更改时,服务可以实时获取最新的配置信息,而无需重启服务。这种动态配置的能力使得微服务架构更加灵活和可维护。
- 环境隔离:NacosConfig通过命名空间(Namespace)的概念实现了不同环境的配置隔离。不同的命名空间下可以存在相同的Group或Data ID的配置,这使得开发者可以方便地管理不同环境(如开发、测试、生产等)的配置资源,确保环境的独立性和安全性。
- 配置维护便捷:在微服务架构中,集群中每一台主机的配置文件可能都是相同的,对配置文件的更新维护可能会成为一个棘手问题。而NacosConfig可以作为配置中心,对Spring Cloud中各个微服务文件进行统一维护管理,简化了配置文件的更新和维护过程
Nacos配置
<!--nacos-服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos-配置文件 需要添加当jar包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
NacosConfig主要是用来做配置文件使用,需要使用 bootstrap.yml文件作为引导文件
nacos配置名称如果和服务名称一致,则会自动将服务名称作为配置名称
nacos的配置文件默认是propertys格式,在application.yml中配置nacos的配置文件格式为properties,因为是默认格式,所以也可以不配
spring:
cloud:
nacos:
config:
file-extension: properties
只有默认的配置文件才可以支持profile粒度的配置,跟服务名相同的配置文件,如果想支持profile粒度的配置,则需要在配置文件中添加profile前缀,如: stock-server-dev.properties
除了默认的配置文件,其他的配置文件必须写上文件后缀,如: stock-server-dev.properties,后缀必须和默认的配置文件后缀一致,
在日常开发中如果遇到多套环境下的不同配置,可以通过 Spring 提供的 ${spring.profiles.active} 这个配置项选择不同情况下的配置。
spring.profiles.active=dev
如果需要切换到生产环境,只需要更改 ${spring.profiles.active} 参数配置即可。如下所示
spring.profiles.active=product
nacos配置文件优先级, profile > 默认配置文件 > extension-configs > share-configs ,优先级大的会覆盖优先级小的,并且会形成互补
namespace的配置:代表不同环境
spring:
application:
name: order-server
cloud:
nacos:
discovery:
password: nacos
username: nacos
namespace: public
config:
filere-extension: yaml
group: dev
namespace: dev
data-id: order-server
share-configs: # 在同一个share-configs中,后面的配置文件会覆盖之前的
- group: dev # 默认命名攻坚 default-group
data-id: stock-0 # 配置文件名
refresh: true # 不会默认感知文件变化,如果需要默认感知只需要设置为false即可
- group: dev
data-id: stock-1
extension-configs[0]: # 第二个配置文件方式,使用下标方式 优先级extension-configs 大于 share-configs
data-id: stock-0
refresh: true
server-addr: 127.0.0.1:8848
#这段YAML代码是用于配置Spring Cloud Nacos Discovery的,它定义了服务发现和配置管理的一些参数。
#spring.application.name:设置应用的名称为order-server。
#spring.cloud.nacos.discovery:配置Nacos服务发现的相关参数。
#password:设置Nacos服务器的登录密码为nacos。
#username:设置Nacos服务器的登录用户名为nacos。
#namespace:设置Nacos的命名空间为public。
#config:配置Nacos配置管理的相关参数。
#file-extension:设置配置文件的扩展名为yaml。
#group:设置配置文件所属的分组为dev。
#namespace:设置配置管理的命名空间为dev。
#data-id:设置配置文件的ID为order-server。
配置文件内容
测试能否读取到当前配置信息
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
while(true) {
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
//获取当前部署的环境
String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
自定义 Namespace 的配置
Nacos 内部有 Namespace 的概念:
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离, 例如开发测试环境和生产环境的资源(如配置、服务)隔离等。 在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 中 public 命名空间即默认的命名空间。如果需要使用自定义的命名空间,可以通过以下配置来实现:
该配置必须放在 bootstrap.properties 文件中。此外 spring.cloud.nacos.config.namespace 的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespace,否则将会导致读取不到正确的配置。
spring.cloud.nacos.config.namespace=YOUR_NAMESPACE_ID
自定义 Group 的配置
在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使用的是组 DEFAULT_GROUP 。如果需要自定义 Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=YOUR_GROUP_NAME
配置的优先级
Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置:
-
A: 通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 Data Id 的配置
-
B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置
-
C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
当三种方式共同使用时,他们的一个优先级关系是: A < B < C
springc.config.import 引入
这里假设有一个配置文件 bootstrap.yml,升级到 2021.0.1.0 以上的版本应该怎么配置呢?
# bootstrap.yml
spring:
cloud:
nacos:
config:
name: test.yml
group: DEFAULT_GROUP
server-addr: 127.0.0.1:8848
extension-configs:
- dataId: test01.yml
group: group_01
- dataId: test02.yml
group: group_02
refresh: false
注意:上面的配置和下面的配置是等价的!
# application.yml
spring:
cloud:
nacos:
config:
group: DEFAULT_GROUP
server-addr: 127.0.0.1:8848
config:
import:
- optional:nacos:test.yml # 监听 DEFAULT_GROUP:test.yml
- optional:nacos:test01.yml?group=group_01 # 覆盖默认 group,监听 group_01:test01.yml
- optional:nacos:test02.yml?group=group_02&refreshEnabled=false # 不开启动态刷新
- nacos:test03.yml # 在拉取nacos配置异常时会快速失败,会导致 spring 容器启动失败
使用 spring.config.import 引入配置时的注意事项如下:
- 如果使用 spring.config.import 就不能使用 bootstrap.yml/properties 引入配置的方式了;
- 如果引入了 spring-cloud-starter-alibaba-nacos-config,并且使用 import 方式导入配置, 项目启动时会自动检测是否引入了 nacos 条目,如果没有 import nacos 条目,会出现如下错误:
The spring.config.import property is missing a nacos: entry
Action:
Add a spring.config.import=nacos: property to your configuration.
If configuration is not required add spring.config.import=optional:nacos: instead.
To disable this check, set spring.cloud.nacos.config.import-check.enabled=false.