Eureka常见问题汇总及注意事项

作者:xcbeyond
疯狂源自梦想,技术成就辉煌!微信公众号:《程序猿技术大咖》号主,专注后端开发多年,拥有丰富的研发经验,乐于技术输出、分享,现阶段从事微服务架构项目的研发工作,涉及架构设计、技术选型、业务研发等工作。对于Java、微服务、数据库、Docker有深入了解,并有大量的调优经验。

0、前言      
      在Spring Cloud中,Eureka是接触和使用最多的组件,也是最重要的一个组件,在使用过程中经常会遇到各类突发问题,来的莫名奇妙。现把一些常见问题、注意事项,与大家进行分享。

     Eureka一般出现问题原因分为两类:

Eureka版本不同带来的问题
Eureka参数配置问题
生产环境下,Eureka参数配置建议使用默认配置,除非明确清楚或明确有这样修改默认配置的需求。

1、EnableEurekaClient和EnableDiscoveryClient
      在不同的应用程序中,有人使用EnableEurekaClient,有人使用EnableDiscoveryClient,都能作为Eureka Client的注解。有何区别呢?

     服务发现是有多实现方式,即:多种组件可以作为注册中心,eureka,consul,zookeeper,@EnableEurekaClient是在spring-cloud-netflix中,仅仅适合于Eureka注册中心。@EnableDiscoveryClient是在spring-cloud-commons中,适合Eureka、Consul、Zookeeper注册中心。在使用时要注意使用依赖的包,否则会发现找不到该注解。

参考:https://stackoverflow.com/questions/31976236/whats-the-difference-between-enableeurekaclient-and-enablediscoveryclient

2、已停止的微服务不注销或注销有延迟
     在使用Eureka Client时,可能会发现当微服务(Eureka Client)已经停止了,而注册中心仍然显示该服务处于正常状态,或者过段时间才会注销。然而,这种情况在实际应用中是大家不太希望看见的,希望一旦服务发生异常或宕机,注册中心应该理解体现出来。

     这是由于Eureka Server注销无效节点周期、自我保护模式的因素造成的,因此会出现服务不注销或注销有延迟。解决办法如下:

Eureka Server
关闭自我保护模式,并配置注销无效节点周期时间间隔。

# 默认值为true。设为false, 关闭自我保护, 从而保证会注销微服务
eureka.server.enable-self-preservation=false
 
# 清理间隔(单位毫秒,默认是60 * 1000)。根据需求将时间间隔设置短些,例如:设置1秒,一旦down掉,则会立即注销
eureka.server.eviction-interval-timer-in-ms=1000
Eureka自我保护模式:

    主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。

参考:https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication

参考:https://github.com/spring-cloud/spring-cloud-netflix/issues/1322

Eureka Client
当Client端开启健康检查时,可以适当的按需配置续约更新时间和到期时间。这样做智能在一定程度上缓解注销延迟的程度,但不能真正解决立即注销,可以在进行微服务(Eureka Client)异常或关机时,主动调用Eureka Rest API来注销该服务,注销接口:http://localhost:8761/eureka/apps的DELETE 请求方式。

# 默认值为false。设为true,开启健康检查(需要spring-boot-starter-actuator 依赖)
eureka.client.healthcheck.enabled=true
 
# 续约更新时间间隔(默认是30秒)
eureka.instance.lease-renewal-interval-in-seconds=?
 
# 续约到期时间(默认90秒)
eureka.instance.lease-expiration-duration-in-seconds=?
参考:https://stackoverflow.com/questions/39661399/eureka-slow-to-remove-instances

3、Eureka的UNKNOWN 问题
      注册中心(Eureka Server)中服务状态,常见的有UP、DOWN,但有时会出现另外一种UNKNOWN状态,或者UNKNOWN服务名。

UNKNOWN服务名
     问题显而易见,只需在服务(Eureka Client)配置中配置明确的服务名即可。配置参数为spring.application.name 或者 eureka.instance.appname ,如果这两个参数都不配置,则将会出现UNKNOWN服务名。温馨提示:为了程序的可读性,极力推荐配置明确的服务名。

UNKNOWN状态
    服务为UNKNOWN状态,是很少见的问题。服务状态用于辨别服务是否可用(可调用),来源于对服务的健康检查(需要spring-boot-starter-actuator的依赖)所致。

    当服务(Eureka Client)配置参数eureka.client.healthcheck.enabled=true时,必须要配置在application.yml或application.properties配置文件中,而不能配置在bootstrap.yml或bootstrap.properties中,否则在一些情况下可能会出现UNKNOWN状态的问题。

参考:https://github.com/spring-cloud/spring-cloud-netflix/issues/1276