Eureka常见问题
- Eureka注册服务慢:默认情况下,服务注册到Eureka Service的过程较慢,服务注册设计到的周期心跳默认是30秒一次(通过客户端配置的serviceUrl)。只有当实例,服务端和客户端的本地缓存中的元数据都相同时,服务才能被其他客户端发现(所以需要3次心跳)。可以使用参数eureka.instance.leaseRenwalIntervalInSeconds修改间隔时间,从而加快客户端连接到其他服务的过程。在生产环境中最好坚持使用默认值,因为服务器内部有一些算法,它们会对续约做出假设
- 已停止的微服务节点注销慢或者不注销:在开发环境中,往往希望Eurrka Service能迅速有效的注销已停止的微服务实例。然而,由于Eureka Service清理无效节点周期长(默认90秒),以及自我保护模式等原因,可能会遇到微服务注销慢甚至不注销的问题,解决方案如下:
- Eureka Service端,配置关闭自我保护,并且按需配置Eureka Service清理无效节点的时间间隔
eureka.server.enable-self-preservation:false
#设为false,关闭自我保护,从而保证会注销微服务
eurrka.server.eviction-interval-time-in-ms
#清理间隔(单位毫秒,默认是60*1000)
- Eureka Client端,配置开启健康检查,并按需配置续约更新时间和到期时间
eureka.client.healthcheck.enabled
#设为true,开启健康检查(需要spring-boot-starter-actuator依赖)
eureka.instance.lease-renewal-insterval-in-seconds
#续约更新时间间隔(默认30秒)
eureka.instance.lease-expriation-duration-in-seconds
#续约到期时间(默认90秒)
注意:这些配置仅建议在开发和测试是使用,生产环境建议坚持使用默认值
Hystrix/Feign整合Hystrix后首次请求失败
某些场景下,Feign或者Ribbon整合Hystrix后,会出现首次调用失败的问题。Hystrix默认的超时时间是1秒,如果一秒内得不到响应,就会进入到fallback逻辑。由于spring的懒加载机制,首次请求往往会比较慢,因此在某些机器(特别是配置比较低的机器)上,首次请求需要的时间可能就会大于1秒
解决方案
- 方法一,延长Hystrix的超时时间
- hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:5000
- 禁用Hystrix的超时
- hystrix.command.default.execution.timeout.enabled:false
- 对于feign,还可为Feign禁用Hystrix
- fegin.hystrix.enabled:false