如何使用 env 特定配置创建 Spring Cloud Config Client?

Posted

技术标签:

【中文标题】如何使用 env 特定配置创建 Spring Cloud Config Client?【英文标题】:How to create Spring Cloud Config Client with env specific configuration? 【发布时间】:2019-01-07 20:00:38 【问题描述】:

我遇到了 Spring Cloud Config Server 和 Eureka Server Profiling 的问题。 假设我有 3 个服务,其名称(“spring.application.name”)为:

myapp-svc
myapp-spring-cloud-config-svc
myapp-spring-eureka-svc

我想在 2 个区域( dev 和 prod )中部署每个服务。在 Dev 区域,每个服务都将在 localhost 上运行,并且在 prod 中它会有一些不同的 url。 dev 区域中的“myapp-spring-cloud-config-svc”将指向本地 git repo,而在 prod 区域中它将指向远程 git repo。我可以有 2 个配置:

1) 当我在本地启动“myapp-svc”服务时,它应该连接到 dev 中的“myapp-spring-cloud-config-svc”。 我可以通过设置 spring.cloud.config.uri = 来做到这一点。 但是这个设置的问题是该属性需要在 bootstrap.properties 中定义。 因此,如果将“myapp-svc”部署到 prod,我将不得不更改 config uri 以将其指向 prod 配置服务,这反过来又需要另一个构建创建。 这似乎不是一个好的解决方案,如果我有 50 个与应用程序相关的服务,我无法在产品部署之前更改每个服务的这个属性。 我尝试在“myapp-svc”的 application-dev.properties 中设置 spring.cloud.config.uri 但它不起作用。根据文档,它必须在引导程序中更改。

  So, how do I implement this without having to create new build for prod ?

2)我可以先调用eureka,然后使用eureka我可以在这里调用配置服务。 这里的问题也是一样的。 如果我使用 eureka 查找配置,则必须在“bootstrap.yml”中定义“eureka.client.serviceUrl.defaultZone”。 看到这个:https://cloud.spring.io/spring-cloud-config/multi/multi__spring_cloud_config_client.html 因此,在这种情况下,我也需要在将此服务部署到 prod 之前更改 eureka url。 请帮我解决这个问题……!! 以下是上述每个服务的 yml 属性的样子:

1) myapp-svc:
   1.1)bootstrap.yml  
        spring:
         application:
           name: myapp-svc 
         cloud:
           config:
             discovery:
               enabled: true
               serviceId: myapp-spring-cloud-config-svc
        eureka:
           client:
              serviceUrl:
                defaultZone: http://localhost:8762/eureka/
        server:
           port: 8082


    2) myapp-spring-cloud-config-svc:

      2.1)application-dev.properties:
           spring.cloud.config.server.git.uri=file:///C:/config-repo
           eureka.client.serviceUrl.defaultZone=http://localhost:8762/eureka

      2.2)application-prod.properties:
           spring.cloud.config.server.git.uri=https://github.com/<mygit Repo>

      2.3)bootstrap.proerties:
           spring.application.name=myapp-spring-cloud-config-svc
           server.port=8888


    3) myapp-spring-eureka-svc
       3.1)bootstrap.proerties
        spring.application.name=myapp-spring-eureka-svc
        server.port=8762

【问题讨论】:

【参考方案1】:

1) 您可以为每个受支持的配置文件指定配置文件 bootstrap-&lt;profile&gt;.properties(例如 application-&lt;profile&gt;.properties),以避免为每个环境重新构建您的应用程序。然后只需在启动期间将应用程序配置文件使用传递给您的应用程序。 Spring 将加载正确的bootstrap-&lt;profile&gt;.properties 并将连接到正确的配置服务器(或 eureka 等)。示例:

java -jar your-app.jar --spring.profiles.active=dev

2) 您可以将您的 URL 作为自定义属性从外部传递(与上面的配置文件相同),并在 bootstrap.properties 中拥有类似的东西。示例:

spring.cloud.config.uri=$config.server.url

然后在启动过程中传递--config.server.url= ...

3) 您可以在启动期间以相同的方式传递 Spring 属性。示例:

java -jar your-app.jar --spring.cloud.config.uri= ...

4) 您可以使用系统环境变量。示例:

spring.cloud.config.uri=$SYSTEM_ENV_CLOUD_CONFIG_URI

【讨论】:

感谢 nmyk。它正在根据配置文件拾取文件。我之前试过这个,但之前没有用,现在我再次查看它,我知道原因了。这让我想到了这个问题:如果我在本地 repo 中添加一个文件并提交它,然后启动一个服务,那么该服务正在克隆远程 repo,从而覆盖我在本地 repo 中的更改。我怎样才能阻止这种行为?每次,它都会从远程刷新并删除我本地存储库中添加的任何文件。 spring.cloud.config.server.git.force-pull= false 也没有任何区别,尽管根据文档,默认情况下这是 false。 我知道,人们建议使用“本机”配置文件从本地存储库中读取。但是我已经为 Dev profile 配置了本地 repo,那么有什么解决方法吗? @adwived 我在远程刷新时遇到了同样的问题。所以我看到了 2 个变通办法(也许很完美,但是......) 1. 使用原生并设置 spring.cloud.config.server.native.search-locations=file:///C:/config-repo,然后通过2 个配置文件 --spring.profiles.active=dev,native 2. 使用远程仓库,并有一些沙箱分支,您可以在其中快速提交而无需任何代码审查,在这种情况下,您需要设置 spring.cloud.config.label =your_branch 让配置客户端在开发过程中获取最后的配置 @adwived 如果我回答了您的主要问题,请根据 *** 的建议接受它以帮助他人,谢谢:***.com/help/someone-answers

以上是关于如何使用 env 特定配置创建 Spring Cloud Config Client?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过属性文件而不是通过 env 变量或系统属性设置活动 spring 3.1 环境配置文件

如何在使用 Spring 创建期间配置 kafka 主题保留策略?

天蓝色政策只允许创建特定标签

如何更改Spring-WS的“SOAP-ENV”默认前缀

如何在spring boot中实现用户级别的特定授权?

spring boot 配置多个yaml文件并根据env参数加载