1. 依赖引入

nacos既有服务注册与发现功能,也有配置功能,在spring boot下分别有两个依赖

1
2
3
4
5
6
7
8
9
10
11
12
<!--主要从nacos中获取配置-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.10</version>
</dependency>
<!--主要负责服务注册与发现-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.1</version>
</dependency>

nacos可以单独作为配置中心使用,不做服务与发现等其他功能,这时候只需要引入nacos-config-spring-boot-starter相关的配置就行了

2. nacos配置中心预埋数据

文件如下:

1

配置如下:

2

3. 项目配置文件

1
2
3
4
#nacos server的地址
nacos.config.server-addr=127.0.0.1:8848
#配置用到的namespace
nacos.config.namespace=nacos-config-test

注意: 若没有配置nacos.config.namespace,nacos默认使用public的配置

3.1. spring原生注解支持

在启动类上加入配置@NacosPropertySourc,指定好groupId和dataId,再搭配上配置文件中的namespase即可唯一确定一个配置。在项目启动时此注解就会将nacos中对应的配置加载到内存中,其效果和配置文件加入到内存中一样。

1
2
3
4
5
6
7
@SpringBootApplication
@NacosPropertySource(name ="nacos-config-test" ,groupId = "DEFAULT_GROUP_KEWEN",dataId = "kewen-info",autoRefreshed = true)
public class NacosSampleConfigApp {
public static void main(String[] args) {
SpringApplication.run(NacosSampleConfigApp.class,args);
}
}

配置了之后项目中便可以跟以前一样使用@ConfigurationProperties@Value注解了

3.2. nacos 自带注解

nacos的注解部分对应spring原生注解,如 @NacosConfigurationProperties @NacosValue

3.2.1. @NacosConfigurationProperties注解

NacosConfigurationProperties类比为ConfigurationProperties,其使用原理与ConfigurationProperties注解相当

nacos的自带注解不需要添加@NacosPropertySource,可单独使用,当然也可以配合使用。

单独使用的时候,nacos不会先将配置文件添加到内存Enviroment中,因此在我们获取配置的时候是拿不到数据的,但是nacos给我们提供了一个选项autoRefreshed = true,此注解的意思是会监听nacos中的变化,同时会在创建监听器的时候再去nacos中拿一次数据。

因此,在未添加@NacosPropertySource必须设置autoRefreshed = true,否则将拿不到数据。具体将在下节分析源码得到答案。

配置如下

1
2
3
4
5
6
7
8
9
10
@Component
//@ConfigurationProperties(prefix = "kewen") 此处不再需要,但是NacosConfigurationProperties如果没有指定autoRefreshed = true的时候需要添加此注解初始化数据,否则数据为空
@NacosConfigurationProperties(prefix = "kewen",dataId = "kewen-info",groupId = "DEFAULT_GROUP_KEWEN",type = ConfigType.PROPERTIES,autoRefreshed = true)
@Data
public class TestConfigProperties {
private String username;
private String password;
private Integer age;
private Integer gender;
}

注意:type = ConfigType.PROPERTIES未指定时dataId须要带上文件类型后缀

3.2.2. @NacosValue注解

@NacosValue注解 类比@Value注解,它也在项目启动的时候也从Enviroment中注入属性值,使用的表达式也相同。
但是@NacosValue有一个扩展autoRefreshed,当其为true时,会注册监听器,当配置文件改变时刷新值
@NacosValue必须搭配@NacosPropertySource注解使用,否则即使加了autoRefreshed = true初始化的值依然为空

1
2
@NacosValue(value = "${kewen.username}",autoRefreshed = true)
private String username;

4. 总结

  1. nacos可以专门只做配置中心,因此普通的单体项目也可以用它来存储配置文件

  2. nacos做配置中心时引入nacos-config-spring-boot-starter即可,spring项目需要自行挖掘一下

  3. nacos的的配置注入与spring类似,同时也支持spring的方式注入(前提是不需要刷新配置文件时通知应用)

  4. nacos与spring注解用途相似,只不过nacos多了一个自动刷新,类比如下:

    nacos spring
    @NacosPropertySource @PropertySource
    @NacosConfigurationProperties @ConfigurationProperties
    @NacosValue @Value
  5. 建议还是在项目启动时添加上@NacosPropertySource指定项目用到的配置文件,避免出现获取不到值的情况