Skip to content

using configuration

liubao edited this page May 31, 2023 · 11 revisions

服务动态配置

Spring Cloud Huawei完全兼容Spring Cloud的配置层次,并且提供了扩展以支持组件配置文件和动态配置。 典型的配置层次包括:

  • bootstrap阶段

    • Java System Property: -D 参数
    • 环境变量
    • bootstrap.yml/boostrap.yaml文件
    • component.yml/component.yaml文件
  • 应用阶段

    • 动态配置(ServiceComb或者Nacos)
    • Java System Property: -D 参数
    • 环境变量
    • application.yml/application.yaml文件
    • bootstrap.yml/boostrap.yaml文件
    • component.yml/component.yaml文件

component.yml/component.yaml文件

该配置是 Spring Cloud Huawei提供的配置扩展,用于在组件(jar包)中包含缺省配置,该配置文件的优先级为最低。 当多个组件存在相同的配置项的时候,可以通过 x-component-order 指定文件配置项的优先级。该配置机制对于功能模块预置缺省配置提供了很大的方便。

x-component-order: 100

spring:
  cloud:
    servicecomb:
      context:
        enableAsyncTrace: true

动态配置:CSE(ServiceComb)

微服务引擎1.0使用config-center作为配置中心。微服务默认会读取配置中心全局配置、服务配置。全局配置指环境和微服务相同的配置;服务配置指环境、应用、微服务名称和微服务相同的配置。微服务引擎1.0只支持key-value的配置项。如果用户需要使用yaml格式的配置文件,可以使用具体SDK提供的fileSource功能。通过在配置文件中指定fileSource的key列表,SDK会将这些key对应的value全部当成yaml解析。以Spring Cloud为例,在bootstrap.yml中增加配置项:

spring:
  cloud:
    servicecomb:
      config:
        fileSource: file1.yaml,file2.yaml

并且在配置中心创建配置:

file1.yaml: |
  cse.example.key1: value1
  cse.example.key2: value2
file2.yaml: |
  cse.example.key3: value3
  cse.example.key4: value4

应用程序中会发现4个配置项:cse.example.key1=value1,cse.example.key2=value2,cse.example.key3=value3和cse.example.key4=value4。

微服务引擎2.0使用kie作为配置中心。微服务默认会读取配置中心应用配置、服务配置、自定义配置。应用配置指环境、应用和微服务相同的配置;服务配置指环境、应用、微服务名称和微服务相同的配置。微服务可以在配置文件中指定一个特定的label及label值,自定义配置指label及label值与微服务相同的配置。简单的场景,可以使用应用级配置和服务级配置。应用级配置被该应用下的所有微服务共享,是公共配置;服务级配置只对具体微服务生效,是独享配置。复杂的场景,可以通过使用customLabel和customLabelValue来定义配置。例如某些配置,是对所有应用共享的,那么就可以使用这个机制。在配置文件增加如下配置(以Spring Cloud为例):

spring:
  cloud:
    servicecomb:
      config:
        kie:
          customLabel: public# 默认值是public
          customLabelValue: default # 默认值是空字符串

只要配置项带有public标签,并且标签值为default,这些配置项就会对该微服务生效。把配置中心当成数据库的一个表tbl_configurations,key是主键,每个label 都是属性。客户端每次会根据如下3个条件查询配置:

  • 自定义配置

      select * from tbl_configurations where customLabel=customLabelValue & withStrict=false
    
  • 应用级配置

      select * from tbl_configurations where app=demo_app & environment=demo_environment & withStrict=true
    
  • 服务级配置

      select * from tbl_configurations where app=demo_app & environment=demo_environment & service=demo_service & withStrict=true
    

其中,withStrict为true的时候,表示有且只有条件里面指定的属性;withStrict为false的时候,表示除了条件里面的属性,允许有其他的属性。还可以给标签app指定多个应用,或者给标签service指定多个服务,这样配置项就可以对多个服务和应用生效,非常灵活。微服务引擎2.0的TEXT、XML等类型,SDK会简单的当成key-value对使用;YAML和Properties类型, SDK会解析内容,应用程序将内容作为实际的应用程序配置项。比如:

类型:TEXT
key: cse.examples.hello
value: World

