spring-cloud-consul:无法覆盖 ConsulProperties 中的默认值
spring-cloud-consul: Unable to override defaults in ConsulProperties
我正在使用 spring cloud consul 1.0.0.M5 和 spring boot 1.3.2。 spring cloud consul 用于连接 consul agent 的默认主机和端口是 localhost:8500。我想更改此设置,但到目前为止我尝试过的所有方法都不符合设置。
我查看了 spring 云 consul 的源代码,ConsulProperties 是使用来自 spring-boot 的 @ConfigurationProperties 读取的 属性 前缀 spring.cloud.consul.
这是 spring 云源中 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云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 也没有被读取。在那种情况下,我不得不绕过类型系统,因为所有字段都是私有的(呃)。这是我代码中配置 class 的片段:
...
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 云 consul 用于连接到 consul 代理的主机和端口?
已迁移评论以回答:
如果您使用 spring-cloud-starter-consul-all
或 spring-cloud-starter-consul-config
,您需要将值放入 bootstrap.properties
。
这里是documentation。要点,spring.application.name
以及连接到 consul 所需的一切。
我正在使用 spring cloud consul 1.0.0.M5 和 spring boot 1.3.2。 spring cloud consul 用于连接 consul agent 的默认主机和端口是 localhost:8500。我想更改此设置,但到目前为止我尝试过的所有方法都不符合设置。
我查看了 spring 云 consul 的源代码,ConsulProperties 是使用来自 spring-boot 的 @ConfigurationProperties 读取的 属性 前缀 spring.cloud.consul.
这是 spring 云源中 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云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 也没有被读取。在那种情况下,我不得不绕过类型系统,因为所有字段都是私有的(呃)。这是我代码中配置 class 的片段:
...
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 云 consul 用于连接到 consul 代理的主机和端口?
已迁移评论以回答:
如果您使用 spring-cloud-starter-consul-all
或 spring-cloud-starter-consul-config
,您需要将值放入 bootstrap.properties
。
这里是documentation。要点,spring.application.name
以及连接到 consul 所需的一切。