Eureka 常见问题汇总及注意事项
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注册中心。在使用时要注意使用依赖的包,否则会发现找不到该注解。
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
版权声明: 本文为 InfoQ 作者【xcbeyond】的原创文章。