我正在构建一个基于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;
}
}
该问题仅在6天前解决。在此修复程序之前,您为nonSecurePort设置的任何内容都将被覆盖${server.port}
。我的建议有点怪异,但是在使用预发布库时您可以做什么,那就是子类化EurekaInstanceConfigBean
和实现InitializingBean
,因此可以在中设置端口afterPropertiesSet()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句