如何在引导文件中正确设置不同的Spring配置文件(对于Spring Boot以针对不同的云配置服务器)?

我们为每个环境都有不同的配置服务器。每个弹簧引导应用程序都应以相应的配置服务器为目标。我试图通过在bootstrap.properties文件中设置配置文件来实现这一点,例如:

spring.application.name=app-name
spring.cloud.config.uri=http://default-config-server.com

---
spring.profiles=dev
spring.cloud.config.uri=http://dev-config-server.com

---
spring.profiles=stage
spring.cloud.config.uri=http://stage-config-server.com

---
spring.profiles=prod
spring.cloud.config.uri=http://prod-config-server.com

然后我设置了 cla,但加载的配置服务器始终是文件中的最后一个设置(即 prod 配置服务器将在上述设置中加载,然后如果 prod 被删除,则将加载 stage)。-Dspring.profiles.active=dev

是否可以为云配置服务器设置引导配置文件?我遵循了这个例子,但似乎无法让它工作。值得一提的是,这些配置文件非常适合加载正确的配置(即.app-name-dev.properties将在开发配置文件处于活动状态时加载),但不会从正确的配置服务器中提取。


答案 1

在单个文件中指定不同的配置文件仅支持 YAML 文件,不适用于属性文件。对于属性文件,请指定一个特定于以覆盖默认属性的环境。bootstrap-[profile].propertiesbootstrap.properties

因此,在您的情况下,您将获得4个文件,和。bootstrap.propertiesbootstrap-prod.propertiesbootstrap-stage.propertiesbootstrap-dev.properties

但是,您也可以只提供默认值,并在启动应用程序时通过将 a 传递给应用程序来覆盖属性。bootstrap.properties-Dspring.cloud.config.uri=<desired-uri>

java -jar <your-app>.jar -Dspring.cloud.config.uri=<desired-url>

这将优先于默认配置的值。


答案 2
I solved a similar problem with an environment variable in Docker. 

bootstrap.yml

spring:
  application:
    name: dummy_service
  cloud:
    config:
      uri: ${CONFIG_SERVER_URL:http://localhost:8888/}
      enabled: true
  profiles:
    active: ${SPR_PROFILE:dev}

Dockerfile

ENV CONFIG_SERVER_URL=""
ENV SPR_PROFILE=""

Docker-compose.yml

version: '3'

services:

  dummy:
    image: xxx/xxx:latest
    restart: always
    environment:  
      - SPR_PROFILE=docker
      - CONFIG_SERVER_URL=http://configserver:8888/
    ports:
      - 8080:8080
    depends_on:
      - postgres
      - configserver
      - discovery

推荐