抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Nacos多环境配置

多环境配置

在实际开发中,通常一个系统会准备开发环境、测试环境、预发环境、正式环境

那么如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢

Data ID方案

它的命名规则为:${prefix}-${spring.profile.active}.${file-extension}

通过其中的spring.profile.active属性即可进行多环境下配置文件的读取

新建配置

创建配置文件Data ID为:order-server-dev.properties, 其配置如下

1
api.version=dev:1.0.0

继续创建配置文件Data ID为:order-server-test.properties, 其配置如下

1
api.version=test:1.0.0

多环境测试

通过Idea启动order-server项目,并指定spring.profiles.active,通过不同的环境进行启动

通过上面的配置,将项目分为dev、test两个环境启动后,进行测试

访问地址http://localhost:8083/order/version

test环境测试结果

可以看到,分别以dev、test启动后相应的读取到不同的配置,dev环境读取到配置是 dev:1.0.0,test读取到配置是test:1.0.0

Group方案

上面介绍了通过指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置

这里也可以不用DataID,直接通过Group实现环境区分

注:这种方式不太推荐,切换不灵活,需要切换环境时要改Gruop配置

新建配置

创建配置文件Data ID为:order-server.properties, Group为:DEV_GROUP, 其配置如下:

1
api.version=DEV_GROUP:1.0.0

继续创建配置文件Data ID为:order-server.properties, Group为:TEST_GROUP, 其配置如下:

1
api.version=TEST_GROUP:1.0.0

这里的两个配置文件他们的DataID相同但是Group不同

配置文件修改

修改项目中的配置文件bootstrap.properties

在config下增加一条group的配置,指定配置文件所在的group,可配置为DEV_GROUPTEST_GROUP

1
2
3
4
5
6
7
8
9
10
# 配置中心url
spring.application.name=order-server
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties

spring.cloud.nacos.config.group=DEV_GROUP
启动测试

将group配置为DEV_GROUP启动进行测试

访问 http://localhost:8083/order/version 返回:这里是dev环境

将group配置为TEST_GROUP启动进行测试

访问 http://localhost:8083/order/version 返回:这里是test环境

说明

​ 只通过Group来进行多环境的区分的方式我不推荐使用,因为涉及到了多环境自然就会改变spring.profile.active,而profile一旦生效,配置文件就会依据DataID的规则进行查找。所以Group的方式仅作参考。

​ Group的合理用法应该是配合namespace进行服务列表和配置列表的隔离和管理

Namespace方案

Namespace命名空间进行环境隔离也是官方推荐的一种方式。Namespace的常用场景之一是不同环境的配置的区分隔离,例如:开发测试环境和生产环境的资源(如配置、服务)隔离等。

创建命名空间

创建命名空间DEVTEST,不同的命名空间会生成相应的UUID,如下图

新建配置文件

在命名空间DEV下创建DataID为:order-server.properties,Group为默认值的配置,配置如下

1
api.version=DEV命名空间:1.0.0

在命名空间TEST下创建DataID为:order-server.properties,Group为默认值的配置,配置如下

1
api.version=TEST命名空间:1.0.0

配置文件修改

修改项目中的配置文件bootstrap.properties

在config下增加一条namespace的配置,指定当前配置所在的命名空间ID。注意是命名空间ID!!!配置如下

1
2
3
4
5
6
7
8
9
10
11
# 配置中心url
spring.application.name=order-server
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties

#命名空间
spring.cloud.nacos.config.namespace=365beaa5-c021-418c-a1cb-17dc0d848b01
启动测试

将namespace配置为DEV的ID:365beaa5-c021-418c-a1cb-17dc0d848b01,启动进行测试

访问 http://localhost:8083/order/version 返回:这里是DEV命名空间

将namespace配置为TEST的ID:40b65768-3319-4c6a-a556-77fee921e9fc,启动进行测试

访问 http://localhost:8083/order/version 返回:这里是TEST命名空间

通过指定namespace的方式启动,均可读取到对应的启动端口和相关配置

