Spring Cloud、Eureka、および Docker を使用して、興味深い異常に遭遇した可能性があります。問題を発見したかどうか、または動作が予想されるかどうかはわかりませんが、要点は次のとおりです。
最初に、名前付きの Docker コンテナーで eureka を実行するところから始めます。次に、ClientDiscoveryEnabled で Docker クライアントを起動します。docker クライアント コンテナーは、docker "link" パラメーターを使用して、eureka コンテナーへのホスト名アクセスを取得しています。yaml ファイルには、プロパティ駆動型の Eureka に接続するためのエントリがあります。
defaultZone: http://user:${eureka.password}@${host.name}:8761/eureka/
コンテナー名にアンダースコアを使用しようとしない限り、すべてがうまく機能します。アンダースコアを使用してコンテナーに名前を付けると、クライアント コンテナーは Eureka 登録を使用してこの名前を完全に解決できません。アンダースコアを削除すると、すべて正常に動作します。おそらく私は何かを見逃しており、これは予期されていることですが、この「機能」についての言及は見たことがありません。
私のクライアントは、Spring-Cloud-Samples feign-eureka プロジェクトに基づいています。以下はシナリオです...
これは機能し、クライアントは登録されます:
sudo docker run -d -p=8761:8761 --name foobar chrisccoy/microsvcdemoeureka
sudo docker run -d -p=7311:7311 --name democlnt --link foobar:foobar chrisccoy/microsvcdemoclnt java -jar /opt/tst/ms_clnt.jar --host.name=foobar
以下は動作しません!Eureka が起動し、クライアントが起動しますが、登録できません:
sudo docker run -d -p=8761:8761 --name foo_bar chrisccoy/microsvcdemoeureka
sudo docker run -d -p=7311:7311 --name democlnt --link foo_bar:foo_bar chrisccoy/microsvcdemoclnt java -jar /opt/tst/ms_clnt.jar --host.name=foo_bar
以下は、ログ エントリとその後の例外です。
2015-02-25 18:51:27.762 ERROR 1 --- [pool-4-thread-1] com.netflix.discovery.DiscoveryClient : Can't get a response from http://user:password@foo_bar:8761/eureka/apps/HELLOCLIENT/172.17.0.11:HelloClient:7311
Can't contact any eureka nodes - possibly a security group issue?
com.sun.jersey.api.client.ClientHandlerException: java.lang.IllegalArgumentException: Host name may not be null
at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:184)
at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:120)
at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:28)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
at com.sun.jersey.api.client.WebResource.put(WebResource.java:211)
at com.netflix.discovery.DiscoveryClient.makeRemoteCall(DiscoveryClient.java:1097)
at com.netflix.discovery.DiscoveryClient.makeRemoteCall(DiscoveryClient.java:1060)
at com.netflix.discovery.DiscoveryClient.access$500(DiscoveryClient.java:105)
at com.netflix.discovery.DiscoveryClient$HeartbeatThread.run(DiscoveryClient.java:1583)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Host name may not be null
at org.apache.http.util.Args.notBlank(Args.java:65)
at org.apache.http.HttpHost.<init>(HttpHost.java:81)
at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.getHost(ApacheHttpClient4Handler.java:190)
at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:170)
... 14 common frames omitted
/bin/bash を実行しているコンテナ内から "foo_bar" に問題なく ping を実行できます。
sudo docker run -i -t --link foo_bar:foo_bar chrisccoy/microsvcdemoclnt /bin/bash
root@0175222c11bb:~# ping foo_bar
PING foo_bar (172.17.0.12) 56(84) bytes of data.
64 bytes from foo_bar (172.17.0.12): icmp_seq=1 ttl=64 time=0.137 ms
切断がどこから来ているのかわかりません。あるいは、私が気付いていない機能かもしれません。
何か案は?