覆盖 spring-boot EurekaInstanceConfigBean
Override spring-boot EurekaInstanceConfigBean
我正在构建一个 docker 化的 spring 基于云的微服务,该微服务向尤里卡注册。注册过程的一部分是向主机询问映射到容器的端口,因此 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):
正如史蒂夫指出的那样,现在 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()
中设置端口。
我正在构建一个 docker 化的 spring 基于云的微服务,该微服务向尤里卡注册。注册过程的一部分是向主机询问映射到容器的端口,因此 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):
正如史蒂夫指出的那样,现在 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()
中设置端口。