五、SpringCloud alibaba 之 nacos配置中心
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
在创建配置文件时,要填写dataId
在 Nacos Spring Cloud 中,dataId
${prefix}-${spring.profiles.active}.${file-extension}
-
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。 -
spring.profiles.active
即为当前环境对应的 profile,详情可以参考 。 注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
-
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。
通过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新。
创建的配置文件内容如下:
入门示例
在5.1中 在nacos的服务端配置好文件之后,需要在客户端读取配置文件的内容。首先在application.propertis
或者application.yml
中连接nacos的服务端。
server.port=8083
#配置的dataId的prefix, 默认读取的是spring.application.name的值,也可以通过spring.cloud.nacos.config.prefix来配置
spring.application.name=test
# nacos服务端地址
spring.cloud.nacos.server-addr=localhost:8848
创建一个配置类
@Data
@Component
@ConfigurationProperties(prefix = "user")
public class UserProperties {
private String name;
private String password;
}
创建一个controller类
@RequestMapping("/user")
@RestController
public class UserController {
@Value("${user.name}")
private String userName;
@Autowired
private UserProperties userProperties;
@RequestMapping("/getUserName")
public String getUserName(){
System.out.println(userProperties);
System.out.println(userName);
return "success";
}
}
运行结果
user.name
我们可以看到通过UserProperties
配置类接收的配置信息更新了,但是在UserController
类中通过@Value
如果想要UserController
类中通过@Value
接收的配置信息也实时更新,需要在类是添加@RefreshScope
注解,因此我们建议nacos配置类的配置信息尽量采取配置类和@ConfigurationProperties
结合的方式来接收。
共享配置
因此该配置必须放在 bootstrap.properties 文件中才会生效,放在application配置文件中是不生效的
。关于这部分详细的设计可参考 。 一个完整的配置案例如下所示
# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=test1
# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1].data-id=test2
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP
# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.extension-configs[2].data-id=test3
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true
可以看到:
-
通过
spring.cloud.nacos.config.extension-configs[n].data-id
的配置方式来支持多个 Data Id 的配置。 -
通过
spring.cloud.nacos.config.extension-configs[n].group
的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。 -
通过
spring.cloud.nacos.config.extension-configs[n].refresh
的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定 ${spring.cloud.nacos.config.namespace}
配置的情况下, 默认使用的是 Nacos 上 Public 这个namespace。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
该配置必须放在 bootstrap.properties 文件中。并且在添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group
的配置值一致。
我们要在微服务拉取共享配置。将拉取到的共享配置与本地的application.yaml
配置合并,完成项目上下文的初始化。
不过,需要注意的是,读取Nacos配置是SpringCloud上下文(ApplicationContext
)初始化时处理的,发生在项目的引导阶段。然后才会初始化SpringBoot上下文,去读取application.yaml
。
也就是说引导阶段,application.yaml
文件尚未读取,根本不知道nacos 地址,该如何去加载nacos中的配置文件呢?
SpringCloud在初始化上下文的时候会先读取一个名为bootstrap.yaml
(或者bootstrap.properties
)的文件,如果我们将nacos地址配置到bootstrap.yaml
中,那么在项目引导阶段就可以读取nacos中的配置了。