SpringCloud以及Nacos服务注册IP选择问题

这篇具有很好参考价值的文章主要介绍了SpringCloud以及Nacos服务注册IP选择问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、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,spring cloud
Nacos首先检查有没有ip及networkInterface配置,如果有则使用配置的IP,否则检查networkInterface,并获取IP,如果两者都为空,则使用inetUtils.findFirstNonLoopbackHostInfo().getIpAddress()来获取IP:

nacos 注册的ip,spring cloud

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

nacos 注册的ip,spring cloud

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

二、注册为指定IP和端口

如果选择固定Ip注册可以配置

spring.cloud.nacos.discovery.ip = 192.168.0.118
spring.cloud.nacos.discovery.port = 9000

如果选择固定网卡配置项

spring.cloud.nacos.discovery.networkInterface = eth0

如果想更丰富的选择,可以使用spring cloud 的工具 InetUtils进行配置

  • 具体说明可以自行检索: https://github.com/spring-cloud/spring-cloud-commons/blob/master/docs/src/main/asciidoc/spring-cloud-commons.adoc

    spring.cloud.inetutils.default-hostname
    spring.cloud.inetutils.default-ip-address
    spring.cloud.inetutils.ignored-interfaces[0]=eth0 # 忽略网卡,eth0
    spring.cloud.inetutils.ignored-interfaces=eth.* # 忽略网卡,eth.*,正则表达式
    spring.cloud.inetutils.preferred-networks=10.34.12 # 选择符合前缀的IP作为服务注册IP
    spring.cloud.inetutils.timeout-seconds
    spring.cloud.inetutils.use-only-site-local-interfaces

更多配置

spring.cloud.nacos.discovery.server-addr #Nacos Server 启动监听的ip地址和端口
spring.cloud.nacos.discovery.service #给当前的服务命名
spring.cloud.nacos.discovery.weight #取值范围 1 到 100,数值越大,权重越大
spring.cloud.nacos.discovery.network-interface #当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
spring.cloud.nacos.discovery.ip # 优先级最高
spring.cloud.nacos.discovery.port # 默认情况下不用配置,会自动探测
spring.cloud.nacos.discovery.namespace # 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。 spring.cloud.nacos.discovery.access-key # 当要上阿里云时,阿里云上面的一个云账号名
spring.cloud.nacos.discovery.secret-key # 当要上阿里云时,阿里云上面的一个云账号密码
spring.cloud.nacos.discovery.metadata #使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
spring.cloud.nacos.discovery.log-name # 日志文件名
spring.cloud.nacos.discovery.enpoint # 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
ribbon.nacos.enabled # 是否集成Ribbon 默认为true

三、通过内网ip注册为指定外网ip

Nacos注册中心是: https://github.com/alibaba/nacos

各个服务通过Nacos客户端将服务信息注册到Nacos上,当Nacos服务注册的IP默认选择出问题时,可以通过查阅对应的客户端文档,来选择配置不同的IP。

大多公司服务器环境会有两套ip,一套是对内网,一套是对外网。即同一台服务器,有对应两个ip(例:10.0.0.1,100.0.0.1)。

在使用nacos做为注册中心,由于内网环境的因素,A服务注册上去的ip可能是100.0.0.1,B服务注册上去的ip可能是10.0.0.2,经验证10之间调用互通,100之间也互通。但10调用100不同,或者反之也不行。

解决方案:
配置文件加如下配置:

nacos-ip-100.0.0.1 = 10.0.0.1
spring.cloud.nacos.discovery.ip = ${nacos-ip-${spring.cloud.client.ip-address}}

四、Nacos服务注册地址为内网IP的解决办法

问题

最近在使用Spring Cloud Alibaba这一套微服务解决方案,但是在服务注册的时候,网关死活找不到微服务地址,自己的微服务通过网关怎么也访问不到。

查找原因

仔细一查才发现,网关去访问了一个莫名其妙的IP地址,
去Nacos服务详情去看,果然,我的微服务注册到Nacos的IP地址上也是这个地址,
然后我去我电脑查找这个IP地址,还真有这么一个地址,那么问题来了,Nacos为什么会随意找个本机IP地址然后注册上去?

