Spring云配置服务器。属性

时间:2016-08-03 18:39:38

标签: spring spring-cloud-config

我像这样配置了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} put而是按原样返回。

但是,如果我访问http://localhost:8888/application-production.properties,那么结果是非JSON,而是纯文本:

test: tcp://192.168.99.100:2376

Spring文档说:

  

YAML和属性表示有一个额外的标志(作为布尔查询参数resolvePlaceholders提供)来表示源文档中的占位符,在标准的Spring $ {...}形式中,应尽可能在输出中解析渲染。对于不了解Spring占位符约定的消费者而言,这是一个有用的功能。

出于某种原因 resolvePlaceholders 不适用于JSON表示,因此服务器配置客户端需要知道服务器上配置的所有ENV变量。

是否可以强制JSON表示 resolvePlaceholders 与纯文本(属性)表示相同?

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。在查看Spring Cloud Config Repository之后,我发现了以下提交: Omit system properties and env vars from placeholders in config

看起来不支持此类行为。

答案 1 :(得分:0)

有更新为了实现这一点,在以下合并的enter link description here中,我找到了resolvePlaceholders的实现。这让我想到了创建一个使用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);
  }

}

答案 2 :(得分:0)

您可以尝试使用Property Overrides功能覆盖git Environment Repository中的属性。

要在运行时覆盖属性foo,只需在启动配置服务器之前设置系统属性或环境变量spring.cloud.config.server.overrides.foo