应用程序会发现1个配置项: cse.examples.hello = World。

类型:YAML
key: cse.examples.hello
value: |
   cse:
     key1: value1
     key2: value2

应用程序会发现2个配置项: cse.key1 = value1和cse.key2 = value2。

配置组合最佳实践:

  • 当前微服务仅需单个文件配置,推荐使用服务级,在cse对应微服务配置服务级配置项即可,这样保证配置不被污染,配置示例如下:
spring:
  cloud:
    servicecomb:
      config:
        serverAddr: 127.0.0.1:30110
        serverType: kie
  • 当前微服务需要的公共配置参数仅对当前应用下所有微服务使用,推荐使用应用级+服务级配置组合,公共配置项放应用级,当前微服务私有配置放服务级,在cse对应微服务配置应用级、服务级配置项即可,配置示例如下:
spring:
  cloud:
    servicecomb:
      config:
        serverAddr: 127.0.0.1:30110
        serverType: kie

配置参数示例如下: yaml格式下:服务级配置内容redisAddress: 127.0.0.1;应用级配置内容zkAddress: 127.0.0.2,微服务从配置中心可以获取到:[{redisAddress:127.0.0.1},{zkAddress:127.0.0.2}]

  • 当前微服务需要的公共配置参数对所有微服务可见,推荐自定义配置+服务级配置组合,公共配置项放自定义配置,当前微服务私有配置放服务级,在cse对应微服务配置服务级、自定义配置项即可,配置示例如下:
spring:
  cloud:
    servicecomb:
      config:
        serverAddr: 127.0.0.1:30110
        serverType: kie
        kie:
          customLabel: public# 默认值是public
          customLabelValue: default # 默认值是空字符串

配置参数示例如下: yaml格式下:服务级配置内容redisAddress: 127.0.0.1;自定义配置A,标签key=public,value=default,配置内容:zkAddress: 127.0.0.2,微服务从配置中心可以获取到:[{redisAddress:127.0.0.1},{zkAddress:127.0.0.2}]

  • 当前微服务需要的公共配置参数对所有微服务可见,且分布在多个配置文件中,则创建的多个配置项中的自定义标签key、value相同,customLabel不支持逗号拼接。
spring:
  cloud:
    servicecomb:
      config:
        serverAddr: 127.0.0.1:30110
        serverType: kie
        kie:
          customLabel: public# 默认值是public
          customLabelValue: default # 默认值是空字符串

配置参数示例如下: yaml格式下:自定义配置B,标签key=public,value=default,配置内容:redisAddress: 127.0.0.1;自定义配置A,标签key=public,value=default,配置内容:zkAddress: 127.0.0.2,微服务从配置中心可以获取到:[{redisAddress:127.0.0.1},{zkAddress:127.0.0.2}]

动态配置:CSE(Nacos)

在程序中读取配置

Spring Cloud提供了多种方式读取配置。最常见的包含如下几种情况:

  • 使用 Environment

可以在 bean 中注入 Environment 变量, 使用 getProperty 方法读取配置。

  • 使用 ConfigurationProperties
@Bean
@ConfigurationProperties("spring.cloud.servicecomb.loadbalancer")
public LoadBalancerProperties loadBalancerProperties() {
  return new LoadBalancerProperties();
}

public class LoadBalancerProperties {
  public static final String LOADBALANCER_ENABLED = "spring.cloud.servicecomb.loadbalancer.enabled";

  public static final String RULE_ROUND_ROBIN = "RoundRobin";

  public static final String RULE_RANDOM = "Random";

  private String rule = RULE_ROUND_ROBIN;

  public String getRule() {
    return rule;
  }

  public void setRule(String rule) {
    this.rule = rule;
  }
}
  • 动态感知配置变化

通过 Environment 读取配置,在配置项的值变化的时候(通过配置中心修改配置值),会获取到最新的值。 通过 ConfigurationProperties 读取配置,默认不会获取到最新值。如果需要获取最新值,需要增加 @RefreshScope 声明。

@Bean
@RefreshScope
@ConfigurationProperties("spring.cloud.servicecomb.loadbalancer")
public LoadBalancerProperties loadBalancerProperties() {
  return new LoadBalancerProperties();
}
Clone this wiki locally