Nacos服务注册的IP

Nacos注册中心是: https://github.com/alibaba/nacos
各个服务通过Nacos客户端将服务信息注册到Nacos上
当Nacos服务注册的IP默认选择出问题时,可以通过查阅对应的客户端文档,来选择配置不同的网卡或者IP
参考org.springframework.cloud.alibaba.nacos.NacosDiscoveryProperties的配置

解决办法

例如,使用了Spring cloud alibaba(官方文档)作为Nacos客户端,
服务默认获取了内网IP 192.168.1.21,
可以通过配置spring.cloud.inetutils.preferred-networks=10.34.12,使服务获取内网中前缀为10.34.12的IP

如何配置

# 如果选择固定Ip注册可以配置
spring.cloud.nacos.discovery.ip = 10.2.11.11
spring.cloud.nacos.discovery.port = 9090

# 如果选择固定网卡配置项
spring.cloud.nacos.discovery.networkInterface = eth0

# 如果想更丰富的选择,可以使用spring cloud 的工具 InetUtils进行配置
# 具体说明可以自行检索: https://github.com/spring-cloud/spring-cloud-commons/blob/master/docs/src/main/asciidoc/spring-cloud-commons.adoc
spring.cloud.inetutils.default-hostname
spring.cloud.inetutils.default-ip-address
spring.cloud.inetutils.ignored-interfaces[0]=eth0   # 忽略网卡,eth0
spring.cloud.inetutils.ignored-interfaces=eth.*     # 忽略网卡,eth.*,正则表达式
spring.cloud.inetutils.preferred-networks=10.34.12  # 选择符合前缀的IP作为服务注册IP
spring.cloud.inetutils.timeout-seconds
spring.cloud.inetutils.use-only-site-local-interfaces

更多配置

spring.cloud.nacos.discovery.server-addr  #Nacos Server 启动监听的ip地址和端口
spring.cloud.nacos.discovery.service  #给当前的服务命名
spring.cloud.nacos.discovery.weight  #取值范围 1 到 100,数值越大,权重越大
spring.cloud.nacos.discovery.network-interface #当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
spring.cloud.nacos.discovery.ip  # 优先级最高
spring.cloud.nacos.discovery.port  # 默认情况下不用配置,会自动探测
spring.cloud.nacos.discovery.namespace # 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

spring.cloud.nacos.discovery.access-key  # 当要上阿里云时,阿里云上面的一个云账号名
spring.cloud.nacos.discovery.secret-key # 当要上阿里云时,阿里云上面的一个云账号密码
spring.cloud.nacos.discovery.metadata    #使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
spring.cloud.nacos.discovery.log-name   # 日志文件名
spring.cloud.nacos.discovery.enpoint   # 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
ribbon.nacos.enabled  # 是否集成Ribbon 默认为true

五、较合理的实现方式

  1. 使用docker进行部署

    • 项目打包的时候指定映射后的注册IP和端口或者ip前缀

    • 打包进镜像之后运行容器,设置上方指定的端口映射

    • 这样也能指定局域网的IP也可以通过docker将相关端口进行映射出来

      • 问题,假如需要映射到公网IP?
  2. 也可以通过网关进行整改,所有服务都走网关,

    • 只需要将网关部署到连接内网服务的网卡上面,将网关的端口进行映射出去供外部调用
      • 问题,服务间的调用需要保证注册网络是统一网络
  3. 通过自定义主机域名,或者本地dns服务,文章来源地址https://www.toymoban.com/news/detail-740975.html

    • 给每个服务指定域名
    • 服务注册时候需要将域名进行者注册上去,
      • 问题:可能会更麻烦但是对于网络较为复杂的情况会改善一点劳动量

