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;
}
}