2

我正在构建一个基于 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):

正如史蒂夫指出的那样,现在 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;
    }

}
4

1 回答 1

3

仅在 6 天前修复。在该修复之前,您为 nonSecurePort 设置的任何内容都将被覆盖${server.port}。我的建议,这有点骇人听闻,但是在使用预发布库时您可以做些什么,是子类化EurekaInstanceConfigBean和实现InitializingBean,因此您可以将端口设置为afterPropertiesSet().

于 2015-03-01T16:11:27.183 回答