spring boot cloud eureka windows 10 eureka在最新的docker升级后返回host.docker.internal作为客户端主机名
Posted
技术标签:
【中文标题】spring boot cloud eureka windows 10 eureka在最新的docker升级后返回host.docker.internal作为客户端主机名【英文标题】:spring boot cloud eurka windows 10 eurkea returns host.docker.internal for client host name after latest docker upgrade 【发布时间】:2019-12-10 16:19:26 【问题描述】:Spring Boot Cloud Disovery 问题,在 windows 10 上升级 docker 后 Eureka 主机名出现问题。(注意:docker 不托管 spring 服务,只是 mariadb、rabbitmq 和 zipkin)
总结
我正在 windows 10 企业版上开发,最新补丁 Java 8 sts 4 docker 托管 mariadb、rabbitmq 和 zipkin(没有服务运行 码头工人) 使用基于Eureka的spring boot云发现 服务发现在 docker 升级之后,直到今天 docker 更新之前一切正常
Eureka 返回“host.docker.internal”作为我的开发箱(托管 Spring Boot 云服务的机器)的主机名
在今天 Windows 10 上的 docker 升级之前,这一直运行良好。
有这方面的指导吗?
------------------ 详细信息---------------- ------------
"
---------------- spring 版本 ----------
buildscript
ext
springCloudVersion = "Greenwich.SR1"
springBootVersion = "2.1.5.RELEASE"
springRetryVersion = "1.2.4.RELEASE"
lombokVersion = "3.6.4"
mysqlConnectorVersion = "8.0.15"
springBootAdminVersion = "2.1.5"
我正在使用 windows 10 企业版进行 java 开发。
我使用 docker-compose 在我的 Windows 10 机器上的开发环境中托管 mariadb、zipkin 和 rabbitmq
我有一个带有 8 个 Spring Boot 云服务的多项目 gradle 构建
其中一项服务是托管 Eureke 的 Spring Cloud Discovery 服务
其他spring cloud服务都是eureka客户端。
直到今天,一切正常 1)先启动Eureka Spring Boot云服务 2)其他spring boot cloud services为eclipse启动的客户端,注册并查询spring cloud discovery客户端代码获取其他服务的url
今天,windows 10 最新的 docker 发布了,我安装了它(我一直在通过其他几个 docker 更新来开发这个应用程序)。
我更新了 docker,重启了。
重启后,Eureka 服务器返回“host.docker.internal”作为 URL 中的主机名,而不是 http:/mymachinename:8080
升级前没有网络数据,现在有
U:\>ipconfig
Windows IP Configuration
Ethernet adapter vEthernet (DockerNAT):
Connection-specific DNS Suffix . :
IPv4 Address. . . . . . . . . . . : 10.0.75.1
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
Ethernet adapter Ethernet:
Connection-specific DNS Suffix . : net.FOO.BAR.com
IPv4 Address. . . . . . . . . . . : 146.122.145.71
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 146.122.145.1
Ethernet adapter vEthernet (Default Switch):
Connection-specific DNS Suffix . :
IPv4 Address. . . . . . . . . . . : 172.28.74.49
Subnet Mask . . . . . . . . . . . : 255.255.255.240
Default Gateway . . . . . . . . . :
我的客户端 application.properties 文件是:
eureka.client.serviceUrl.defaultZone= http://$ci2.srvhost:8761/eureka/
eureka.instance.hostname=$ci2.srvhost
spring.cloud.client.hostname=$ci2.srvhost
服务器应用程序.property 文件
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF
Standard reboot after docker updated
The expected URL from discovery is
http://mymachine:8091
returned value after docker upgrade
http://host.docker.internal:8091
【问题讨论】:
嘿,有点跑题了,但我正在使用 eureka 客户端和服务器开发相同类型的架构。我有一个问题:我想在虚拟主机上实时上传应用程序,但不熟悉应该从哪里开始。任何建议都会有所帮助。 【参考方案1】:我遇到了类似的问题,即 eureka 服务器在 host.docker.internal 而不是 localhost 注册服务。
在我的情况下,问题是位置 C:\Windows\System32\Drivers\etc\hosts 的主机文件已更改。我删除了主机文件中的所有行,并使用具有管理员权限的 npp 将其保存。重新启动服务器发布此更改。
看起来“Docker Desktop”正在更改主机文件。
【讨论】:
【参考方案2】:我添加/更改了每个 eureka 客户端的 application.properties 文件
----------------- 客户
......
ci2.srvhost = my hostname
#to find this list,run ipconfig in command prompt
spring.cloud.inetutils.preferredNetworks=146.122,10.0
eureka.client.serviceUrl.defaultZone= http://$ci2.srvhost:8761/eureka/
eureka.instance.hostname=$ci2.srvhost
spring.cloud.client.hostname=$ci2.srvhost
-------------------- eureka server application.property--------------------
# host to set of ci2 services
ci2.srvhost = $COMPUTERNAME
# on windows 10 boxes, running docker, we have to include preferred networks,
# this is not needed on linux, or windows boxes not running docker
spring.cloud.inetutils.preferredNetworks=146.122,10.0
-------------------- 标准配置,下面不需要更改 ------------------ -
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.instance.hostname=$ci2.srvhost
eureka.instance.prefer-ip-address=true
logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF
serviceUrl.defaultZone= http://$eureka.instance.hostname:$server.port/eureka/
【讨论】:
我想我只是在为我设置 spring.cloud.client.hostname。【参考方案3】:Window 10 的解决方案: 您不必从主机文件中删除所有行。 如果存在就评论这个(#192.168.1.4 host.docker.internal)(因为我们在玩 docker 时使用它) 并粘贴这个(127.0.0.1 host.docker.internal) 它对我有用。
【讨论】:
【参考方案4】:感谢有关 windows 主机文件的提示
我发现docker在host.docker.internal和gateway.docker.internal的host文件中添加了别名。
我猜 Eureka 从 IP 进行主机查找并返回 host.docker.internal。
我不是主机文件方面的专家,但我为我的 IP 的实际主机名添加了一个别名(注意:我们使用静态 ip)。完成此操作后,docker 在重新启动时没有更改我的主机文件,并且 ip->host 的反向查找现在返回我的机器名称而不是 host.docker.internal
------------------ modified hosts file for windows
#I added an alias from my machine name to the IP before the docker added aliases
#
146.122.145.71 mymachine.net.foo.com
# Added by Docker Desktop
146.122.145.71 host.docker.internal
146.122.145.71 gateway.docker.internal
【讨论】:
【参考方案5】:“消息”:“连接被拒绝:没有更多信息:host.docker.internal in eureka gateway error
分辨率:
检查 ping host.docker.internal 响应是与本地主机不同的一些 IP 地址,即 127.0.0.1 删除 C:\Windows\System32\Drivers\etc\hosts.file 条目,使其为空
然后重启 eureka 和你的微服务实例。
还会在日志中找到如下消息,以确保您已在 eureka 中注册
DiscoveryClient_BEER-SERVICE/DESKTOP-G2AIGG1:beer-service: 拆分表示发现客户端的上述日志消息 BEER-SERVICE 是我的服务和 DESKTOP-G2AIGG1 是我的电脑名称 beer-service 是注册的服务。
【讨论】:
感谢关于hosts文件的提示,我发现了一件事,docker在windows上重建了host文件。【参考方案6】:当我对我的 restTemplate 进行负载平衡时,我也遇到了同样的问题。像这样的
@Bean
@LoadBalanced
RestTemplate restTemplate()
return new RestTemplate();
这是因为功能区客户端。
因此,在没有对主机文件进行任何更改的情况下,当我删除此代码并使用RestTemplateBuilder
获取restTemplate 时,一切正常。代码示例:
@Autowired
private RestTemplateBuilder restTemplateBuilder;
RestTemplate restTemplate = restTemplateBuilder.build();
您也可以尝试这种方法。
【讨论】:
感谢您采用这种方法以上是关于spring boot cloud eureka windows 10 eureka在最新的docker升级后返回host.docker.internal作为客户端主机名的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Eureka 3 (Eureka client注册服务提供者)
spring cloud --eureka --ribbon
基于Spring Boot 2.0.3的Spring Cloud Eureka Server与Client
spring boot cloud eureka windows 10 eureka在最新的docker升级后返回host.docker.internal作为客户端主机名
如何从使用 Spring Cloud Eureka 服务器注册的 Spring Boot 应用程序中公开 Prometheus 指标