【问题标题】:Common application property file for multiple microservice多个微服务的通用应用程序属性文件
【发布时间】:2019-04-03 16:45:11
【问题描述】:

我想为多个微服务使用一个通用的应用程序属性文件,这些微服务将具有一些通用配置,例如 DB Source config 等。我已将配置服务器与 Eureka 服务器和 zull Proxy 一起使用。

问题:

当使用 configServer 我们需要提供 spring.application.name = 'xyz' 依次找到此微服务配置的 xyz.properties。

同样的方式,我们使用zuul代理注册服务时,也需要使用相同的应用名称来配置服务路径,如zuul.routes.xyz.path = /iii/*。

现在我希望多个服务共享相同的属性文件(xyz.properties),但还需要注册 zuul 路由,因此我必须为每个服务提供不同的名称。如果我为每个服务提供不同的名称,他们将无法找到相同的属性文件。

我是 Spring Boot 微服务的新手。

【问题讨论】:

  • 作为 spring cloud config 的一部分,可以提供多个配置名称。前任。 xyz.properties,common.properties。配置 spring.config.client.name=xyz,common。现在您可以将 common 用作任何服务的一部分
  • @Barath.. 我已经评论了 spring.application.name=xyz 并添加了 spring.config.client.name=xyz,common... 现在应用程序无法启动,因为它无法启动找到启动属性(数据库属性)..
  • 可以分享你的项目吗?
  • 我在这里分享了一个例子multiple-config-client
  • 谢谢@Barath...知道了...

标签: spring-boot microservices netflix-eureka netflix-zuul spring-cloud-config


【解决方案1】:

spring.config.client.name支持多个名称以逗号分隔来加载配置属性。

在这种情况下,将公共属性存储在 common.yml 中,将 xyz 属性存储在 xyz.yml 中。最后提一下spring.cloud.config.name: xyz,common

spring:
  cloud:
    config:
      uri: http://localhost:8888
      name: xyz,common

输出:

Fetching config from server at : http://localhost:8888
Located environment: name=xyz,common, profiles=[default], label=null, version=91edcf96c6a88707bf39014a16ad5d301d6b4575, state=null
Located property source: CompositePropertySource {name='configService', propertySources=[MapPropertySource {name='configClient'}, MapPropertySource {name='https://github.com/BarathArivazhagan/config-server-repository/common.yml'}, MapPropertySource {name='https://github.com/BarathArivazhagan/config-server-repository/xyz.yml'}]}

【讨论】:

    【解决方案2】:

    我想指出,提供的解决方案利用“spring.config.client.name”客户端属性语义来实现配置服务器服务行为除了 application[-profile].* 和 {appname}[-profile].*

    之外的多个文件中的属性文件

    然而,请注意,对于一个简单的情况并考虑根目录,配置服务器会从在此根目录中定义的文件或具有应用程序名称的文件夹下的文件中提供属性,即属性它下面的文件对应,即 */{appname}/application[-profile].** 或 */{appname}/{appname}[-profile].**

    spring.config.client.name”环境属性指示配置服务器与请求应用程序匹配的应用程序名称。这意味着给定 spring.config.client.name=a,b ,配置服务器将假定服务属性为应用程序定义(与name) a 和 b 到请求的应用程序!这与我希望从 file names a 和 b 提供我的属性不完全相同!因此,我们滥用属性语义来管理我们的配置服务器从我们想要的文件名中提供服务。

    但是,由于 spring.config.client.name 的实际语义,配置服务器将提供所有适用的内容

    • /a[-profile].*
    • /b[-profile].*
    • /a/{适用名称}
    • /b/{适用名称}

    这里的警告是我们只为根目录实现了我们想要的,此外,如果我们有一个为多个 springboot 应用程序提供服务的配置服务器,我们将失去将所有属性置于我们之下的能力。应用程序的名称文件夹。

    更糟糕的是,如果存在另一个应用程序(或 -注意!- 将来会存在)与我们想要的属性之一同名文件名,配置服务器将开始为我们的应用提供所有其他应用定义的配置!!!这可能会导致错误甚至有害的服务配置!

    (我再说一遍,它将提供适用于 /{other-app-name-that-i-happened-to-use-as-filename 的一切 -and-defined-it-through-spring.config.client.name}/*!!!)

    所以在尝试这种方法时要小心!

    我已经发布了一个pull request for spring-cloud-config-server 1.4.x,它支持通过 spring.cloud.config.server.searchNames 环境属性定义额外的文件名,就像一个单一的 springboot 一样应用程序,如文档的Externalized Configuration.Application Property Files 部分中所定义,使用 spring.config.name 环境属性。我希望他们尽快审查它

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 2023-02-03
      • 2021-12-05
      • 2020-08-19
      • 2019-06-13
      • 2017-04-03
      相关资源
      最近更新 更多