首页 > 其他分享 >SpringCloud服务注册IP错误的解决

SpringCloud服务注册IP错误的解决

时间:2023-07-28 15:33:26浏览次数:33  
标签:IP SpringCloud 配置 网卡 注册 spring cloud

1、错误原因

在服务注册的时候,是使用 spring.cloud.client.ipAddress 这个变量,如果本机有多个网卡,那么可能会把不是本机以太网的网卡地址注册上去。

使用 ipconfig 可以看到,本机上有多个以太网适配器,而每个以太网适配器,都有一个 IPv4 地址,这时注册上去的 IP,就是其中一个,却不一定是正确的那个。

2、处理

2.1、禁用其他网卡

到电脑的 更改适配器 设置中,将不是本机以太网的其他网卡禁用

2.2、配置

到电脑的设备管理器 --> 网络适配器 中,可以看到所有的网卡名
在要注册的服务中配置一下内容:
//忽略指定正则匹配的网卡的配置,我这里配置了VM虚拟机和Docker的
spring.cloud.inetutils.ignoredInterfaces=["VMware.","Hyper-V."]
//指定默认IP,可以使IP段
spring.cloud.inetutils.preferredNetworks=["192.168"]
spring.cloud.inetutils.use-only-site-local-interfaces=true
SpringCloud以及Nacos服务注册IP选择
微服务部署后,需要相互调用,其中服务A调用服务B时发现无法调用。其中服务注册和发现以及配置中心使用Nacos

分析:
检查了多遍代码后,没有发现调用方式有问题,所以只能是网络问题。通过postman直接调用服务B,发现可以调通,但是使用服务A不行,于是检查服务A在注册中心注册的IP,发现和并不是服务B启动机器的IP。这就是问题所在了。

为什么注册的IP和真实IP不符合呢?原因是Nacos客户端在注册服务时会从机器网卡中选择一个IP来注册,当机器存在多个网卡(例如存在虚拟网卡)时,所选则的IP可能不是真是的物理机的IP,所以,当注册了的是非真实IP后,另一台机器调用时是不可能调通的。

解决:
知道问题后,就要解决,查了一下SpringCloud的官方文档,发现有一项配置如下:

Sometimes, it is useful to ignore certain named network interfaces so that they can be excluded from Service Discovery registration (for example, when running in a Docker container).

A list of regular expressions can be set to cause the desired network interfaces to be ignored.

You can also force the use of only specified network addresses by using a list of regular expressions.

spring:
  cloud:
    inetutils:
    preferredNetworks:
      - 192.168
      - 10.0

该项配置用于指定首选IP,当有多个网卡时,指定该IP地址后(支持正则),客户端在选择IP时就会选择符合preferredNetworks配置的IP地址进行注册。

同样的,Nacos也可以配置自己的首选IP以及网卡选择:

spring.cloud.nacos.discovery.ip:
spring.cloud.nacos.discovery.networkInterface
我们选择其中一个配置就可以,都能达到相同的效果。

扩展:
虽然问题解决了,但是还是要更深入的了解一下这个IP选择的逻辑。翻了一通源码发现,其大致逻辑如下:
image

Nacos首先检查有没有ip及networkInterface配置,如果有则使用配置的IP,否则检查networkInterface,并获取IP,如果两者都为空,则使用inetUtils.findFirstNonLoopbackHostInfo().getIpAddress()来获取IP:
image

而findFirstNonLoopbackHostInfo()的部分逻辑如下:
image

它最终会返回一个匹配的IPV4地址,并且排除本机回环网络(127.0.0.0-127.255.255.255),并且匹配是否是首选网络(如果配置了preferredNetworks)。

标签:IP,SpringCloud,配置,网卡,注册,spring,cloud
From: https://www.cnblogs.com/hg-super-man/p/17587733.html

