`
y806839048
  • 浏览: 1079289 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

eureka客户端之间不能访问

阅读更多

 在使用Spring Cloud多人协作开发时有一个场景:我本机启动了Eureka注册中心,其他人机器需要将服务注册到我本机的Eureka。(服务端和客户端在不同机器上)

  这时出现了一个问题:服务成功注册到Eureka,但是该服务接口无法访问。

  查看日志:gateway下的日志显示服务找不到。

  查找问题:尝试telnet该服务的IP地址,发现网络不通。为了确认IP地址无误,找到那台机器,发现机器上还启动了虚拟机,存在多个网卡。服务启动在PC本地,注册时将虚拟机的IP注册到了Eureka,所以无法访问。

 

  为了解决这个问题,网上查找了一些资料,并做了一些尝试。有以下几种方案:

一、忽略指定网卡

  在Eureka客户端加上配置:

复制代码
spring:
  cloud:
    inetutils:
      # 忽略指定网卡,支持正则表达式(这里使用正则表达式忽略所有虚拟机网卡)
      ignoredInterfaces: ['VMware.*']

eureka:
  instance:
    #注册时使用ip而不是主机名
    prefer-ip-address: true
复制代码

   

二、客户端指定IP

  指定IP有三种方式:

  • 在Eureka客户端加上配置:
eureka:
  instance:
    #注册时使用ip而不是主机名
    prefer-ip-address: true
    # 指定此客户端的ip
    ip-address: 127.0.0.1-----关键在这里客户端通信用的ip
复制代码
spring:
  cloud:
    inetutils:
      # 指定此客户端的ip
      default-ip-address: 127.0.0.1
eureka:
  instance:
    #注册时使用ip而不是主机名
    prefer-ip-address: true
复制代码
  •  客户端启动时指定IP(未测试)
java -jar -Dspring.cloud.inetutils.preferred-networks=127.0.0.1

 

三、配置hosts文件

  配置本机的主机名,然后再/etc/hosts文件中将本机的主机名映射到指定有效的IP地址。

 

四、使用本地网卡

  这个方法在我测试的时候的无效的,但是看到很多文章有写,不知道是不是我哪里配置还有问题,所以在这里也列出来

  在Eureka客户端加上配置:

复制代码
spring:
  cloud:
    inetutils:
      # 是否启用本地回环网卡
      use-only-site-local-interfaces: true

eureka:
  instance:
    #注册时使用ip而不是主机名
    prefer-ip-address: true
复制代码

 

 

示例:

eureka:
  instance:
    statusPageUrlPath: /info
    healthCheckUrlPath: /health
    prefer-ip-address: true---注册是用ip
    ip-address: ${spring.cloud.client.ipAddress}----注册客户端之间通信的各自地址
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}  ---注册实例id
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/
server:
  port: 8203
spring:
  application:
    name: onlineloan-loan-service----注册实例名
info:
  version: 1
management:
  context-path: /

 

 

 

  总结

  这些配置的目的就一个,使客户端注册时使用真实有效的IP。需要通过一些配置,使它注册时使用我们理想的IP,这跟Eureka Client探测本机IP的逻辑有关。查找资料,Eureka Client探测本机IP的实现是调用了Spring的InetUtils工具类的findFirstNonLoopbackAddress()方法。该方法会获取所有网卡,取ip地址合理、索引值最小且不在忽略列表的网卡的IP地址作为结果。如果没有找到合适的IP, 就调用InetAddress.getLocalHost()方法。

 

  • 大小: 52.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics