抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

概述

Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。

由于微服务概念的引入,使大型服务在一定程度上彻底的解耦,当服务集群足够庞大的时候,服务治理成为了微服务的痛点之一。

Eureka是Spring Could中服务发现的推荐组件,保证服务的高可用性,它有着丰富的API,使得Eureka作为服务发现与治理都比较方便。

架构与原理

架构图

  • Eureka Server:服务的注册中心,负责维护注册的服务列表。
  • Service Provider:服务提供方,作为一个Eureka Client,向Eureka Server做服务注册、续约和下线等操作,注册的主要数据包括服务名、机器ip、端口号、域名等等。
  • Service Consumer:服务消费方,作为一个Eureka Client,向Eureka Server获取Service Provider的注册信息,并通过远程调用与Service Provider进行通信

Eureka Server作为一个独立的部署单元,以REST API的形式为服务实例提供了注册、管理和查询等操作。同时,Eureka Server也为我们提供了可视化的监控页面,可以直观地看到各个Eureka Server当前的运行状态和所有已注册服务的情况。如图:

eureka

原理:

服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,

然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

当服务注册中心Eureka Server检测到服务提供者因为宕机、网络原因不可用时,则在服务注册中心将服务置为DOWN状态,并把当前服务提供者状态向订阅者发布,订阅过的服务消费者更新本地缓存。

服务提供者在启动后,周期性(默认30秒)向Eureka Server发送心跳,以证明当前服务是可用状态。Eureka Server在一定的时间(默认90秒)未收到客户端的心跳,则认为服务宕机,注销该实例。

源码解读:

eureka主体实现方式:

ApplicationResource类接收Http服务请求,调用PeerAwareInstanceRegistryImpl的register方法,PeerAwareInstanceRegistryImpl完成服务注册后,调用replicateToPeers向其它Eureka Server节点(Peer)做状态同步。

eureka client

启动时候会创建一个定时任务,定时任务会将本地的服务配置信息,也就是注册到远端的服务信息自动刷新到注册服务器上,实现了服务注册以及缓存更新的机制。

1、com.netflix.discovery.DiscoveryClient.java中的可以看到initScheduledTasks方法,它封装了一个instanceInfoReplicator的定时任务,以一定的时间(默认30秒)来刷新服务的缓存和心跳信息。

2、instanceInfoReplicator中的run方法调用register来实现注册功能,start方法实现了定时刷新调用,定时注册到eureka

eureka server

1、com.netflix.eureka.resources.ApplicationResource 中使用addInstance方法接收来自client的请求消息,然后进行处理,最终的注册信息缓存在ConcurrentHashMap中,实现服务缓存。

Eureka的自我保护机制:

在默认情况下,Eureka Server在默认90s时间内没有收到服务端的心跳(默认30秒一次心跳,三次心跳),会将该服务注销。在一般情况下,网络通信的故障率较高,在网络通信出现异常时,Eureka Server如果正常注销服务,

将会导致大部分服务不可用,这违背了微服务高可用的初衷,在这种情况下,Eureka Server有自我保护机制,当它在短时间内丢失过多的客户端时(默认15分钟内低于85%),该节点将进入自我保护模式,不再注销服务,并且同时继续提供新服务的注册,当网络故障修复之后,该节点能自动的退出自我保护模式。

总之一句话:不管好数据坏数据,一个不落。