spring cloud eureka常见问题

一、Eureka没有注销过期的实例问题

1.方案一

Eureka 通过心跳续约机制来维持和其他实例的通信。实例每30秒会向Eureka Server发送一次心跳,若Eureka Server (默认)90秒内没有收到实例的心跳,就会注销该实例。
很有可能因为注销的时间没有过,导致过期微服务依然显示在Eureka注册列表,可以多等一段时间。

修改实例续约发送的时间及注销时间

#客户端配置
eureka:
  instance:
    lease-renewal-interval-in-seconds: 1		#每一秒发送一次续约
    lease-expiration-duration-in-seconds: 2		#两秒没有收到续约将其注销

注意:正式环境使用Eureka 默认配置即可

2.方案二

若长时间Eureka依然没有注销已过期的实例,那就是Eureka的自我保护机制作祟了。
上文所讲Eureka会将90秒内没有心跳的实例注销掉。在一些特殊情况下网络发生故障时,Eureka与实例无法正常通信,接收不到心跳续约就可能把健康的实例注销掉。为了应对此类问题,Eureka可通过’'自我保护模式"来解决这个问题。
自我保护机制:在短时间内Eureka丢失多个实例时就会开启自我保护机制(15分钟内丢失85%的实例续约就会开启)
自我保护机制Netflix的官方解释:
https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication

在开发环境中为了快速测试可以将Eureka的自我保护机制手动关闭,正式环境推荐默认打开(保护服务的健壮性)
关闭方式:在Eureka Server 配置文件中添加eureka.server.enable-self-preservation: false配置即可关闭保护机制

#服务端配置
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:9100/eureka/
  server:
    enable-self-preservation: false			#保护机制

关闭保护机制之后,过期的实例就会在90秒之后被注销掉。查看Eureka实例注册页还会有关闭保护机制的提示
在这里插入图片描述

二、请求注册在Eureka服务中的Zuul网关,Zuul服务请求转发失败问题

在接到项目后,经过商量决定使用spring cloud全家桶作为服务架构。我立马搭建了一个Eureka服务和Zuul网关服务以及一个系统子服务。在调试过程中(请求注册在Eureka中的Zuul服务转发系统子服务)提示转发错误。

错误截图
在这里插入图片描述
在排查老半天,发现Zuul的配置文件中配置了

eureka:
  client:
    allow-redirects: false    
    fetch-registry: false     
    service-url:
      defaultZone: http://127.0.0.1:9100/eureka/

allow-redirects:指示服务器是否可以将客户端请求重定向到备份服务器/集群
fetch-registry:指示该客户端是否应从eureka服务器获取eureka注册表信息

将配置文件allow-redirects fetch-registry值改为true

eureka:
  client:
    allow-redirects: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:9100/eureka/

再次请求即解决该问题
在这里插入图片描述
复制配置文件粗心大意了,真是粗心害死人…

三、多云服务器部署微服务,请求不到注册到Eureka中的实例问题

这个问题需要了解Eureka的服务注册机制,Eureka默认注册的微服务所在服务器的机器名而非ip地址。在同一局域网内微服务的访问是没问题的,但在多个云上服务环境中就会出现访问不到的问题。

如下图,点击注册到Eureka的微服务。访问路径为:机器名+端口号
在这里插入图片描述
解决方案:
在需要注册到Eureka的微服务配置文件中,加上eureka.instance.prefer-ip-address: true配置。会将注册到Eureka的机器名改成ip地址。

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
     defaultZone: http://*.*.*.222:9000/eureka/
  instance:
    prefer-ip-address: true

完成以上操作之后,点击注册到Eureka微服务。访问路径改为:ip+端口号
在这里插入图片描述
通过上述操作,问题就应该解决掉了。
但上图显示还是访问失败,这时候就需要检查微服务所在的服务器的网络配置信息了。

登陆服务所在服务器执行ifconfig -a命令。查看到阿里云服务器网卡地址为:172.26.47.206,与注册到Eureka中的信息一致。172.26.*.*很明显是一个内网地址,这就是换成ip+port还无法访问的原因
在这里插入图片描述
补充:存在多张网卡的服务器可能会出现此类问题,可以通过配置文件指定实例绑定服务器的指定ip。
spring.cloud.inetutils.ignored-interfaces: - docker0 -veth.*配置忽略docker0网卡以及veth开头的所有网卡
spring.cloud.inetutils.preferredNetworks: - 192.168 - 10.0指定使用的网络地址
但在极端情况下,如本次案例,阿里云服务器网卡绑定内部局域网地址,没有绑定外网ip的网卡。这样只能通过最粗暴的方式———配置文件中直接指定服务器的外网ip(详情请看下文)
当服务器的外网地址被修改,该实例配置文件所指定的ip也要做对应的修改

解决方案:
在需要注册到Eureka的微服务配置文件中,加上以下配置
指定服务器的外网ip地址
eureka.instance.ip-address: 39.*.*.*
指定注册到Eureka的显示格式(默认:机器名+应用名+端口)
eureka.instance.instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port}

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
     defaultZone: http://39.*.*.*:9100/eureka/
  instance:
    prefer-ip-address: true
    instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port}
    ip-address: 39.*.*.*

启动服务再查看Eureka注册列表查看,点击服务连接可以正常访问该服务
在这里插入图片描述这样就解决了多云服务器环境下,访问不到Eureka列表中的微服务的问题

(以上问题如按此方案没有解决,欢迎留言。可以共同研究解决)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值