Docker(5) —— docker内服务注册到Eureka上的instanceId问题

1、docker部署时,注册到Eureka server的instanceId获取到容器的hostname或者IP不正确

原因:在docker容器中,会有多个网卡,见下图:

29e51e51a6b1f0ba300a48ea218f5f47aff.jpg

spring-cloud-common包里的InetUtils.findFirstNonLoopbackHostInfo()方法定义了Eureka Client在注册时,会使用服务器的第一个非环回地址进行注册。

通过查看docker容器的网络情况,可以了解到在整个Spring Cloud部署的过程中,使用的网络是10.0.0.*网段的地址,其他的地址在各服务间是不通的。

通过读代码,发现有两个方法ignoreInterfaces和ignoreAddresses,可以根据在配置文件里配置spring.cloud.inetutils.ignoredInterfaces去忽略其他干扰网卡。

解决办法:在application.properties里增加忽略网卡配置:

spring.cloud.inetutils.ignoredInterfaces[0]=lo
spring.cloud.inetutils.ignoredInterfaces[1]=eth0
spring.cloud.inetutils.ignoredInterfaces[2]=eth1

 

2、在使用Swarm编排时,即使配置了忽略网卡,注册到Eureka上的instanceId仍然不正确,并且每次重新编排时,注册的网卡都不一样

原因:在工程启动时,Spring会加载spring-cloud-netflix-eureka-client包里的EurekaInstanceConfigBean,其中这句就是设置注册到Eureka的默认instanceId。

8bce75e31a605d22482b14295a277ba0fb3.jpg

但是,spring.cloud.client.hostname是从ingress网络获取的,而此时overlay网络还没有准备好,这个时候看到的现象就是HostInfoEnvironmentPostProcessor已经将hostname和IP设置到系统缺省值里:

a8f029add77249e3876f720e19b9dc9825d.jpg

此时通过getFirstNonLoopbackHostInfo方法获取的hostname和IPAddress并不是读取了spring.cloud.inetutils.ignoredInterfaces配置项过滤之后的hostname和IPAddress。

而docker容器启动时网卡的顺序可能不一样,因此注册到Eureka上看到的instanceId每次都可能是不同网卡上的。

解决办法:重写EurekaInstanceConfigBean,设置正确的instanceId。

参考:https://github.com/spring-cloud/spring-cloud-netflix/issues/1820

转载于:https://my.oschina.net/u/1445585/blog/1840235

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值