失效剔除
场景:有些时候,我们的服务实例并不一定会正常下线,可能由于内存溢出、网络故障等原因使服务不能正常运作。而服务注册中心并未收到“服务下线”的请求
解决:为了从服务列表中将这些无法提供服务的实例剔除,Eureka Server在启动的时候会创建一个定时任务,默认每隔一段时间(默认为60秒)将当前清单中超时(默认为90秒)没有续约的服务剔除出去。
自我保护
服务注册到Eureka Server后,会维护一个心跳连接,告诉Eureka Server自己还活着。Eureka Server在运行期间会统计心跳失败的比例在15分钟以之内是否低于85%,如果出现低于的情况,Eureka Server会将当前实例注册信息保护起来,让这些实例不会过期。这样做会使客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况。因此客户端要有容错机制,比如请求重试、断路器。
以下是自我保护相关的属性:
eureka.server.enableSelfPreservation=true. 可以设置改参数值为false,以确保注册中心将不可用的实例删除
微服务启动报Cannot execute request on any known server 的几种解决办法
连接Eureka服务端的URL不对:
如果访问地址是:http://127.0.0.1:8080/eureka/
则在Eureka服务发现应该配置为:
server.port: 8080
eureka.client.serviceUrl.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
注意:Eureka服务端相当于一个特殊的Eureka客户端,也可以进行注册发现【实现Eureka的高可用】。@EnableDiscoveryClient和@EnableEurekaClient的区别
@EnableDiscoveryClient和@EnableEurekaClient的区别主要是使用的场景不同。
后者只能在注册中心是Eureka的时候使用,前者的范围更加广泛既可以在注册中心是Eureka的时候使用也能在注册中心是其他的框架组件的使用使用。