Конфигурационный сервер Spring Cloud. Переменные среды в свойствах

Я настроил сервер Spring Cloud Config следующим образом:

@SpringBootApplication
@EnableAutoConfiguration
@EnableConfigServer
public class ConfigServer {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServer.class, args);
    }
}

Я использую «родной» профиль, поэтому свойства берутся из файловой системы:

server.port=8888
spring.profiles.active=native
spring.cloud.config.server.native.search-locations: classpath:/global

Теперь самое сложное заключается в том, что некоторые свойства содержат переменные среды. Свойства в 'global/application-production.properties' настроены следующим образом:

test=${DOCKER_HOST}

Когда я запускаю Config Server - все работает нормально. Однако при доступе к http://localhost:8888/testapp/production я вижу это:

{
    name: "testapp",
    profiles: [
        "production"
],
    label: null,
    version: null,
    propertySources: [
        {
            name: "classpath:/global/application-production.properties",
            source: {
                test: "${DOCKER_HOST}"
            }
        }
    ]
}

Таким образом, значение из переменной ENV не заменяет ${DOCKER_HOST}, а возвращается как есть.

Но если я захожу на http://localhost:8888/application-production.properties, результат не JSON, а обычный текст:

test: tcp://192.168.99.100:2376

Весенняя документация говорит:

Представления YAML и свойств имеют дополнительный флаг (предоставленный как логический параметр запроса resolvePlaceholders), чтобы сигнализировать о том, что заполнители в исходных документах в стандартной форме Spring ${…​} должны быть разрешены в выходных данных, где это возможно, до рендеринга. Это полезная функция для потребителей, которые не знают о соглашениях заполнителей Spring.

По какой-то причине resolvePlaceholders не работает для представления JSON, поэтому клиенты конфигурации сервера должны знать обо всех переменных ENV, настроенных на сервере.

Можно ли заставить представление JSON resolvePlaceholders так же, как представление простого текста (свойств)?


person ykravchenko    schedule 03.08.2016    source источник


Ответы (3)


Я столкнулся с той же проблемой. Изучив репозиторий конфигурации Spring Cloud, я обнаружил следующую фиксацию: properties и env vars из заполнителей в config

Похоже, такое поведение не поддерживается.

person Anastasiia Smirnova    schedule 16.02.2017

Вы можете попробовать переопределения свойств. функция для переопределения свойств из репозитория среды git.

Чтобы переопределить свойство foo во время выполнения, просто установите системное свойство или переменную среды spring.cloud.config.server.overrides.foo перед запуском сервера конфигурации.

person gongshw    schedule 23.07.2018
comment
это работает очень хорошо. - person NIrav Modi; 21.01.2021

Для этого было выполнено обновление, в следующем объединенном введите здесь описание ссылки Я нашел реализацию для разрешенияPlaceholders. Это навело меня на мысль создать новый контроллер, который использует EnvironmentController. Это позволит вам решить конфигурацию, это хорошая начальная загрузка.

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.config.server.environment.EnvironmentController;
import org.springframework.cloud.config.server.environment.EnvironmentRepository;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(method = RequestMethod.GET, path = "resolved/${spring.cloud.config.server.prefix:}")
public class ReplacedEnvironmentController {

  private EnvironmentController  environmentController;

  @Autowired
  public ReplacedEnvironmentController(EnvironmentRepository repository) {
    environmentController = new EnvironmentController(repository, new ObjectMapper());
  }

  public ReplacedEnvironmentController(EnvironmentRepository repository,
      ObjectMapper objectMapper) {
    environmentController = new EnvironmentController(repository, objectMapper);

  }

  @RequestMapping("/{name}/{profiles:.*[^-].*}")
  public ResponseEntity<String> resolvedDefaultLabel(@PathVariable String name,
      @PathVariable String profiles) throws Exception  {
    return resolvedLabelled(name, profiles, null);
  }

  @RequestMapping("/{name}/{profiles}/{label:.*}")
  public ResponseEntity<String> resolvedLabelled(@PathVariable String name, @PathVariable String profiles,
      @PathVariable String label) throws Exception  {
    return environmentController.labelledJsonProperties(name, profiles, label, true);
  }

}
person lac_dev    schedule 13.09.2017