覆盖 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() 中设置端口。