SpringCloud-Nacos-Config使用
一. Nacos配置中心介绍
我们在使用SpringBoot的时候,默认会提供一个application.properties
或者application.yml
文件,我们会把一些全局性的配置或者需要动态维护的配置写入该文件中,例如:数据库连接信息、限流阈值、服务器地址等等。而为了解决不同环境下服务连接配置等信息的差异,SpringBoot提供了基于spring.profiles.active={profile}
的机制来实现不同环境的切换,但是这种机制在微服务下有着需对不足之处:
- 配置的动态更新问题:效率低,需要重启应用。
- 配置集中式管理问题:若微服务的节点数量大,在每个节点中都维护一个配置文件,一旦配置文件中的某个属性需要修改,其工作量巨大。
- 配置内容的安全性和权限问题:配置文件随着源代码提交到代码库中(一般是GitHub),容易造成生产环境配置信息的数据泄露。
- 不同部署环境下配置的管理问题:对于profile机制的管理,这种方式对于日常维护来说比较繁琐。
因此,统一配置管理就是弥补了上述不足的一种解决方案。就是将各个应用系统中的某些配置放在第三方中间件上进行统一的维护,对于统一配置中心上的数据的变更需要推送到响应的服务节点实现动态的更新。
而Nacos除了服务注册的功能,还有着配置中心的功能,实现了对配置的CURD、版本管理、监听管理、推送和聚合等功能。
二. SpringCloud-Alibaba-NacosConfig的使用
案例1:获取配置中心上的配置
1.首先是pom文件:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.在Nacos配置中心上添加配置:
创建成功后:
3.在bootstrap.properties文件中添加配置:
# 配置中心的地址
spring.cloud.nacos.config.server-addr=192.168.237.130:8848
spring.application.name=nacos-test
# 表示Nacos配置中心上DataId的前缀
spring.cloud.nacos.config.prefix=myNacos
4.启动类:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
String info = context.getEnvironment().getProperty("info");
System.out.println(info);
}
}
输出结果:
案例2:动态更新配置
启动类:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
while (true){
String info = context.getEnvironment().getProperty("info");
System.out.println(info);
Thread.sleep(2000);
}
}
}
循环打印可以发现:
若此时在配置中心上更改对应的文件内容:
此时再看打印台,发现配置实时进行了更新:
基于DataID配置Yaml的文件扩展名
Nacos Config从Nacos Config Server中加载配置的时候,会匹配它的DataID,而在SpringCloudNacos的视线中,DataID默认的规则是: ${prefix}- ${spring.profile.active}- ${file-extension}
- 默认情况下,会去Nacos服务器上加载DataID以
${spring.application.name}. ${file-extension:properties}
为前缀的基础配置。 - 如果明确指定了
spring.cloud.nacos.config.prefix=xxx
的属性,则会加载DataID=xxx
的配置。 - 如果实际应用中,使用的是Yaml格式的配置,在
boostrap.properties
配置文件中应该声明:spring.cloud.nacos.config.file-extension=yaml
三. 配置中心几个基础概念
在前面,我们创建的配置文件都采用默认的Namespace:public和Group:DEFAULT_GROUP。下图是Nacos提供的数据模型,他的数据模型Key是由三元组来进行唯一确定的。
- Namespace用于解决多环境或者多个租户下数据的隔离问题。
- Group是Nacos中用来实现DataID分组管理的机制,他可以实现不同service/DataID的隔离。
一般来说,我们通过Namespace来区分不同的环境,而Group则是业务层面上的数据分组。
案例3:指定Namespace和Group获取配置文件信息
1.查看命名空间的唯一ID:
2.在dev环境下创建配置文件
配置信息如下:
3.在bootstrap.properties文件中配置:
spring.cloud.nacos.config.server-addr=192.168.237.130:8848
spring.application.name=nacos-test
spring.cloud.nacos.config.prefix=myTest
# 我这里是用了空间名为dev的ID
spring.cloud.nacos.config.namespace=0602f1cc-4ad3-4135-ba1d-6bc65e54dbe4
# 组名
spring.cloud.nacos.config.group=test-0124
4.启动类打印:
5.如果改掉Group的名称,在进行打印,则打印出null:
其中,bootstrap.properties的写法还有另外一种:
# 指定Nacos Config的DataID
spring.cloud.nacos.config.ext-config[0].data-id=myTest.properties
# 指定DataID所在组
spring.cloud.nacos.config.ext-config[0].group=test-0124
# 指定配置发生更新时,是否动态刷新
spring.cloud.nacos.config.ext-config[0].refresh=true
这里需要说明几点:
- 这种方式已经过时了(不推荐使用)。
- 对于data-id的指定,必须要加上文件格式,包括:properties、yaml、json。否则报错。
- 对于Nacos Config中文件的创建,配置格式的选择并不能决定配置文件的结尾,啥意思呢,看下面流程:
1.创建一个配置格式为properties的配置文件:
2.但是创建成功后,发现文件的末尾并不是以properties结束。
3.因此如果要使用config[0].data-id=
这种配置方式,必须显式的在创建文件的时候,加上相应的文件格式,如:
4.这样才能正确的获取到配置文件:
最后,还需要申明几点:
- 关于SpringCloud的相关配置,都要在bootstrap.properties文件中进行配置,bootstrap是应用程序的父上下文,即其加载优先于application。
- 由于在加载远程配置之前,需要读取Nacos配置中心的服务地址信息,因此Nacos服务地址等属性配置需要放在bootstrap.properties文件中。
虽然本篇文章很简单也很基础,但是写这篇博客的目的很简单:就是让大家知道,Nacos中的配置中心Config怎么使用,并且有个实时更新的作用,了解下Namespace和Group的区分(一个配置文件的身份证由3个东西来决定:Namespace、Group、DataID),在项目中主要写哪些配置。
而下一篇文章准备从原理角度来进行阐述。