我正在构建一个基于dockerized的基于spring-cloud的微服务,该微服务已向eureka注册。注册过程的一部分是要求主机提供映射到容器的端口,以便docker可以为容器化服务选择一个空闲的主机端口。
我有一个基于主机的服务,dockerized服务可以请求端口映射,现在正在尝试使用外部端口向eureka注册微服务。
我在微服务中获得了正确的端口,但是无法覆盖EurekaInstanceConfig
。
我试过的
@SpringBootApplication
@EnableEurekaClient
public class ApplicationBootstrapper {
@Value("${containerIp}")
private String containerIp;
@Bean
public EurekaInstanceConfigBean eurekaInstanceConfigBean() {
EurekaInstanceConfigBean config = new EurekaInstanceConfigBean();
String hostPort = new RestTemplate().getForObject(
"http://{hostname}:7691/container/{id}/hostPort",
String.class,
containerIp,
config.getHostname());
config.setPreferIpAddress(true);
config.setIpAddress(containerIp);
config.setNonSecurePort(Integer.valueOf(hostPort));
return config;
}
创建了我的自定义
EurekaInstanceConfigBean
,但未选择配置(该服务使用其内部容器端口注册)。问题是:如何覆盖
EurekaInstanceConfigBean
?编辑(2):
正如Steve指出的那样,现在可以使用spring-cloud-1.0.0.RELEASE了,我以前的大多数解决方案现在已经过时了。我附上了我的最终解决方案,以防有人尝试类似的操作:
@Configuration
public class EurekaConfig {
private static final Log logger = LogFactory.getLog(EurekaConfig.class);
@Value("${containerIp}")
private String containerIp;
@Value("${kompositPort:7691}")
private String kompositPort;
@Bean
public EurekaInstanceConfigBean eurekaInstanceConfigBean() {
Integer hostPort = new RestTemplate().getForObject(
"http://{containerIp}:{port}/container/{instanceId}/hostPort",
Integer.class,
containerIp,
kompositPort,
getHostname());
EurekaInstanceConfigBean config = new EurekaInstanceConfigBean();
config.setNonSecurePort(hostPort);
config.setPreferIpAddress(true);
config.setIpAddress(containerIp);
config.getMetadataMap().put("instanceId", getHostname());
return config;
}
private static String getHostname() {
String hostname = null;
try {
hostname = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
logger.error("Cannot get host info", e);
}
return hostname;
}
}
最佳答案
这是固定的only 6 days ago。在此修复程序之前,您为nonSecurePort设置的任何内容都将被${server.port}
覆盖。我的建议有点怪异,但是在使用预发布库时可以做什么,那就是将EurekaInstanceConfigBean
子类化并实现InitializingBean
,以便可以在afterPropertiesSet()
中设置端口。