说明

​ Namespace是官方推荐的环境隔离方案,确实有他的独到之处,使用namespace这种方案,同时可以与DataID+profile的方式结合

​ 同时释放Group的限制,大大提高多环境配置管理的灵活性。

小结

通过上面三种方案的介绍,想必大家对于多环境下的配置读取方式应该有所选择

  • DataID: 适用于项目不多,服务量少的情况。
  • Group:实现方式简单,但是容易与DataID方案发生冲突,仅适合于本地调试
  • Namespace:实现方式简单,配置管理简单灵活,同时可以结合DataID共同使用,推荐这种方案

多环境下管理及隔离

​ 现如今,在微服务体系中,一个系统往往被拆分为多个服务,每个服务都有自己的配置文件,然后每个系统往往还会准备开发环境、测试环境、正式环境

​ 我们来说算一算,假设某系统有10个微服务,那么至少有10个配置文件吧,三个环境(dev\test\prod),那就有30个配置文件需要进行管理。

​ 这么多的配置文件,要修改一个或者多个的时候,稍有不慎可能就会出现改错了、不生效…等等问题。

那么如果引入Nacos作为配置中心后,如何有效的进行配置文件的管理和不同环境间的隔离区分呢?

Namespace

Nacos引入了命名空间(Namespace)的概念来进行多环境配置和服务的管理及隔离

Namespace也是官方推荐的多环境支持方案。

如何进行配置和服务的管理、隔离

​ 当我们的服务达到一定的数量,集中式的管理许多服务会十分不便,那我们可以将这些具有相同特征或属性的服务进行分组管理,服务对应的配置也进行分组隔离,这里的分组就是Namespace的概念,将服务和配置纳入相同的Namespace进行管理,不同Namespace下的服务和配置之间就隔离开来

创建和获取NamespaceID

NamespaceId值是在配置文件配置时必须要填入的配置项,所以需要我们先创建Namespace和Id,步骤如下:

​ nacos 的控制台左边功能栏看到有一个命名空间的功能,点击就可以看到新建命名空间 的按钮

​ 新建成功后,可以在命名空间列表中查看到你所创建的Namespace和他生成的ID值

​ 这里只是讲解创建步骤,本文继续延用上面创建的DEV、TEST

Namespace实施方案

Nacos给出了两种Namespace的实践方案

  • 面向单租户
  • 面向多租户

面向单租户

从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的 namespce,以此来实现多环境的隔离。

​ 例如,你可能有dev,test和prod三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace。如下图所示:

这里的单租户同样也适于小型项目,或者是项目不太多时的实施方案

通过定义不同的环境,不同环境的项目在不同的Namespace下进行管理,不同环境之间通过Namespace进行隔离

这里以Namespace:dev为例,在Namespace中通过不同Group进行同一环境中不同项目的再分类

Namespace下新建配置文件
dev环境配置

进入Nacos控制台,切换到Namespace:dev界面,新建配置文件

  • DataId:order-server.properties
  • Group:order
  • 配置格式:properties
  • 配置内容:

    1
    api.order.version=order-server-dev:1.0.0

继续新建配置文件

  • DataId:user-server.properties
  • Group:user
  • 配置格式:properties
  • 配置内容:
1
api.user.version=user-server-dev:1.0.0

TEST环境配置

进入Nacos控制台,切换到Namespace:TEST界面,新建配置文件

  • DataId:order-server.properties
  • Group:order
  • 配置格式:properties
  • 配置内容:

    1
    api.order.version=order-server-test:1.0.0

继续新建配置文件

  • DataId:user-server.properties
  • Group:user
  • 配置格式:properties
  • 配置内容:
1
api.user.version=user-server-test:1.0.0

注意检查DataId是否正确、group、配置内容与环境是否匹配

服务配置
order-server配置

以下NamespaceId均来自创建Namespace时生成的Id,在控制台命名空间页面中可以查看

