SpringCloud Eureka client 在多网卡环境下的instanceId问题
问题描述:
SpringCloud 服务的eureka客户端配置的instance-id如下:
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
在开发环境中,主机可能安装有vmware造成多网卡环境,为了避免使用vmware的网卡,在开发环境的application.yml 中增加如下配置:
spring:
cloud:
inetutils:
ignored-interfaces: ['VMware.*']
但这种情况下,SpringCloud 服务的eureka客户端注册到eureka server的instance-id仍旧取了vmware的网卡地址,也就是说上面的inetutils.ignored-interfaces并没有生效。
原因分析:
其原因是在HostInfoEnvironmentPostProcessor的执行时间点可以参看Spring Boot # EnvironmentPostProcessor,虽然我们配置了spring.cloud.inetutils.ignored-interfaces: ['VMware.*'],但是此时这个application.yml文件的内容还没被加载,HostInfoEnvironmentPostProcessor在执行的时候,上下文里就没有这个配置,所以在执行
InetUtils.HostInfo hostInfo = getFirstNonLoopbackHostInfo(environment);
时候,environment中没有spring.cloud.inetutils.ignored-interfaces: ['VMware.*']这个配置。
结论:
将spring.cloud.inetutils.ignored-interfaces: ['VMware.*']的配置从application.yml文件移到外部,jar命令
-Dspring.cloud.inetutils.ignored-interfaces= VMware.*
或者设置在系统的环境变量里。用dockerfile或者docker compose就更方便了。
参考:
Spring Boot # EnvironmentPostProcessor
感谢以上两篇参考博文作者提供的参考。