2015-02-25 3 views
10

Возможно, я столкнулся с интересной аномалией с использованием Spring Cloud, Eureka и Docker. Я не уверен, обнаружил ли я проблему или если поведение ожидается, но вот суть.Spring Cloud Samples Eureka - Docker - Использование подчеркивания в ссылке

Я начинаю сначала с eureka, работающего в названном контейнере докера. Затем я запускаю клиент docker с ClientDiscoveryEnabled. Контейнер клиента докера использует параметр «ссылка» докера, чтобы получить доступность имени хоста в контейнер eureka. Файл YAML имеет вход для подключения к Eureka, что свойство приводимый:

defaultZone: http://user:${eureka.password}@${host.name}:8761/eureka/ 

Все работает просто замечательно, если я не пытаться использовать подчеркивание моего имени контейнера. Если я использую знак подчеркивания для имени моего контейнера, клиентский контейнер не может полностью разрешить это имя, используя регистрацию Eureka. Если я удалю подчеркивание, все будет хорошо. Возможно, я что-то пропустил, и это ожидается, но я не видел упоминания об этой «функции».

Мой клиент основан на проекте Feign-eureka Spring-Cloud-Samples. Ниже приведен сценарий ...

Это будет работать, и клиент будет регистрировать:

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:[email protected]_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 

Я могу свистеть «foo_bar» внутри контейнера бега/bin/bash без проблем.

sudo docker run -i -t --link foo_bar:foo_bar chrisccoy/microsvcdemoclnt /bin/bash 
[email protected]:~# 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 

Я не уверен, откуда происходит отключение. Или, может быть, это особенность, о которой я не знаю.

Любые идеи?

+0

'Не могу получить ответ от http: // user: password @ foo_bar: 8761/eureka/apps' Я не думаю, что знак подчеркивания действителен в домене. Я не уверен, почему это не сработает. – spencergibb

+0

После публикации я осмотрелся и заметил это ... [link] http://stackoverflow.com/questions/2180465/can-hostname-subdomains-have-an-underscore-in-it – chrisccoy

ответ

14

Похоже, что java.net.URI не понимает подчёркивание в доменном имён. См. Этот текст: https://gist.github.com/spencergibb/ced5199c80f7a6c89499 и этот http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6587184

+0

Спасибо, за быстрый ответ. Сегодня узнал что-то – chrisccoy

+0

Это то, что забирает 4 часа вашей жизни. Спасибо, Спенсер! –

+0

Это на самом деле сложнее: подчеркивания в именах DNS прекрасны, как правило, не в именах хостов. https://stackoverflow.com/a/14622263/1547989 Эти мелочи, которые приносят столько радости. –

Смежные вопросы