相关文章

  • P2679 [NOIP2015 提高组] 子串 题解
    原题\(题目大意\)\(从字符串a中选出k个子串s_1,s_2,s_3...s_k使得s_1+s_2+s_3+...+s_k=b\)\(求总方案数对10^9+7取模的结果\)\(1\le|a|即n\le1000,1\le|b|即m\le200,1\lek\le|b|\)\(设f_{i,j,x}表示已经选到a的第i个字符,b的第j个字符,共选了x个子串的方案数\)\(则可得......
  • 网工内推 | 电竞企业招网工,IP证书优先,最高20K
    01英雄体育招聘岗位:网络工程师职责描述:1、系统管理:维护业务系统,确保业务系统正常运行;2、软件管理:软件的安装维护和使用,对软件进行统一管理;3、硬件管理:服务器故障维护(文件备份,恢复,系统漏洞检测,病毒检测,清除等);客户端故障维护(包括系统安装,系统更新,常用软件安装);电脑常见外设故障维......
  • 扬州高防服务器租用,扬州BGP高防IP段43.248.184.X
    专业做扬州高防BGP服务器,大带宽、高防御、低延迟、稳定流畅、免费测试。扬州数据中心介绍1、运河西路机房237号数据中心,机柜数量400-500个,位于4楼6楼,每层200多个标准机柜,机柜42U。2、维扬路107号数据中心,400-500个机柜,位于1楼2楼,每层200多个标准机柜。3、扬子江南路9号电信数据中心......
  • 国标GB28181视频平台LntonGBS(源码版)国标视频平台大并发下SIP消息出现重复SN号的问题解
    随着国家倡导平安城市、智慧城市的建设,安防视频监控作为智慧城市安防建设的重要环节,也越来越受到重视。LntonGBS是基于公安部推出的安防主流协议(国标GB28181协议)的视频接入、处理及分发平台,具有视频直播监控、云端录像、云存储、检索回放、智能告警、语音对讲、平台级联等功能。我......
  • 5-Ngnix配置基于用户访问控制和IP的虚拟主机
    Nginx配置文件在/usr/local/nginx/conf下,文件名为nginx.conf5.1.Ngnix配置基于用户访问控制的多虚拟主机5.1.1.前提条件Ngnix配置基于用户访问控制的多虚拟主机时,需要使用htpasswd命令,需要安装httpd-toolsrpm命令:yuminstall-yhttpd-tools[root@cent79-2~]#yuminstall-yhtt......
  • 看看Vue中如何封装一个自动化注册全局组件
    在项目的开发过程中,我们常常会去封装一些比较常用的全局组件,但是每添加一个组件就需要手动在main.js引入注册,不仅麻烦还代码量多,着实让人心烦。所以干脆封装一个自动化注册全局组件。1、自定义全局组件文件夹在src下新建一个globalComponents,用于存放全局组件,并新建一个组件,例......
  • pip 常用操作
    1.更改源 豆瓣:https://pypi.doubanio.com/simple/ 清华:https://pypi.tuna.tsinghua.edu.cn/simplepipconfigsetglobal.index-url源地址2.安装包pipinstallSomePackage#最新版本pipinstallSomePackage==1.0.4#指定版本pipinstall'So......
  • SpringCloud的注册和发现
    什么是微服务架构,为什么要用将原本属于一个项目的根据业务划分模块,部署到不同的服务器上,通过接口相互调用。好处:如果部署在一台服务器上,服务器崩溃后所有功能都不能使用。如果使用的时微服务架构,一个服务器崩了,不会对另一个模块造成很大影响每个微服务项目复杂性低技术更新迭......
  • JavaScript中this关键字详解(二)
    使用注意点避免多层this由于this的指向是不确定的,所以切勿在函数中包含多层的this。varo={f1:function(){console.log(this);//objectvarf2=function(){console.log(this);//window}();}}​o.f1()//Object//Window上面代码......
  • JavaScript中this关键字详解(一)
    涵义this关键字是一个非常重要的语法点。毫不夸张地说,不理解它的含义,大部分开发任务都无法完成。this可以用在构造函数之中,表示实例对象。除此之外,this还可以用在别的场合。但不管是什么场合,this都有一个共同点:它总是返回一个对象。简单说,this就是属性或方法“当前”所在的对象......