SpringCloud Alibaba - Nacos Config 自定义共享配置

在上一章节我们讲到了共享配置的使用方式,在上一篇文章结尾我们也简单的描述了共享配置的局限性以及不好的扩展性,SpringCloud Alibaba Nacos Config针对这一点也提出了另外一个概念的配置,我们可以自定义每一个共享配置分组自动刷新等属性。

回顾

本系列文章章节:

为什么需要自定义共享配置?

我们先来模拟一个场景,我有一个hengboy-common.yaml配置,需要引入到我们的应用程序内,而hengboy-common.yaml配置文件所属的Group与我们的应用程序不一样!!!

这时我们如果通过《SpringCloud Alibaba - Nacos Config 共享配置》章节的配置是无法完成配置信息的读取,如果我们不去自定义共享配置,这时就可能会把hengboy-common.yaml修改所属的Group,因此就会导致其他需要读取hengboy-common.yaml配置的应用程序一并进行修改Group,耗时耗力又得不偿失。

下面我们就来看下SpringCloud Alibaba Nacos Config给我们提供的自定义共享配置的解决方案。

创建应用

使用Idea开发工具创建一个SpringBoot项目,添加SpringCloudSpringCloud Alibaba相关的版本依赖,pom.xml文件部分内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//...
<description>
SpringCloud Alibaba Nacos Config 自定义共享配置
</description>

<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
<spring-cloud-alibaba.version>0.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>

<dependencies>
<!--spring cloud alibaba config-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
<!--SpringCloud-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringCloud Alibaba-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

bootstrap.yaml

我们把SpringCloud Alibaba Nacos Config所需要的参数添加到引导配置文件bootstrap.yaml内,自行在resources目录下创建:

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
application:
name: hengboy-sca-nacos-config-share-custom
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
ext-config:
# 配置公共配置
- data-id: hengboy-common.yaml
# 配置共享服务配置
- data-id: hengboy-service.yaml

添加共享配置

hengboy-sca-nacos-config-share-custom.yaml

hengboy-common.yamlhengboy-service.yaml配置文件访问SpringCloud Alibaba - Nacos Config 共享配置查看

读取共享配置

创建一个名为CustomShareConfigController的控制器,添加读取共享配置的代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//...
@RestController
@RefreshScope
@RequestMapping(value = "/config")
public class CustomShareConfigController {
/**
* logger instance
*/
static Logger logger = LoggerFactory.getLogger(CustomShareConfigController.class);
/**
* hengboy-sca-nacos-config-share.yaml配置内容
*/
@Value(value = "${share.basic:}")
private String basic;
/**
* hengboy-common.yaml配置内容
*/
@Value(value = "${common.version:}")
private String commonVersion;
/**
* hengboy-service.yaml配置内容
*/
@Value(value = "${service.order:}")
private int serviceOrder;

/**
* 输出配置信息
*/
@GetMapping(value = "/get")
public void getConfig() {
logger.info("基础配置:{}", basic);
logger.info("公共配置:{}", commonVersion);
logger.info("服务配置:{}", serviceOrder);
}
}

通过上面的代码我们访问/config/get时就可以在控制台查看输出的对应的配置信息,下面我们先来运行下应用程序,通过curl http://localhost:8080/config/get命令来查看是否可以输出配置信息。
控制台输出内容如下所示:

1
2
3
2019-03-07 09:56:28.614  INFO 5439 --- [nio-8080-exec-2] .s.a.n.c.s.c.CustomShareConfigController : 基础配置:
2019-03-07 09:56:28.614 INFO 5439 --- [nio-8080-exec-2] .s.a.n.c.s.c.CustomShareConfigController : 公共配置:0.2.3.RELEASE
2019-03-07 09:56:28.614 INFO 5439 --- [nio-8080-exec-2] .s.a.n.c.s.c.CustomShareConfigController : 服务配置:2

我们已经可以读取到共享配置信息,那我们该怎么添加指定配置的自动刷新、分组功能呢?

下面我们先来看下NacosConfigProperties配置文件的内部类Config,这个类是我们spring.cloud.nacos.config.ext-config所需要的对象实例。

NacosConfigProperties#Config

NacosConfigProperties#Config.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static class Config {
private String dataId;
private String group = "DEFAULT_GROUP";
private boolean refresh = false;

public Config() {
}

public String getDataId() {
return this.dataId;
}

public void setDataId(String dataId) {
this.dataId = dataId;
}

public String getGroup() {
return this.group;
}

public void setGroup(String group) {
this.group = group;
}

public boolean isRefresh() {
return this.refresh;
}

public void setRefresh(boolean refresh) {
this.refresh = refresh;
}
}

该类内一共有dataIdgrouprefresh三个可配置字段,其中grouprefresh都存在默认值,如果是默认的分组不执行自动刷新配置,我们只需要添加dataId字段的值就可以了。

预计该类在下面更新迭代过程中会添加namespace的概念

共享配置自动刷新

自定义共享配置的自动刷新如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
ext-config:
# 配置公共配置
- data-id: hengboy-common.yaml
# 自动刷新
refresh: true
# 配置共享服务配置
- data-id: hengboy-service.yaml
# 不自动刷新
refresh: false

在上面配置中,hengboy-common.yaml开启了自动刷新配置信息,而hengboy-service.yaml并未开启。

共享配置分组

自定义共享配置修改默认分组如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
ext-config:
# 配置公共配置
- data-id: hengboy-common.yaml
# 自动刷新
refresh: true
# 自定义分组
group: hengboy
# 配置共享服务配置
- data-id: hengboy-service.yaml
# 默认不自动刷新
# refresh: false
# 自定义分组
group: other

我们修改了hengboy-common.yaml的所属分组为hengboy,修改hengboy-service.yaml的分组为other

注意:在上面的配置中,如果需要修改默认值可自行修改,如果不修改则会使用默认值来进行匹配获取配置信息。

代码示例

本章代码在源码的名称为:spring-cloud-alibaba-nacos-config-share-custom,在SpringCloud-Alibaba/Nacos-Config目录下。

  • MicroJob
    micro-job是一款分布式任务调度执行框架,用于集群环境负载均衡条件下的任务分发以及任务消费
    任务消费者节点定义任务 & 任务自动上报
    任务调度器自动根据负载均衡策略来选择不同的消费者节点进行任务消费

    点击查看MicroJob官方文档

下面的内容你感兴趣吗?

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×