创建dev环境配置文件bootstrap-dev.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
# 配置中心url
spring.application.name=order-server
#测试环境
spring.profiles.active=dev
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=order
#命名空间
spring.cloud.nacos.config.namespace=365beaa5-c021-418c-a1cb-17dc0d848b01

创建test环境配置文件bootstrap-test.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
# 配置中心url
spring.application.name=order-server
#测试环境
spring.profiles.active=test
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=order
#命名空间
spring.cloud.nacos.config.namespace=40b65768-3319-4c6a-a556-77fee921e9fc
user-server配置

重复以上操作

记得修改spring.application.namenamespacegroup

创建dev环境配置文件bootstrap-dev.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
# 配置中心url
spring.application.name=user-server
#测试环境
spring.profiles.active=dev
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=user
#命名空间
spring.cloud.nacos.config.namespace=365beaa5-c021-418c-a1cb-17dc0d848b01

创建test环境配置文件bootstrap-test.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
# 配置中心url
spring.application.name=user-server
#测试环境
spring.profiles.active=test
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=user
#命名空间
spring.cloud.nacos.config.namespace=40b65768-3319-4c6a-a556-77fee921e9fc
启动工程

分别启动两个项目的两个环境(四个启动类)

2个项目分别有两个不同的环境devtest

尝试访问接口来获取配置信息,验证是否可以读取相应环境配置

1
2
3
4
order-server-dev:1.0.0
order-server-test:1.0.0
user-server-dev:1.0.0
user-server-test:1.0.0

方案1通过Namespace来隔离不同的环境(dev\test),在具体的环境Namespace中通过Group来管理不同的项目

面向多租户

从多个租户(用户)的角度来看,每个租户(用户)可能会有自己的 namespace,每个租户(用户)的配置数据以及注册的服务数据都会归属到自己的 namespace 下,以此来实现多租户间的数据隔离。

例如超级管理员分配了三个租户,分别为张三、李四和王五。张三负责A项目,李四负责B项目,王五负责C项目

分配好了之后,各租户用自己的账户名和密码登录后,创建自己的命名空间。如下图所示:

多租户方案通过Namespace来隔离多租户之间的服务和配置,但不仅于此,他有很好的扩展性

在该方案中,Group同样也有用武之地。

需求改变下,公司发展迅速业务调整,张三负责A项目、B项目、C项目,李四负责D项目、E项目、F项目,王五负责G项目、H项目、I项目,

而每个项目又分了dev、test、prod三个环境,继续沿用之前的Namespace隔离租户方案,显得有些管理不便,这时候可以在NameSpace中加入Group进行项目环境分组,如图:

但是当业务规模更大的时候(不考虑Nacos集群能否支持的因素),张三、李四、王五每人都负责10多个项目时,即项目数>环境数时,可以通过Group进行项目分组,如下图:

通过上面的理论分析,可以看出方案二有很好的扩展性

依旧如上,我们通过代码来实践一下方案2(Namespace隔离租户 + group环境分组)

场景描述

依旧使用上面的两个项目,假设现在有两个租户,张三、李四

​ 张三负责项目:order-server, 李四负责项目:user-server,项目分别有dev和test环境

新建Namespace和配置文件
新建租户

新建两个Namespace来隔离租户,分别为zhangsanlisi

张三租户配置

在Namespace:zhangsan 下创建配置文件

  • DataId:order-server-dev.properties
  • Group:order-dev
  • 配置格式:properties
  • 配置内容

    1
    api.order.version=order-server-zhangsan-dev:1.0.0

继续创建test环境配置文件

  • DataId:order-server-test.properties
  • Group:order-test
  • 配置格式:properties
  • 配置内容

    1
    api.order.version=order-server-zhangsan-test:1.0.0

李四租户配置

在Namespace:lisi 下创建配置文件

  • DataId:user-server-dev.properties
  • Group:user-dev
  • 配置格式:properties
  • 配置内容

    1
    api.user.version=user-server-lisi-dev:1.0.0

继续创建test环境配置文件

  • DataId:user-server-test.properties
  • Group:user-test
  • 配置格式:properties
  • 配置内容

    1
    api.user.version=order-server-lisi-test:1.0.0

