2

eureka に登録する Docker 化されたスプリング クラウド ベースのマイクロサービスを構築しています。登録プロセスの一部として、コンテナーにマップされたポートをホストに要求することで、docker がコンテナー化されたサービス用の空きホスト ポートを選択できるようにします。

Docker化されたサービスがポートマッピングを要求できるホストベースのサービスがあり、現在、外部ポートを使用してマイクロサービスを 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 に答える