目录
Spring Cloud Alibaba专栏目录(点击进入…)
Spring Cloud Alibaba Nacos Config(分布式配置)
Spring Cloud Alibaba Nacos Config(分布式配置)
Nacos是一个Alibaba开源的、易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
使用Spring Cloud Alibaba Nacos Config,可基于Spring Cloud的编程模型快速接入Nacos配置管理功能
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 Config基本使用
Nacos服务端添加配置
先安装好Nacos Server,然后启动Nacos服务;打开配置列表进行配置
配置 | 描述 |
---|---|
Data ID | 一般为应用名称,对应Spring Boot项目中的spring.application.name参数 |
Group | 组。一般用来区分项目,此处直接用默认的公共组 |
配置格式 | 一般默认为Properties格式,可自行切换 |
配置内容 | user.userId=1001 user.userName=zhangsan |
注意:DataId默认是以properties为扩展名。DataId必须要带扩展名不然获取不到对应配置
Nacos客户端使用配置
1.引入Nacos Config依赖
如果要在项目中使用Nacos来实现配置管理,使用group ID为com.alibaba.cloud和artifact ID为spring-cloud-starter-alibaba-nacos-config的starter
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.配置Nacos Server地址(bootstrap)
在运行NacosConfigApplication之前,必须使用bootstrap.properties/bootstrap.yml配置文件来配置Nacos Server地址
Nacos Config除了支持yaml格式以外,也支持properties格式。也就是下面文件用yaml、properties配置都是一样的,命名是bootstrap就行
spring:
application:
name: nacos-config
#多套环境配置
profiles:
active: develop/product
main:
allow-bean-definition-overriding: true
cloud:
nacos:
#权限认证,nacos.core.auth.enabled=true时需要添加
username: nacos
password: James2020+
config:
#动态更新开关。默认true,false关闭Nacos Config
enabled: true
server-addr: 127.0.0.1:8848
prefix: nacos-config-base
#配置文件扩展
file-extension: yaml
group: DEFAULT_GROUP
前缀spring.cloud.nacos.config
配置 | 描述 |
---|---|
refresh.enabled | false关闭动态刷新,Nacos Config 默认支持配置的动态更新,也就是配置改变时会动态刷新 |
server-addr | 为nacos的“服务器地址:端口”,80端口不可省略 |
file-extension | 为nacos的支持的文件类型。如:yaml和properties |
完全关闭Nacos Config的自动化配置
通过设置spring.cloud.nacos.config.enabled = false来完全关闭Spring Cloud Nacos Config
自定义namespace的配置
用于进行租户粒度的配置隔离。
Namespace的常用场景之一:不同环境的配置的区分隔离
不同的命名空间下,可以存在相同的Group或Data ID的配置。例如:开发测试环境和生产环境的资源(如配置、服务)隔离等。在没有明确指定${spring.cloud.nacos.config.namespace}配置的情况下,默认使用的是Nacos上Public这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
该配置必须放在bootstrap.properties文件中。此外spring.cloud.nacos.config.namespace的值是namespace对应的id,id值可以在Nacos的控制台获取。并且在添加配置时注意不要选择其他的 namespae,否则将会导致读取不到正确的配置
自定义Group的配置
在没有明确指定${spring.cloud.nacos.config.group}配置的情况下,默认使用的是DEFAULT_GROUP。如果需要自定义Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
该配置必须放在bootstrap.properties文件中。并且在添加配置时Group的值一定要和spring.cloud.nacos.config.group的配置值一致
Nacos Config支持配置方式(三种)的优先级
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
Data Id的完整格式
在 Nacos Spring Cloud 中,Data Id的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
(1)prefix
默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置
(2)spring.profile.active
为当前环境对应的profile。
注意:当spring.profile.active为空时,对应的连接符“-”也将不存在,Data Id的拼接格式变成 prefix.{file-extension}
(3)file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。目前只支持properties和yaml类型。
1.profile粒度的配置(应用名、应用名 + Profile)
Nacos Config在加载配置的时候,不仅仅加载了以DataId为
${spring.application.name}.${file-extension:properties}为前缀的基础配置,还加载了DataId为${spring.application.name}-${profile}.${file-extension:properties}的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring提供的${spring.profiles.active}这个配置项来配置
注意:${spring.profiles.active}当通过配置文件来指定时必须放在bootstrap.yml/properties文件中
如果需要切换到生产环境,只需要更改${spring.profiles.active} ==> spring.profiles.active=product参数配置即可
例如:生产环境下的Naocs添加了DataId为:nacos-config-product.yaml的配置
上面通过spring.profiles.active=<profilename>的方式写死在配置文件中,而在真正的项目实施过程中这个变量的值是需要不同环境而有不同的值。这个时候通常的做法是通过-Dspring.profiles.active=<profile>参数指定其配置来达到环境间灵活的切换
2.自定义Data Id配置(ext-config)
Nacos Config从0.2.1版本后,可支持自定义Data Id的配置
一个完整的配置案例如下所示:
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.ext-config[0].data-id=ext-config-common01.properties
#2、Data Id不在默认的组,不支持动态刷新
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既不在默认的组,也支持动态刷新
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
配置 | 描述 |
---|---|
spring.cloud.nacos.config.ext-config[n].data-id | 支持多个Data Id的配置 |
spring.cloud.nacos.config.ext-config[n].group | 自定义Data Id所在的组,不明确配置的话,默认是DEFAULT_GROUP |
spring.cloud.nacos.config.ext-config[n].refresh | 控制该Data Id在配置变更时,是否支持应用中可动态刷新,感知到最新的配置值。默认是不支持的(false) |
多个Data Id同时配置时,优先级关系是spring.cloud.nacos.config.ext-config[n].data-id其中n的值越大,优先级越高
spring.cloud.nacos.config.ext-config[n].data-id的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持yaml/yml。此时spring.cloud.nacos.config.file-extension的配置对自定义扩展配置的Data Id文件扩展名没有影响
3.自定义Data Id配置(shared-dataids)
通过自定义扩展的Data Id配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
为了更加清晰的在多个应用间配置共享的Data Id,可以通过以下的方式来配置:
spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.properties
spring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties
配置 | 描述 |
---|---|
spring.cloud.nacos.config.shared-dataids | 支持多个共享Data Id的配置,多个之间用逗号隔开 多个配置优先级:按照配置出现的先后顺序,即后面的优先级要高于前面 |
spring.cloud.nacos.config.refreshable-dataids | 支持哪些共享配置的Data Id在配置变化时,应用中是否可动态刷新。多个Data Id之间用逗号隔开。默认所有共享配置的Data Id都不支持动态刷新(配置动态刷新时Data Id必须带文件扩展名:properties/yml) |
注意:spring.cloud.nacos.config.file-extension的配置对自定义扩展配置的Data Id文件扩展名没有影响
3.Nacos Config配置使用
(1)启动类NacosConfigApplication中使用
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
String userId = applicationContext.getEnvironment().getProperty("user.userId");
String userName = applicationContext.getEnvironment().getProperty("user.userName");
// 获取当前部署的环境
String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
System.err.println("envrioment:"+ currentEnv);
System.err.println("user id:"+ userId +"; username: "+userName );
}
}
applicationContext.getEnvironment().getProperty(“base.age”); 这是获取参数的一种方式。还可以用过注解来获取
(2)使用注解获取配置
1.@Value
将启动类的代码注释掉,创建一个TestController类
可以把Nacos Config中配置的参数,当成本地参数一样,使用@Value(“${}”)注解来获取。同时加上@RefreshScope注解以保证可以实时更新
@RefreshScope
@RestController
public class TestController {
@Value("${user.userId}")
private String userId;
@Value("${user.userName}")
private String name;
@GetMapping("/userId")
public String getUserId() {
return userId;
}
@GetMapping("/userName")
public String getUserName() {
return userName;
}
}
2.@ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "user")
public class User {
private String userId;
private String userName;
// 省略getter/setter方法
}
Nacos Config对外暴露的Endpoint
Nacos Config内部提供了一个 Endpoint,对应的endpoint id为nacos-config
Endpoint暴露的JSON中包含了三种属性:
属性 | 描述 |
---|---|
Sources | 当前应用配置的数据信息(当前服务有哪些服务订阅者) |
RefreshHistory | 配置刷新的历史记录 |
NacosConfigProperties | 当前应用Nacos的基础配置信息 |
1.导入依赖
如果想看服务提供者(provider)有那些订阅者,以及Nacos的基础配置信息。就需要给provider项目的pom.xml文件里面添加spring-boot-starter-actuator依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.修改配置文件(application.yml)
Endpoint本身对外界隐藏显示(默认不开启),需要在配置里面开启对Endponit的显示支持
修改application.yml配置文件,在里面添加如下的配置:
management:
endpoints:
web:
exposure:
include: "*"
exposure.include:对外界暴露那些 Endpoint,若是所有则使用*
3.测试
重启项目,浏览器访问:http://localhost:8081/actuator/nacos-discovery
显示结果为一段JSON字符串