spring-cloud-consul:无法覆盖 ConsulProperties 中的默认值

Posted

技术标签:

【中文标题】spring-cloud-consul:无法覆盖 ConsulProperties 中的默认值【英文标题】:spring-cloud-consul: Unable to override defaults in ConsulProperties 【发布时间】:2016-05-07 14:11:48 【问题描述】:

我正在使用 spring cloud consul 1.0.0.M5 和 spring boot 1.3.2。 spring cloud consul 用于连接 consul 代理的默认主机和端口是 localhost:8500。我想更改此设置,但到目前为止我尝试过的每种方法都不尊重设置。

我查看了 spring cloud consul 的源代码,ConsulProperties 是使用 spring-boot 中的 @ConfigurationProperties 以属性前缀 spring.cloud.consul 读取的。

这里是 Spring Cloud 源码中 ConsulProperties 的声明:

/**
 * @author Spencer Gibb
 */
@ConfigurationProperties("spring.cloud.consul")
@Data
public class ConsulProperties 
    @NotNull
    private String host = "localhost";

    @NotNull
    private int port = 8500;

    private boolean enabled = true;

    private String prefix = "config";

以及如何在spring cloud consul源中注入来定义向consul代理发出http请求的ConsulClient:

/**
 * @author Spencer Gibb
 */
@Configuration
@EnableConfigurationProperties
@ConditionalOnConsulEnabled
public class ConsulAutoConfiguration 

    @Bean
    @ConditionalOnMissingBean
    public ConsulProperties consulProperties() 
        return new ConsulProperties();
    

    @Bean
    @ConditionalOnMissingBean
    public ConsulClient consulClient() 
        return new ConsulClient(consulProperties().getHost(), consulProperties()
                .getPort());
    

...

我在 application.properties 中放置了以下内容,但每个组合都被忽略,而是使用默认的“localhost”和“8500”。我认为在这种情况下会尊重“spring.cloud.consul.host”和“spring.cloud.consul.port”。

spring.cloud.consul.config.host=172.17.42.1
spring.cloud.consul.config.port=8500
config.host=172.17.42.1
config.port=8500
spring.cloud.consul.host=172.17.42.1
spring.cloud.consul.port=8500

我也尝试显式定义一个 ConsulProperties bean,因为它在 spring 配置中被标记为 @ConditionalOnMissingBean,但是这个 bean 也没有被读取。在这种情况下,我不得不绕过类型系统,因为所有字段都是私有的(呃)。这是我代码中配置类的 sn-p:

...
import org.apache.commons.lang3.reflect.FieldUtils;
...
@Configuration
@EnableDiscoveryClient
@Order(Ordered.HIGHEST_PRECEDENCE)
@Priority(Ordered.HIGHEST_PRECEDENCE)
public class ConsulConfig 
...

    @Bean
    public ConsulProperties consulProperties() 
        ConsulProperties props;

        try 
            props = new ConsulProperties();

            String host = resolveConsulHost();
            int port = this.consulPort;

            FieldUtils.writeField(props, "host", host,true);
            FieldUtils.writeField(props, "port", port,true);

        
        catch(Exception e) 
            logger.warn("Unable to set ConsulProperties - using defaults",e);
            props = new ConsulProperties();
        

        logger.info("Using consulProperties=",props);

        return props;

    

...


@Configuration
@EnableAutoConfiguration
@EnableConfigurationProperties
@ComponentScan
public class Application 

    private final Logger logger = LoggerFactory.getLogger(getClass());
    public static void main(String[] args) 
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
    
...

如何自定义spring cloud consul用来连接consul代理的主机和端口?

【问题讨论】:

如果你使用 spring-cloud-starter-consul-all 或 spring-cloud-starter-consul-config,你需要把值放在bootstrap.properties @spencergibb 这是为我做的!不知道引导属性。通过阅读,我不清楚应该将哪些属性放在 application.properties 中,哪些放在 bootstrap.properties 中。所有 spring.cloud.* 都应该在引导程序中吗? 【参考方案1】:

迁移评论以回答:

如果您使用spring-cloud-starter-consul-allspring-cloud-starter-consul-config,则需要将值放入bootstrap.properties

这里是documentation。要点,spring.application.name 以及连接到 consul 所需的任何内容。

【讨论】:

没有检查bootstrap.propertiesbootstrap.yml 工作正常。谢谢。

以上是关于spring-cloud-consul:无法覆盖 ConsulProperties 中的默认值的主要内容,如果未能解决你的问题,请参考以下文章

window10环境下载安装并访问consul具体步骤(图解版)

无法覆盖 startElement 方法

Swift 3 - 无法覆盖'imagePickerController'

无法覆盖UIView.Draw方法

JUnit 覆盖无法访问的代码

无法覆盖prepareForSegue函数[重复]