一、前言

Spring Cloud 默认通过 Eureka 组件进行服务管理,Eureka 组件包含 eureka-server 服务端的注册中心和 eureka-client 客户端的服务发现机制。

二、Eureka运行原理

原理图:

springcloud无感知发布 springcloud服务发现原理_java

  • Eureka:服务注册中心(可以是一个集群),对外暴露自己的地址,提供服务注册和发现;
  • ApplicaltionService:服务提供者,启动后向 Eureka 中注册自己的信息(服务地址、提供服务类型…);
  • ApplicationClient:向 Eureka 订阅服务,Eureka 会将对应服务的所有提供者地址发送给消费者,并且定期更新;
  • renew:心跳续约,提供者定期提供 HTTP 方式向 Eureka 刷新自己的状态。

三、实效剔除和自我保护

服务下线

当服务进行正常关闭操作时,它会触发一个服务下线的 REST 请求给 Eureka Server,告诉服务注册中心:“我要下线 了”。服务中心接受到请求之后,将该服务置为下线状态。

失效剔除

有时我们的服务可能由于内存溢出或网络故障等原因使得服务不能正常的工作,而服务注册中心并未收到“服务下线”的请求。相对于服务提供者的“服务续约”操作,服务注册中心在启动时会创建一个定时任务,默认每隔一段时间(默认为60秒)将当前清单中超时(默认为90秒)没有续约的服务剔除,这个操作被称为失效剔除。 可以通过 eureka.server.eviction-interval-timer-in-ms 参数对其进行修改,单位是毫秒。

自我保护

当一个服务未按时进行心跳续约时,Eureka会统计最近15分钟心跳失败的服务实例的比例是否超过了85%,当 Eureka Server 节点在短时间内丢失过多客户端(可能发生了网络分区故障)。在生产环境下,因为网络延迟等原因,心跳失败实例的比例很有可能超标,但是此时就把服务剔除列表并不妥当,因为服务可能没有宕机。Eureka就会把当前实例的注册信息保护起来,不予剔除。生产环境下这很有效,保证了大多数服务依然可用。 但是这给我们的开发带来了麻烦, 因此开发阶段我们都会关闭自我保护模式:

eureka: server: enable-self-preservation: false # 关闭自我保护模式(缺省为打开) eviction-interval-timer-in-ms: 1000 # 扫描失效服务的间隔时间(缺省为60*1000ms)