Nacos Config配置中心官方文档
简介
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提供的数据库配置方式,因为添加的配置会持久化到数据库中
添加配置
3.权限控制
使用权限控制需要开启nacos配置里面的权限配置 文件位置: */nacos/conf/application.properties 默认为:false改为:true
整合配置中心
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</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:
name: com.nacos.config
bootstrap.yaml配置
spring:
cloud:
nacos:
server-addr: localhost:8848
username: nacos
password: nacos
config:
file-extension: yaml
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) {
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
可支持profile粒度的配置
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
bootstrap.yaml
spring:
cloud:
nacos:
server-addr: localhost:8848
username: nacos
password: nacos
config:
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 > 默认配置文件
自定义 namespace 的配置(命名空间默认为public)
环境隔离优先使用自定义命名空间来进行隔离,因为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 的配置
group是对命名空间更细粒度的分归类 在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
自定义扩展的 Data Id 配置
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:
下标的方式获取
spring.cloud.nacos.config.shared-configs[0]:
data-id: common.yaml
group: GROUP_APP
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:
下标的方式获取
spring.cloud.nacos.config.extension-configs[0]:
data-id: common.yaml
group: GROUP_APP
refresh: true
spring.cloud.nacos.config.extension-configs[1]:
data-id: common1.yaml
group: GROUP_APP1
refresh: true
spring.cloud.nacos.config.extension-configs[0]:
data-id: config-common01.properties
spring.cloud.nacos.config.extension-configs[1]:
data-id: config-common02.properties
group: GLOBALE_GROUP
spring.cloud.nacos.config.extension-configs[2]:
data-id: config-common03.properties
group: REFRESH_GROUP
refresh: true
在代码中通过@value 来获取nacos config中的配置参数时,如果配置进行了更新,@value是无法感知到的,需要在对应的类上加上@RefreshScope注解
@RefreshScope
|