Spring Cloud Eureka 原理结构

本文介绍了Spring Cloud Eureka如何构建高可用集群,服务提供者注册、同步、续约机制,以及服务消费者如何获取服务列表并实现客户端负载均衡。同时,解释了服务下线流程和Eureka Server的失效剔除及自我保护机制。
摘要由CSDN通过智能技术生成

在这里插入图片描述
“服务注册中心-1” 和 “服务注册中心-2”,他们互相注册组成高可用集群。
“服务提供者” 启动了两个实例,一个注册到“服务注册中心-1” 上,另外一个注册到 “服务注册中心-2” 上。
还有两个 “服务消费者” ,它们也都分别指向了一个注册中心。

服务提供者

  • 服务注册

“服务提供者” 在启动的时候会通过发送REST请求的方式将自己注册到Eureka Server 上,同时带上了自身服务的一些元数据信息。Eureka Server 接收到这个REST请求后,将元数据信息存储在一个双层结构Map中,其中第一层的key是服务名,第二层的key 是具体服务的实例名。在服务注册时,需要确认eureka.client.register-with-eureka=true参数是否正确,若为false,将不会启动注册操作。

  • 服务同步

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

  • 服务续约

在注册完服务之后,服务提供者会维护一个心跳用来持续告诉 Eureka Server :“我还活着”,以防止 Eureka Server 的 “剔除任务” 将该服务实例从 服务列表中排除出去,我们称该操作为服务续约。关于服务续约有两个重要属性,我们可以根据具体场景来进行调整。
eureka.instance.lease-renewal-interval-in-seconds:用于定义服务续约任务的调用时间,默认是30秒。
eureka.instance.lease-expiration-duration-in-seconds:用于定义服务失效的时间,默认是90秒。
服务消费者

  • 获取服务

到这里,在服务注册中心已经注册了一个服务,并且该服务有两个实例。当我们启动服务消费者时,它会发送一个REST请求给服务注册中心,来获取上面注 册的服务清单。为了性能考虑,Eureka Server 会维护一份只读的服务清单来返回给客户端,同时该缓存清单会每隔30秒更新一次。获取服务是服务消费者的基础,所以要确保 eureka-client-fetch-registery=true 参数没有被修改成false,该值默认为 true。若想修改缓存清单的更新 时间,可以通过 eureka-client.registry-fetch-interval-seconds=30 参数来进行修改,该值默认为30,单位为秒。

  • 服务调用

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

  • 服务下线

在系统运行过程中必然会面临关闭或重启服务的某个实例的情况,在服务关闭期间,我们自然不希望客户端会继续调用关闭了的实例。所以在客户端程序中,当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给 Eureka Server,告诉服务注册中心:“我要下线了”。服务端在接收到请求之后,将该服务状态设置为下线(DOWN),并把该下线事件传播出去。

服务注册中心

  • 失效剔除

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

  • 自我保护

当我们在本地调试基于 Eureka 的程序时,基本上都会在服务注册中心的信息面板上出现类似下面的红色警告信息:
  实际上,该警告就是触发了Eureka Server的自我保护机制。之前介绍过,服务注册到Eureka Server之后,会维护一个心跳连接,告诉Eureka Server 自己还活着。Eureka Server 在运行期间,会统计心跳失败的比例在15分钟之内低于85%,如果出现低于的情况,Eureka Server 会将当前的实例信息保护起来,让这些实例不会过期,尽可能保护这些注册信息。但是,在保护期间内实例若出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,比如可以使用请求重试、断路器等机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Eureka是一个用于服务注册和发现的组件,它简化了在微服务架构中的服务管理和通信。 首先,Spring Cloud Eureka由两个核心角色组成:Eureka Server和Eureka Client。 Eureka Server主要负责服务注册和发现。它是一个集中式的服务注册中心,负责管理所有服务的状态和元数据。每个服务在启动时会向Eureka Server注册自己的实例信息,包括服务名称、IP地址和端口等,Eureka Server会维护一个服务注册表来跟踪所有已注册的服务。 Eureka Client则是各个微服务应用程序的客户端。它在服务启动时会向Eureka Server注册自己,并定期发送心跳来更新自己的状态。同时,它也会从Eureka Server获取其他服务的注册信息,并将其缓存在本地。这样,当需要使用其他服务时,Eureka Client可以直接从缓存中获取服务的访问地址,而不需要向注册中心发送请求。 此外,Eureka Server和Eureka Client之间也会进行心跳和故障检测。Eureka Client会定时发送心跳给Eureka Server,以通知自己的状态仍然健康;而Eureka Server则会周期性地检查各个服务的心跳,并从注册表中删除超时没有心跳的服务。 总的来说,Spring Cloud Eureka通过Eureka Server作为中心化的服务注册中心,实现了微服务的注册和发现。它可以根据客户端的需求,动态地维护服务的可用性和负载均衡。这样,微服务架构中的各个服务可以方便地相互调用,并实现高可用的分布式系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值