Spring cloud Eureka服务注册与发现详解

一.Eureka概述

(1)Eureka是什么

Eureka是一个用于服务注册与发现的框架,本身是一个基于Rest的服务。

(2)Eureka的组件有哪些?

Eureka的组件可分为Eureka Server和Eureka Client。

(3)Eureka中涉及的角色有哪些?

Eureka中涉及的角色有服务提供方、服务注册中心、服务消费方。

二.Eureka原理解析

Spring cloud Eureka服务注册与发现详解

这个是官方文档中Eureka集群服务注册与发现的原理图,在分析之前先对图示的名词解释下。

Eureka Server:服务注册中心

Application Service:应用服务,可作为服务提供方

Application Client:服务消费方

Register:服务注册

Renew:服务续约

Cancel:服务下线

Make Remote Call:远程服务调用

Replicate:数据同步(复制)

2.1 服务提供方

(1)服务注册

服务提供方在服务启动后会通过发送REST请求的方式在Eureka Server上进行注册,同时会携带自身服务的一些元数据,包括服务名、IP地址、端口号等。

(2)服务数据同步

两个服务提供方分别注册到两个不同的服务注册中心,它们的元数据信息分别被对应的服务注册中心所维护,由于服务注册中心之间相互注册为服务,当服务提供方发送注册请求到一个服务注册中心时,该服务注册中心会将该请求转发给集群中相连的其他注册中心, 从而实现注册中心之间的服务同步。通过服务同步,两个服务提供方的服务信息就可以通过这两台服务注册中心中的任意一台获取到。

(3)服务续约

当在服务注册中心已注册服务后,服务提供方会维持一个心跳来保持与Eureka Server的会话,防止Eureka Server的剔除任务会将其服务实例从可用服务列表中移除,这个心跳会话保持就叫做服务续约(Renew)。

服务提供方在启动后会周期性(默认30s)向Eureka Server发送心跳连接,以证明该服务仍然是处于可用状态的,如果Eureka Server在规定的时间内(默认90s)未收到服务提供方(客户端)的心跳,则认为服务已下线。

Spring cloud Eureka服务注册与发现详解

2.2 服务消费方

(1)获取服务

当启动服务消费端时,它会发送一个REST请求给服务注册中心,获取上面注册的服务列表。Eureka Server会提供一份只读的服务列表给消费端,同时消费端会在本地缓存一份服务列表的清单并每隔30s更新一次。

Spring cloud Eureka服务注册与发现详解

(2)服务调用

服务消费者在获取服务列表清单后,通过服务名可以获得具体提供服务的实例名和该实例的元数据信息。因为有这些服务实例的详细信息,所以客户端可以根据自己的需要决定具体调用哪个实例,在ribbon中会默认采用轮询的方式进行调用,从而实现客户端的负载均衡。

对于访问实例的选择,Eureka中有Region和Zone的概念,一个Region中可以包含多个Zone, 每个服务客户端需要被注册到一个Zone中, 所以每个客户端对应一个Region和一个Zone。在进行服务调用的时候,优先访问同处一个Zone 中的服务提供方,访问不到则访问其他的Zone。

(3)服务下线

在服务提供方中,当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server, 告诉服务注册中心自己要下线了。服务端在接收到请求之后,将该服务状态置为下线(DOWN), 并把该下线事件传播出去。

2.3 服务注册中心

(1)失效剔除

服务实例有可能非正常下线,可能内存溢出、网络故障等原因使得服务不能正常工作,而服务注册中心并未收到"服务下线" 的请求。为了从服务列表中将这些无法提供服务的实例剔除,Eureka Server在启动的时候会创建一个定时任务,默认每隔一段时间(默认为60秒) 将当前服务列表中超时(默认为90秒)没有续约的服务剔除。

(2)自我保护机制

Eureka Server在运行期间会统计心跳连接失败比例在15min内是否低于85%,如果低于85%,就会触发Eureka的保护机制,Eureka Server会将当前的实例注册信息保护起来,让这些心跳连接失败的实例不会过期,尽可能保护这些注册信息,防止心跳连接失败的服务实例被剔除任务移除。

但是,在这段保护期间内实例若出现问题,那么客户端很容易拿到实际已经不存在的服务实例, 会出现调用失败的情况,所以客户端必须要有容错机制,比如可以使用请求重试、断路器等机制。


eureka.server.enableself-preservation=false 参数来关闭保护机制,以确保注册中心可以将不可用的实例正确剔除。

您的关注是我的持续动力,咱们下期分享~bye


分享到:


相關文章: