EurekaInstanceConfigBean

EurekaInstanceConfigBean

我正在构建一个基于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()中设置端口。

08-07 15:00