到了这里,关于SpringCloud以及Nacos服务注册IP选择问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springcloud/springboot集成NACOS 做注册和配置中心以及nacos源码分析

    Spring Cloud 是一系列框架的有序集合如服务发现注册、配置中心、消息总线、负载均衡、熔断器、数据监控等。 SpringCloud 将多个服务框架组合起来,通过Spring Boot进行再封装,屏蔽掉了复杂的配置和实现原理,最终给开发者提供了一套简单易懂、易部署和易维护的分布式系统开

    2024年02月08日
    浏览(67)
  • springcloud多网卡注册nacos时IP控制方法

    本地研发团队没有本地开发测试用服务器,使用了远端云服务搭建了nacos等中间件。 本地开发虽然在不同子网,但是都能保证互通。 所以理论上虽然注册的服务可能是192.168.1.222和192.168.4.111这样,但是其实也是可以互相访问,不影响研发的。 问题研发本地很多人安装过vmwar

    2024年02月22日
    浏览(42)
  • 使用Nacos将单体服务注册成微服务的步骤以及相关问题解决

    目录 1.改造单体服务的配置文件。  2.添加Nacosw相关的pom依赖 3.在nacos的配置列表中创建配置列表 4.相关问题的解决 1.改造单体服务的配置文件。  🔖 创建一个bootstrap.yml的配置文件 该文件通常放置在src/main/resources目录中 ,并且优先于application.yml或application.properties文件加载

    2024年02月16日
    浏览(39)
  • 【Java项目】SpringCloud项目注册到Nacos中心时显示的是内网IP导致不同服务器之间无法互相调用接口的解决并发

    微服务项目地址—动动你发财的小手点一个stars吧 出现这个问题是之前我也就遇到过的,这个问题的情况就是: 我们知道微服务项目是可以把不同的项目部署在不同的服务器上从而减少某一台服务器的压力,我们只需要为每一个服务配置一个注册中心即可,然后一个服务需要

    2024年02月16日
    浏览(50)
  • 微服务学习-SpringCloud -Nacos (服务注册源码学习)

    此次源码版本为1.4.1,2.x版本在服务请求时使用了grpc的方式,所以先以1.4.1版本学习,后续再看2.x版本。 源码下载地址:: link 打开页面后,下拉到最下面,下载nacos-1.4.1.zip,解压导入idea即可。 此图主要是对核心注册流程进行了大概梳理,可以在后续详细看源码时配合互补。

    2023年04月09日
    浏览(49)
  • SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍

    注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。 服务注册中心(简称注册中心)是微服务框架的一个重要组件,在微服务架构里主要

    2024年02月22日
    浏览(69)
  • 【微服务】SpringCloud-Nacos注册中心

    🍁 博客主页: 👉@不会压弯的小飞侠 ✨ 欢迎关注: 👉 点赞 👍 收藏 ⭐ 留言 ✒ ✨ 系列专栏: 👉SpringCloud专栏 ✨ 知足上进,不负野心。 🔥 欢迎大佬指正,一起学习!一起加油! Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现

    2024年02月02日
    浏览(46)
  • 【SpringCloud】三、Nacos服务注册+配置管理+集群搭建

    官网:https://nacos.io/zh-cn/ 下载 解压 启动 启动成功 登录 在cloud-demo 父工程中添加 spring-cloud-alilbaba的管理依赖: 子模块下添加nacos的客户端依赖(此时user、order中的eureka可以注释掉了) 在order和user模块的application.yml文件中,注释eureka地址,添加nacos的地址 重启order服务,查看

    2024年02月06日
    浏览(57)
  • SpringCloud源码学习笔记3——Nacos服务注册源码分析

    系列文章目录和关于我 实现服务治理、服务动态扩容,以及调用时能有负载均衡的效果。 如果我们将服务提供方的ip地址配置在服务消费方的配置文件中,当服务提供方实例上线下线,消费方都需要重启服务,导致二者耦合度过高。注册中心就是在二者之间加一层,实现解耦

    2023年04月08日
    浏览(44)
  • 【SpringCloud入门】-- Nacos快速入门之搭建服务与注册中心

    目录 前言:  1.Nacos的下载与安装 2. 去MySQL建立一个名为nacos的数据库 3.介绍配置文件,conf目录下的 application.properties 4.nacos启动 5. nacos作为注册中心的作用 6.建立一个项目,实现向命名空间注册 前言: 上文我们已经简单介绍了一下Nacos,现在我们一起来动手搭建一个Nacos的注

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包