-
Notifications
You must be signed in to change notification settings - Fork 223
using configuration
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文件
该配置是 Spring Cloud Huawei提供的配置扩展,用于在组件(jar包)中包含缺省配置,该配置文件的优先级为最低。 当多个组件存在相同的配置项的时候,可以通过 x-component-order
指定文件配置项的优先级。该配置机制对于功能模块预置缺省配置提供了很大的方便。
x-component-order: 100
spring:
cloud:
servicecomb:
context:
enableAsyncTrace: true
微服务引擎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}]
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();
}
-
使用Spring Cloud Huawei功能
-
使用服务治理
-
生态集成
-
迁移改造问题
-
配置参考
-
优秀实践
-
常见问题