1. 说明

由前面我们已经知道了,nacos的职责由config和discovery,现在我们首先分析config

由于是配置信息,并非应用的信息,因此需要比原来application.properties更早的加载,就需要引入bootstrap.properties
当读取完bootstrap.properties中的配置的nacos的相关信息时,会去nacos中找到对应的dataId对应的配置文件,此文件等效于application.properties文件,
读取之后会加入Enviroment中,也就是读取到了内存里面,后续解析时便可以从Enviroment中获取数据了

2. 工程搭建

2.1. pom依赖

1
2
3
4
5
6
7
8
<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-test</artifactId>
</dependency>

2.2. 配置类

配置类需要配置在bootstrap.properties中,它比application.properties更早加载

配置类我们主要关注spring.application.namespring.cloud.nacos.config.server-addr两个参数,这是必须的

  • spring.application.name:应用名,用于拼接dataId,必不可少
  • spring.cloud.nacos.config.server-addr:nacos的地址,这个也必须有,配置错了地址不会报错,但是获取的数据是空的

配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
# 应用名
spring.application.name=spring-cloud-alibaba-config-test
# nacos的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 命名空间,若需要修改的话
# spring.cloud.nacos.config.namespace=public
# 组,若需要修改的话
# spring.cloud.nacos.config.group=DEFAULT_GROUP
# 扩展名,若需要修改的话
# spring.cloud.nacos.config.file-extension=properties
# 不根据应用名来匹配dataId,自定义
# spring.cloud.nacos.config.prefix=${spring.application.name}

题外话:
nacos在spring中得到配置选项:

配置列表

2.3. nacos中的配置

nacos中配置如下:

config

detail

需要注意的是,这里的dataId必须按照既定的格式来配置
格式为${spring.application.name}-{spring.profiles.active}.${file-extension},即应用名-环境.文件格式

  • 普通的如: spring-cloud-alibaba-config-test.properties
  • 带环境标识的:spring-cloud-alibaba-config-test-dev.properties,此处dev为测试环境
  • 带有后缀的
    需要先在bootstrap.properties中配置spring.cloud.nacos.config.file-extension=yaml
    格式则为:spring-cloud-alibaba-config-test.yaml
  • 带有后缀的且带环境标识的:spring-cloud-alibaba-config-test-dev.yaml

2.4. 启动类

启动类启动了之后在加载application.properties之前就会加载nacos中的,此时便可以拿出来

1
2
3
4
5
6
7
8
9
@SpringBootApplication
public class CloudConfigApp {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(CloudConfigApp.class, args);
String userName = applicationContext.getEnvironment().getProperty("kewen.username");
String userAge = applicationContext.getEnvironment().getProperty("kewen.age");
System.err.println("user name :"+userName+"; age: "+userAge);
}
}