注意核对DataId、Group、和配置内容

服务配置
order-server配置

使用张三的 namespaceID

创建dev环境配置文件bootstrap-dev.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
# 配置中心url
spring.application.name=order-server
#测试环境
spring.profiles.active=dev
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=order-dev
#命名空间
spring.cloud.nacos.config.namespace=98b30ec5-3e76-45bd-8d2b-8535d047f68e

创建test环境配置文件bootstrap-test.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
# 配置中心url
spring.application.name=order-server
#测试环境
spring.profiles.active=test
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=order-test
#命名空间
spring.cloud.nacos.config.namespace=98b30ec5-3e76-45bd-8d2b-8535d047f68e
user-server配置

使用李四的 namespaceID

重复以上操作

主要修改namespace和group属性,与命名空间lisi的ID和其下配置文件的Group对应

创建dev环境配置文件bootstrap-dev.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
# 配置中心url
spring.application.name=user-server
#测试环境
spring.profiles.active=dev
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=user-dev
#命名空间
spring.cloud.nacos.config.namespace=4d93ca93-6777-4612-906b-e5ecb1ca1a0c

创建test环境配置文件bootstrap-test.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
# 配置中心url
spring.application.name=user-server
#测试环境
spring.profiles.active=test
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=user-test
#命名空间
spring.cloud.nacos.config.namespace=4d93ca93-6777-4612-906b-e5ecb1ca1a0c
启动项目

