六、配置获取规则
在有了cluster概念后,配置的规则就显得重要了。
比如应用部署在A机房,但是并没有在Apollo新建cluster,这个时候Apollo的行为是怎样的?
或者在运行时指定了cluster=SomeCluster,但是并没有在Apollo新建cluster,这个时候Apollo的行为是怎样的?
接下来就来介绍一下配置获取的规则。
一、 应用自身配置的获取规则
当应用使用下面的语句获取配置时,我们称之为获取应用自身的配置,也就是应用自身的application namespace
的配置。
Config config = ConfigService.getAppConfig();
对这种情况的配置获取规则,简而言之如下:
-
首先查找运行时cluster的配置(通过apollo.cluster指定)
-
如果没有找到,则查找数据中心cluster的配置
-
如果还是没有找到,则返回默认cluster的配置
图示如下:
所以如果应用部署在A数据中心,但是用户没有在Apollo创建cluster,那么获取的配置就是默认cluster(default)的。
如果应用部署在A数据中心,同时在运行时指定了SomeCluster,但是没有在Apollo创建SomeCluster,那么获取的配置就是A数据中心cluster的配置,如果A数据中心cluster没有配置的话,那么获取的配置就是默认cluster(default)的。
演示
在default 集群
中的application namesapce添加配置:
my.name=username
修改springboot程序中的application.properties配置:
apollo.cluster=green0001
green0001集群在Apollo中不存在。启动后获取my.name配置的值,显示为username
。当green0001集群不存在时,使用的是默认集群中的配置。
现在default 集群中的my.name配置为:
my.name=username
green集群中的my.name配置为:
my.name=李四
修改springboot程序中的application.properties配置:
apollo.cluster=green
重启程序后获取my.name配置,显示为李四
。当配置的集群有配置值时就优先使用。
二、公共组件配置的获取规则
以FX.Hermes.Producer
为例,hermes producer是hermes
发布的公共组件。当使用下面的语句获取配置时,我们称之为获取公共组件的配置。
Config config = ConfigService.getConfig("FX.Hermes.Producer");
对这种情况的配置获取规则,简而言之如下:
-
首先获取当前应用下的
FX.Hermes.Producer
namespace的配置 -
然后获取hermes应用下
FX.Hermes.Producer
namespace的配置 -
上面两部分配置的并集就是最终使用的配置,如有key一样的部分,以当前应用优先
图示如下:
演示
在common_app应用中配置:
在my_app001应用中关联common_app应用的common namespace,并修改配置:
修改SpringBoot项目的application.properties:
apollo.bootstrap.namespaces = application,common
增加common namesapce。
在Controller中新增:
@Value("${kk.v1}")
private String v1;
@Value("${kk.v2}")
private String v2;
@GetMapping("/v1")
public String v1() {
return v1;
}
@GetMapping("/v2")
public String v2() {
return v2;
}
启动程序后访问http://localhost:8000/v1,和http://localhost:8000/v2,获取到的值都是345。当配置在关联的namesapce中,首先从当前应用中获取,获取不到再到关联的应用中获取。