Spring Cloud Samples Eureka - Docker - 在链接中使用下划线

Posted

技术标签:

【中文标题】Spring Cloud Samples Eureka - Docker - 在链接中使用下划线【英文标题】:Spring Cloud Samples Eureka - Docker - Use of underscore in link 【发布时间】:2015-04-28 00:30:07 【问题描述】:

我在使用 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 的容器中 ping “foo_bar”而不会出现问题。

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

我不确定断开连接的来源。或者也许这是我不知道的功能。

有什么想法吗?

【问题讨论】:

Can't get a response from http://user:password@foo_bar:8761/eureka/apps 我认为下划线在域中无效。我不确定为什么它不起作用。 发帖后我环顾四周,发现了这个...[link]***.com/questions/2180465/… 【参考方案1】:

看起来java.net.URI 不理解域名中的下划线。请参阅此要点:https://gist.github.com/spencergibb/ced5199c80f7a6c89499 和此http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6587184

【讨论】:

感谢您的快速回复。今天学到了一些东西 这些东西会占用你 4 个小时的生命。谢谢一百万,斯宾塞! 实际上更复杂:DNS 名称中的下划线很好,通常不在主机名中。 ***.com/a/14622263/1547989这些小事带来如此多的欢乐。

以上是关于Spring Cloud Samples Eureka - Docker - 在链接中使用下划线的主要内容,如果未能解决你的问题,请参考以下文章

spring-cloud-starter-eureka-server 和 spring-cloud-starter-netflix-eureka-server的区别

Spring cloud netflix eureka server - 启动时出现tomcat错误

spring cloud配置中心

Spring Cloud Samples Eureka - Docker - 在链接中使用下划线

Spring Cloud之注册中心搭建

spring cloud eureka之服务端