Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
首先我们来看一下,微服务架构下关于配置文件的一些问题:
基于上面这些问题,我们就需要引入配置中心来解决。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<!--Spring cloud Hoxton.SR3-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
bootstrap.properties ->bootstrap.yml -> application.properties -> application.yml
server:
port: 9002
spring:
profiles:
active: dev
application:
name: nacos-config-server
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # 配置中心
file-extension: yaml # 这里指定的文件格式需要和nacos上新建的配置文件后缀相同,否则读不到
@SpringBootApplication
public class NacosConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigServerApplication.class, args);
}
@RestController
class TestController {
@Value("${config.info}")
private String config;
@GetMapping("/test")
public String hello() {
return config;
}
}
}
我们通过@Value注解可以获取到配置中心的值。
在TestController上加个@RefreshScope注解,然后我们去nacos客户端手动修改config.info的信息,然后重新调用这个/test接口,会发现响应的是修改后的内容。
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定命名空间配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。
首先我们在nacos客户端新建一个命名空间,
然后我们在配置文件中新增下面这个属性,具体的值填写我们新增命名空间的ID,这样启动config服务后,就会自动去这个命名空间下寻找对应的配置文件了。
spring:
cloud:
nacos:
config:
namespace:
最开始的时候我们也说过微服务项目会有多个环境,我们如何实现和管理这些环境呢?
我们可以在配置文件中指定spring.profiles.active = **,然后在nocas客户端新建对应的${spring.cloud.nacos.config.prefix} -
${spring.profiles.active} .
${spring.cloud.nacos.config.file-extension}配置来区分不同的环境。
我们可以为不同的环境新建不同的分组,然后的配置文件中指定spring.cloud.nacos.config.group=组名,这样也可以实现不同环境的区分。
这种方式是官方建议的方式,在nacos客户端中新建不同的分组,然后再配置文件中指定namespace就可以区分不同的环境了。
大多数时候我们可能更加倾向于将不同的配置分开写到不同的配置文件中,比如我想把文件类和日志类的配置拆分开写到两个配置中,nacos也是支持这种写法的。
我们在配置文件中分别加入以下内容:log:level: 2,file:url: " http://123.com "。
spring:
cloud:
nacos:
config:
extension-configs[0]:
data-id: log.yaml
group: DEFAULT_GROUP # 默认为DEFAULT_GROUP
refresh: true # 是否动态刷新,默认为false
extension-configs[1]:
data-id: file.yaml
group: DEFAULT_GROUP
refresh: true
为了更加清晰的在多个应用间配置共享的 Data Id,官方推荐使用如下配置:
spring:
cloud:
nacos:
config:
shared-configs[0]:
data-id: log.yaml
group: DEFAULT_GROUP # 默认为DEFAULT_GROUP
refresh: true # 是否动态刷新,默认为false
shared-configs[1]:
data-id: file.yaml
group: DEFAULT_GROUP
refresh: true
我们将file.yaml中的配置改成log:level: 22。这时候我们加载写个接口取一下配置。看看它取到的是哪个文件的内容。
RestController
@RefreshScope
class TestController {
@Value("${log.level}")
private String log;
@GetMapping("/test")
public String hello() {
return "log.lelve="+log;
}
}
结果取到的是file.yaml中的配置,这是因为 多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id
其中 n 的值越大,优先级越高。
注意: spring.cloud.nacos.config.extension-configs[n].data-id
的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension
的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
spring.cloud.nacos.config.shared-configs[n].data-id
支持多个共享 Data Id 的配置 spring.cloud.nacos.config.extension-configs[n].data-id
的方式支持多个扩展 Data Id 的配置 、
spring.cloud.nacos.config.file-extension 、
spring.cloud.nacos.config.group)自动生成相关的 Data Id 配置 当三种方式共同使用时,他们的一个优先级关系是:A < B < C