热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloud服务注册IP错误的解决

这篇文章主要介绍了SpringCloud服务注册IP错误的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完

SpringCloud 服务注册IP错误

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选择的逻辑。翻了一通源码发现,其大致逻辑如下:

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

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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程笔记。


推荐阅读
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文详细介绍了在Linux虚拟化部署中进行VLAN配置的方法。首先要确认Linux系统内核是否已经支持VLAN功能,然后配置物理网卡、子网卡和虚拟VLAN网卡的关系。接着介绍了在Linux配置VLAN Trunk的步骤,包括将物理网卡添加到VLAN、检查添加的VLAN虚拟网卡信息以及重启网络服务等。最后,通过验证连通性来确认配置是否成功。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 使用Docker安装和运行Nexus
    本文介绍了使用Docker安装和运行Nexus的方法,包括docker-compose.yml配置和启动时可能出现的权限问题解决方法。同时提供了登录控制台验证安装的地址和登录信息。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
  • mysql自动打开文件_让docker中的mysql启动时自动执行sql文件
    本文提要本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动My ... [详细]
author-avatar
手浪用户2602915623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有