Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。
建议是使用Nacos提供的数据库配置方式,因为添加的配置会持久化到数据库中
使用权限控制需要开启nacos配置里面的权限配置
文件位置: */nacos/conf/application.properties
默认为:false改为:true
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
在启动服务之前,必须使用bootstrap.properties 或者 bootstrap.yaml 配置文件来配置Nacos Server 地址
注意当你使用域名的方式来访问 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.application.name: nacos-config
spring.cloud.nacos.config.server-addr: 127.0.0.1:8848
spring.cloud.nacos.config.file-extension: yaml
spring.cloud.nacos.config.refresh.enabled: false #来关闭动态刷新,一般用不上
application.yaml
server:
port: 8088
spring:
application:
#application.name 对应的是Nacos Config配置的 DataID application.name的配置可以是配置在application.yaml中也可以配置在bootstrap.yaml中
#除了默认的配置文件,其他配置文件必须写上后缀
name: com.nacos.config
bootstrap.yaml配置
#除了配置中心当中的配置会写在bootstrap.yaml中,其他需要的配置一般都是写在application.yaml中
spring:
cloud:
nacos:
server-addr: localhost:8848 #如果通过域名访问nacos,则 地址为 域名:8848,如果端口号为80,也必须配置,不能省略
username: nacos
password: nacos
config:
#声明 dataid 文件扩展名 这里配置的文件扩展名是指Nacos Config 配置管理中的配置格式,默认为Properties 只针对默认的配置文件
#如果使用Properties格式进行配置可以不用指定格式,如果改为其他格式则需要指定文件格式,否则会报错
file-extension: yaml
# refresh:
#nacos config 的主要特性动态刷新配置信息,当我们更新了配置文件之后程序会在10ms内刷新配置,这里可以手动关闭,但是一般用不上
# enabled: false
spring-cloud-starter-alibaba-nacos-config 也支持配置的动态更新,启动 Spring Boot 应用测试的代码如下:
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
while(true) {
//当动态配置刷新时,会更新到 Enviroment中,因此这里每隔一秒中从Enviroment中获取配置
String userAge = applicationContext.getEnvironment().getProperty("age");
System.err.println("; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
测试结果
age: 22
age: 22
age: 22
2022-10-26 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)
2022-10-26 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 2022]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@6520af7
2022-10-26 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 2022]; root of context hierarchy
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension:properties} 为前缀的基础配置,还加载了dataid为 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。
spring.profiles.active: develop
新建一个develop环境的配置
默认配置
profile配置
application.yaml
#在配置中心: 可以通过profile 进行设置
#只有默认的配置文件才能结合profile进行使用
#对应的DataID命名格式: s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{profile}.${file-extension:properties}
server:
port: 8088
spring:
application:
name: nacos.config-develop.yaml
profiles:
active: dev
#在配置中心: 可以通过profile 进行设置
#只有默认的配置文件才能结合profile进行使用
#对应的DataID命名格式:${spring.application.name}-${profile}.${file-extension:properties}
bootstrap.yaml
#除了配置中心当中的配置会写在bootstrap.yaml中,其他需要的配置一般都是写在application.yaml中
spring:
cloud:
nacos:
server-addr: localhost:8848 #如果通过域名访问nacos,则 地址为 域名:8848,如果端口号为80,也必须配置,不能省略
username: nacos
password: nacos
config:
#声明 dataid 文件扩展名 这里配置的文件扩展名是指Nacos Config 配置管理中的配置格式,默认为Properties 只针对默认的配置文件
#如果使用Properties格式进行配置可以不用指定格式,如果改为其他格式则需要指定文件格式,否则会报错
file-extension: yaml
测试代码
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
while(true) {
String userName = applicationContext.getEnvironment().getProperty("name");
String userAge = applicationContext.getEnvironment().getProperty("age");
System.err.println("username :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
测试结果
user name :测试; age: 22
2022-10-26 15:34:25.013 INFO 33014 --- [ Thread-11] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6f1c29b7: startup date [Fri Nov 26 15:33:57 CST 2022]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@63355449
#配置文件的优先级 (优先级大的会覆盖优先级小的,当优先级大的不存在配置时会向下获取优先级小的配置)
#比如 profile => name: 测试 ,
默认配置=> name: 默认配置 age: 22
获取到的配置为 name: 测试 , age: 22
#profile > 默认配置文件
环境隔离优先使用自定义命名空间来进行隔离,因为nacos权限控制只能对命名空间进行控制.不建议使用profile的方式处理环境隔离
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
group是对命名空间更细粒度的分归类 在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
Spring Cloud Alibaba Nacos Config 从 0.2.1 版本后,可支持自定义 Data Id 的配置。
spring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
优先级
#profile > 默认配置文件(dataID 与application.name相同的 ) > extension-configs(下标越大优先级越大) > shared-configs(下标越大优先级越大)
有两种配置方式:
第一种:shared-configs (shared-configs是一个集合,yaml读取集合的方式有两种,一直是 - 来获取,一种是通过下标获取)
spring.cloud.nacos.config.shared-configs:
- data-id:
group:
refresh:
- data-id:
group:
refresh:
下标的方式获取
#配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[0]:
data-id: common.yaml
#配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
group: GROUP_APP
#配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
refresh: true
spring.cloud.nacos.config.shared-configs[1]:
data-id: common1.yaml
group: GROUP_APP1
refresh: true
第二种:extension-configs (extension-configs也是一个集合)
spring.cloud.nacos.config.extension-configs:
- data-id:
group:
refresh:
- data-id:
group:
refresh:
下标的方式获取
#配置支持共享的 Data Id
spring.cloud.nacos.config.extension-configs[0]:
data-id: common.yaml
#配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
group: GROUP_APP
#配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
refresh: true
spring.cloud.nacos.config.extension-configs[1]:
data-id: common1.yaml
group: GROUP_APP1
refresh: true
# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0]:
data-id: config-common01.properties
# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1]:
data-id: config-common02.properties
group: GLOBALE_GROUP
# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.extension-configs[2]:
data-id: config-common03.properties
group: REFRESH_GROUP
refresh: true
@RefreshScope