分别启动两个项目的两个环境(四个启动类

此时两个项目分别启动两个环境后,注册到Nacos上不同的Namespace下,并读取相应环境的配置,具体如下:

order-server

  • dev: 注册到Namespace:zhangsan,读取Namespace:zhangsan下Group:order-dev的配置
  • test: 注册到Namespace:zhangsan,读取Namespace:zhangsan下Group:order-test的配置

user-server

  • dev: 注册到Namespace:lisi,读取Namespace:lisi下Group:user-dev的配置
  • test: 注册到Namespace:lisi,读取Namespace:lisi下Group:user-test的配置

此时Nacos控制台如下图:

ok我们来测试下各个环境的服务能否访问到对应的配置

1
2
3
4
order-server-zhangsan-dev:1.0.0
order-server-zhangsan-test:1.0.0
user-server-lisi-dev:1.0.0
user-server-lisi-test:1.0.0

通过访问服务的接口,各个服务都可以准确的读取到各自环境下的配置文件

小结

以上分析了Nacos对于Namespace提供的两种实践方案,同时进行了代码实验,均达到了预期的要求。

现对两种方案进行一个总结

  • 单租户方案(方案1):适合小型项目,服务数量不多时,方案一完全够用
  • 多租户方案(方案2):适合项目量多,有一定的团队规模,且服务数量较多时,可以相对条理清晰的管理和隔离配置及服务。

Nacos 共享配置

相同分组共享

场景描述

一个项目中服务数量增加后,配置文件相应增加,多个配置文件中会存在相同的配置,那么我们可以将相同的配置独立出来,作为该项目中各个服务的共享配置文件,每个服务都可以通过Nacos进行共享配置的读取

下面用一个demo演示下,是否可行

  • demo工程:order-server
  • 配置文件:order-server.properties
  • 共享配置文件:order-server1.properties,order-server2.properties
代码改造

将我们的 order-server 的 OrderServiceImpl 改造一下

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
@Component
@RefreshScope
public class OrderServiceImpl implements OrderService {

@Value("${server.port}")
private int serverPort;

@Value("${nacos.share}")
private String share;


@Value("${share.config1}")
private String shareConfig1;

@Value("${share.config2}")
private String shareConfig2;


@Override
public String getVersion() {
System.out.println("===========nacos配置===========");
System.out.println("share:" + share);
System.out.println("shareConfig1:" + shareConfig1);
System.out.println("shareConfig2:" + shareConfig2);
System.out.println("===============================");
String value = share + ":" + shareConfig1 + ":" + shareConfig2;
return value;
}

}
配置文件修改

修改该项目的配置文件bootstrap.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
# 配置中心url
spring.application.name=order-server
#测试环境
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties
# 共享的配置文件
spring.cloud.nacos.config.shared-dataids=order-server-share1.properties,order-server-share2.properties
# 共享配置文件自动刷新配置
spring.cloud.nacos.config.refreshable-dataids=order-server-share1.properties,order-server-share2.properties

从配置文件可以看出,通过shared-dataids属性来指定要读取共享配置文件的DataID,多个文件用,分隔
使用refreshable-dataids指定共享配置文件支持自动刷新

新建配置文件

这里我们作为演示,暂不加入Namespace,直接在公共空间中创建及测试

创建依赖配置文件

创建配置文件norder-server.properties,详细如下:

  • DataId:order-server.properties

  • 配置格式:properties

  • 配置内容

    1
    nacos.share=order-server:1.0.0
创建共享配置

共享配置1

创建配置文件order-server-share1.properties,详细如下:

  • DataId:order-server-share1.properties

  • 配置格式:properties

  • 配置内容

    1
    share.config1=nacos共享配置1:1.0.0

共享配置2

创建配置文件order-server-share2.properties,详细如下:

  • DataId:order-server-share2.properties

  • 配置格式:properties

  • 配置内容

    1
    share.config2=nacos共享配置2:1.0.0

创建成功后,配置列表如下图:

启动测试

直接启动项目,如果启动成功,访问启动类中提供的接口,测试下能否获取到共享配置文件中的值

1
2
3
4
5
===========nacos配置===========
share:order-server:1.0.0
shareConfig1:nacos共享配置1:1.0.0
shareConfig2:nacos共享配置2:1.0.0
===============================

再测试下refreshable-dataids配置的自动刷新是否生效

在Nacos控制台中修改共享配置文件order-server-share2.properties

编辑保存后,重新请求 127.0.0.1:9984/getShare2 ,观察返回结果如下:

1
2
3
4
5
===========nacos配置===========
share:order-server:1.0.0
shareConfig1:nacos共享配置1:1.0.0
shareConfig2:nacos共享配置2修改测试:1.0.0
===============================

以上返回结果说明通过在配置文件中指定shared-dataidsrefreshable-dataids是可以实现共享配置文件的读取和自动刷新的。

需求变更

假设现在要读取order-server-share3.properties和order-server-share4.properties文件但是它的Group为SHARE3_GROUP和SHARE4_GROUP, 即共享配置文件与项目自身配置文件不在同一Group中(上边的例子是全都在DEFAULT_GROUP分组) 那如果继续用上边的方法,就无法读取共享配置文件

​ 这时可以使用另一个配置ext-config,它可以由用户自定义指定需要加载的配置DataID、Group以及是否自动刷新,并且ext-config是一个集合(List),支持多个配置文件的指定。

新建共享配置文件

先创建配置配置文件order-server-share3.propertiesorder-server-share4.properties,注意他们的Group属性

共享配置3
  • DataId:order-server-share3.properties

  • Group:SHARE3_GROUP

  • 配置格式:properties

  • 配置内容:

    1
    share.config3=这里是共享配置文件3,Group:SHARE3_GROUP
共享配置4
  • DataId:order-server-share4.properties

  • Group:SHARE4_GROUP

  • 配置格式:properties

  • 配置内容:

    1
    share.config4=这里是共享配置文件4,Group:SHARE4_GROUP

创建成功页面如下:

修改项目代码

在OrderServiceImpl类中加入属性字段

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

@Component
@RefreshScope
public class OrderServiceImpl implements OrderService {

@Value("${server.port}")
private int serverPort;

@Value("${nacos.share}")
private String share;


@Value("${share.config1}")
private String shareConfig1;

@Value("${share.config2}")
private String shareConfig2;

@Value("${share.config3}")
private String shareConfig3;

@Value("${share.config4}")
private String shareConfig4;


@Override
public String getVersion() {
System.out.println("===========nacos配置===========");
System.out.println("share:" + share);
System.out.println("shareConfig1:" + shareConfig1);
System.out.println("shareConfig2:" + shareConfig2);
System.out.println("shareConfig3:" + shareConfig3);
System.out.println("shareConfig4:" + shareConfig4);
System.out.println("===============================");
String value = share + ":" + shareConfig1 + ":" + shareConfig2+":"+shareConfig3+":"+shareConfig4;
return value;
}

}
修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 配置中心url
spring.application.name=order-server
#测试环境
#注册中心地址
spring.cloud.nacos.server-addr=192.168.64.128:8848
# 配置中心展现的服务名称
spring.cloud.nacos.config.server-addr=192.168.64.128:8848
#配置文件类型[TEXT,JSON,XML,YAML,HTML,Properties]
spring.cloud.nacos.config.file-extension=properties
# 共享的配置文件
spring.cloud.nacos.config.shared-dataids=order-server-share1.properties,order-server-share2.properties
# 共享配置文件自动刷新配置
spring.cloud.nacos.config.refreshable-dataids=order-server-share1.properties,order-server-share2.properties

# 加载order-server-share3 配置
spring.cloud.nacos.config.ext-config[0].data-id=order-server-share3.properties
spring.cloud.nacos.config.ext-config[0].group=SHARE3_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true
# 加载order-server-share4 配置
spring.cloud.nacos.config.ext-config[1].data-id=order-server-share4.properties
spring.cloud.nacos.config.ext-config[1].group=SHARE4_GROUP
spring.cloud.nacos.config.ext-config[1].refresh=true
启动进行测试

项目经过修改后,可以看到

  1. 项目自身的nacos配置文件属于DEFAULT_GROUP下,默认读取
  2. order-server-share1.properties,order-server-share2.properties 都属于DEFAULT_GROUP下,通过shared-dataids指定进行读取
  3. order-server-share3.properties,order-server-share4.properties 都属于非DEFAULT_GROUP下,通过ext-config配置属性进行自定义读取

启动项目,测试所有的配置文件是否可以正常读取

1
2
3
4
5
6
7
===========nacos配置===========
share:order-server:1.0.0
shareConfig1:nacos共享配置1:1.0.0
shareConfig2:nacos共享配置2修改测试:1.0.0
shareConfig3:这里是共享配置文件3,Group:SHARE3_GROUP
shareConfig4:这里是共享配置文件4,Group:SHARE4_GROUP
===============================

修改order-server-share4.properties 的配置内容为:这里是共享配置文件4,Group:SHARE4_GROUP,支持自动刷新,保存后,再次调用返回如下:

1
2
3
4
5
6
7
===========nacos配置===========
share:order-server:1.0.0
shareConfig1:nacos共享配置1:1.0.0
shareConfig2:nacos共享配置2修改测试:1.0.0
shareConfig3:这里是共享配置文件3,Group:SHARE3_GROUP
shareConfig4:这里是共享配置文件4,Group:SHARE4_GROUP,支持自动刷新
===============================

调用接口后发现,两种共享配置的加载方式都可以正常读取,并且可以一起使用。ext-config的方式实现了用户自定义配置共享配置文件。

小结

上面的demo已经演示Nacos共享配置的两种实现方式,两种方式针对不同的场景,总结如下:

shared-dataids方式

适合于共享配置文件与项目默认配置文件处于相同Group时,直接两条命令就可以搞定

  • 优点:配置方便

  • 缺点:只能在Q同一Group中

ext-config方式

它可以由开发者自定义要读取的共享配置文件的DataId、Group、refresh属性,这样刚好解决了shared-dataids存在的局限性。

  • 优点:可以与shared-dataids方案结合使用,用户自定义配置。灵活性强
  • 缺点:配置容易出错,要熟悉YAML语法

可见两种方式各有长处,所以如果在开发中需要使用共享配置,大家可以是具体情况而定选择自己最合适的方案。

评论