添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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 Cloud Eureka 多网卡配置最终版

Spring Boot # EnvironmentPostProcessor

感谢以上两篇参考博文作者提供的参考。

这几天遇到一个bug,我们微服务组90%都是部署在linux 环境 中,只有一个XX微服务是部署在Windows 环境 中,并且服务都是分布式部署,并没有全部部署在同一台服务器上。这时, 问题 就出现了~微服务向 eureka 注册中心注册时,显示的IP地址不正常全部是localhost或者主机名称。(正常情况下,应该显示的为微服务所在服务器的IP地址) 然后我们查了一下 问题 原因,由于服务器配备了多 网卡 的原因,... SpringCloud 体系里的,服务实体向 eureka 注册时,注册名默认是“IP名:应用名:应用端口名”,即${spring.cloud. client .ipAddress}:${spring.application.name}:${spring.application.instance_id:${server.port}}。在 eureka 界面下显示如图:       有些文章说默认的in [外链图片转存中…(img-AGGn5wyV-1655281702211)]图中圈起来的部分就是instance-id。这部分的默认格式为: 2.自定义instance-id 可以在配置文件中自定义instance-id。在配置文件中添加参数,作为演示我们将值设置为 abc。重启启动实例。打开浏览器,进入 Eureka Server 查看实例注册信息:[外链图片转存中…(img-xwtHVyGa-1655281702212)]以 内网ip地址:端口号 的形式定义instance-id。用 获取内网ip地址 # 是否允许开启自我保护模式,缺省:true # 当 Eureka 服务器在短时间内丢失过多客户端时,自我保护模式可使服务端不再删除失去连接的客户端 eureka .server.enable-self 1.在 springcloud 中服务的Instance ID 默认值是: ${spring.cloud. client .hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}, 也就是:主机名:应用名:应用端口。如图1 本节我们主要介绍 Eureka 自我保护模式的开启和关闭和自定义 Eureka InstanceID 的配置。关闭自我保护保护模式主要在一组客户端和 Eureka Server 之间存在网络分区场景时使用。一旦进入保护模式, Eureka Server 将会尝试保护其服务的注册表中的信息,不再删除服务注册表中的数据。当网络故障恢复后,该 Eureka Server 节点会自动退出保护模式。如果在... eureka .instance.prefer-ip-address=true //点击服务列表时用ip跳转 eureka .instance.instance-id=${spring.cloud. client .ipAddress}:${server.port}:${spring.application.instance_id:${server.port}} 显示的服务名为:服务名:po... 在研究Spring Cloud的过程中,本地搭建好 Eureka 注册中心之后,发现 Eureka 服务页面显示的服务是机器名:端口的格式,并不是IP+端口的形式。如下图:具体搭建过程我就不再贴代码了,参考我关于spring cloud其他文章即可。我的配置如下: spring.application.name=compute-service server.port=2223 eur... 解决 Eureka 在K8S容器 环境 搭建instance-id 问题 问题 :将使用 eureka 的服务部署在k8s容器 环境 中, eureka 的instance-id默认是使用下面的规则生成instance-id,然后服务与服务之间的调用地址就是使用instance-id,错误的instance-id导致注册到 eureka 中的服务不能正常相互调用。 ${spring.cloud. client .hostna...