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 指标

一窥Spring Cloud Eureka