微服务从零到一分布式配置中心(多服务公共文件配置)

                                        分布式配置中心(多服务公共文件配置)

问题描述
     基于 spring-cloud微服务开发,通常会配置一个Spring-Cloud-Config-Server,各个客户端会通过Spring-Cloud-Config-Server从配置仓库拉取自己服务的配置。

    假如客户端Service-A 对应的配置文件为ServiceA.properties,假如客户端Service-B对应的配置文件为ServiceB.properties,如果两个服务都需要使用同一个服务发现(Eureka)的配置,岂不是要在ServiceA.properties和ServiceB.properties中配置两遍,这样的话,万一以后服务发现(Eureka)的配置改了,就要每个服务的配置文件都要去修改了,这样非常难以维护。所以想到了利用公共文件方法,现在在这里简单阐述一下如何配置。(下面例子Spring-Cloud-Config-Server都是使用本地配置方式)。
     

如果你非得要用config作为子目录的目录名称,那你的公共文件就不要用application作为公共文件的名称咯,如何进行公共文件配置呢,开始搜索了好多文章,有一个文章是这样配置的:

例如:

service-a 客户端的 bootstap.yml:

spring:
  application:
    name: service-a, datasorce
service-b 客户端的 bootstap.yml:

spring:
  application:
    name: service-b, datasorce
但是启动客户端项目的时候,压根就会报错:错误信息如下

    Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String  
        at com.netflix.config.ConfigurationBasedDeploymentContext.getValueFromConfig(ConfigurationBasedDeploymentContext.java:329) ~[archaius-core-0.7.4.jar:0.7.4]  
        at com.netflix.config.ConfigurationBasedDeploymentContext.getValue(ConfigurationBasedDeploymentContext.java:349) ~[archaius-core-0.7.4.jar:0.7.4]  
后来怎么去解决都行不通的,其实想想就知道用spring.application.name来配置多个配置文件名,这样的话,服务发现(eureka)是利用spring.application.name作为application Name的,这样设置一个客户端服务有两个服务名,肯定是不恰单的。

如何去配置才可以呢?其实可以在spring.cloud.config.name这里去配置多个配置文件名,这里的common.properties就是公共配置文件。

spring.application.name=ServiceA
spring.cloud.config.uri=http://localhost:8762/config-server
spring.cloud.config.name=ServiceA,common
spring.cloud.config.failFast=true
spring.cloud.config.profile=dev

这样启动的时候可以在日志上看到读取了两个配置文件信息了

 INFO 8736 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource [name='configService', propertySources=[MapPropertySource [name='classpath:/config/ServiceA-dev.properties'], MapPropertySource [name='classpath:/config/common.properties']]]
 

你可能感兴趣的:(微服务)