六、配置获取规则

在有了cluster概念后,配置的规则就显得重要了。

比如应用部署在A机房,但是并没有在Apollo新建cluster,这个时候Apollo的行为是怎样的?

或者在运行时指定了cluster=SomeCluster,但是并没有在Apollo新建cluster,这个时候Apollo的行为是怎样的?

接下来就来介绍一下配置获取的规则。

一、 应用自身配置的获取规则

当应用使用下面的语句获取配置时,我们称之为获取应用自身的配置,也就是应用自身的application namespace的配置。

Config config = ConfigService.getAppConfig();

对这种情况的配置获取规则,简而言之如下:

  1. 首先查找运行时cluster的配置(通过apollo.cluster指定)

  2. 如果没有找到,则查找数据中心cluster的配置

  3. 如果还是没有找到,则返回默认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");

对这种情况的配置获取规则,简而言之如下:

  1. 首先获取当前应用下的FX.Hermes.Producer namespace的配置

  2. 然后获取hermes应用下FX.Hermes.Producer namespace的配置

  3. 上面两部分配置的并集就是最终使用的配置,如有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中,首先从当前应用中获取,获取不到再到关联的应用中获取。

posted @ 2023-07-01 19:44  shigp1  阅读(60)  评论(0编辑  收藏  举报