Eureka常见问题汇总及注意事项
0、前言
在Spring Cloud中,Eureka是接触和使用最多的组件,也是最重要的一个组件,在使用过程中经常会遇到各类突发问题,来的莫名奇妙。现把一些常见问题、注意事项,与大家进行分享。
Eureka一般出现问题原因分为两类:
Eureka版本不同带来的问题
Eureka参数配置问题
生产环境下,Eureka参数配置建议使用默认配置,除非明确清楚或明确有这样修改默认配置的需求。
1、EnableEurekaClient和EnableDiscoveryClient
在不同的应用程序中,有人使用EnableEurekaClient,有人使用EnableDiscoveryClient,都能作为Eureka Client的注解。有何区别呢?
服务发现是有多实现方式,即:多种组件可以作为注册中心,,,,@EnableEurekaClient是在中,仅仅适合于Eureka注册中心。@EnableDiscoveryClient是在中,适合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将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。
Eureka Client
当Client端开启健康检查时,可以适当的按需配置续约更新时间和到期时间。这样做智能在一定程度上缓解注销延迟的程度,但不能真正解决立即注销,可以在进行微服务(Eureka Client)异常或关机时,主动调用来注销该服务,注销接口:的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=?
3、Eureka的UNKNOWN 问题
注册中心(Eureka Server)中服务状态,常见的有UP、DOWN,但有时会出现另外一种UNKNOWN状态,或者UNKNOWN服务名。
UNKNOWN服务名
问题显而易见,只需在服务(Eureka Client)配置中配置明确的服务名即可。配置参数为spring.application.name 或者 eureka.instance.appname ,如果这两个参数都不配置,则将会出现UNKNOWN服务名。温
UNKNOWN状态
服务为UNKNOWN状态,是很少见的问题。服务状态用于辨别服务是否可用(可调用),来源于对服务的健康检查(
当服务(Eureka Client)配置参数eureka.client.healthcheck.enabled=true时,必须要配置在application.yml或application.properties配置文件中,而不能配置在bootstrap.yml或bootstrap.properties中,否则在一些情况下可能会出现UNKNOWN状态的问题。
