Spring Cloud Eureka 原理

Spring Cloud Eureka 原理

概述

所有的注册中心都需要两个核心功能:

  • 1、地址统一维护
  • 2、服务的上下线感知

注册中心核心原理:

  • 推送发送:push / pull
  • 存储:持久化
  • 高可用机制:集群特性 -> 选举特性、 一致性问题
  • cap特性:cp 、ap
  • api的提供形式:http协议、 netty通信在这里插入图片描述

一、Eureka的整体架构

Eureka Netflix 服务注册与发现的中间件Spring Cloud 2020版本中唯一留下的组件,整体架构如下。

在这里插入图片描述

  • Application Service: 作为Eureka Client,扮演了服务的提供者,提供业务服务,向Eureka Server注册和更新自己的信息,同时能从Eureka Server的注册表中获取到其他服务的信息。

    • 服务注册, Eureka Client 发送REST请求向Eureka Server注册自己的服务,提供自身的元数据,比如ip:port,url,Eureka Server接收请求后存储在一个双层的Map中。
    • 服务续约-Renew,默认每隔30s发送一次心跳到Server维持和更新注册表中的服务实例元数据的有效性。当在一定时长内Server没有收到Client的心跳信息,将默认服务下线,将服务实例的信息从注册表中删除。
  • Application Client: 作为Eureka Client,扮演了服务消费者,通过Eureka Server获取到注册到上面的其他服务的信息,从而根据信息找到所需的服务发起远程调用。

    • 服务发现,Eureka Client在启动时, 发送REST请求向Eureka Server取到注册到上面的其他服务的信息,并缓存在本地,默认30s轮询一次。
    • 服务调用,进行远程调用,一个Region可以包含多个Zone,优先调用同一个Zone的服务
  • Eureka Server: 扮演服务注册中心的角色,提供服务注册和发现的功能,每个Eureka Client向Eureka Server注册自己的信息,也可以通过Eureka Server获取到其他服务的信息达到发现和调用其他服务的目的。

    • Replicate:服务同步,Eureka Server直接相互注册构建集群,注册表信息的同步拷贝,保持不同的Eureka Server集群中的注册表中的服务实例信息的一致性。提供了数据的最终一致性。

    • Cancel: 服务下线,Client在关闭时主动向Server注销服务实例元数据,这时Client的的服务实例数据将从Server的注册表中删除。

    • 服务剔除,Client由于网络原因,没有发送请求给Server来进行服务下线,Eureka Server会每60秒遍历一次注册表中的信息,把超过90秒还没有续约的服务剔除。

二、服务注册发现的流程

注册:

  • 1、读取eureka server的地址信息和自己的配置信息,
  • 2、然后将自己的信息封装在InstanceInfo实例中,
  • 3、先把eureka server中的注册拉取到本地缓存起来
  • 4、将封装的InstanceInfo实例发送到eureka server进行注册,然后初始化心跳检测以及缓存刷新
  • 5、再次拉取注册表更新本地注册表信息

发现:

Eureka Client在启动时, 发送REST请求向Eureka Server取到注册到上面的其他服务的信息,并缓存在本地,默认30s轮询一次。

三、如何判断一个服务不可用(心跳)

在每一个Eureka Client启动的时候,都会有一个HeartbeatThread的心跳线程,保证默认每隔30秒的时候向Eureka Server发送一个心跳,告诉Eureka Server当前的Eureka Client还存活着。eureka.instance.lease-renewal-interval-in-seconds,这个参数可以来配置对应的心跳间隔时间。

Eureka Server在接收到请求之后,先去自己的注册表中去,找到请求的对应的服务信息,在这个服务信息里面有个Lease的对象,更新Lease对象里面的LastUpdateTimestamp时间戳,每一次接收到都会更新这个时间戳的(Renew 续约)

Eureka Server会每60秒遍历一次注册表中的信息,然后查看注册表中的信息是否有过期的,如果90秒还没有更新对应的LastUpdateTimestamp就表示这个服务过期(从注册表中删除注册信息)。

//可以配置心跳检测的时间间隔
eureka.server.evictionIntervalTimerInMs
//90秒过期的配置
eureka.instance.lease-expiration-duration-in-seconds 

整体原理:
在这里插入图片描述

四、Eurka的自我保护机制

Eureka Server在运行期间会去统计心跳失败的比例在15分钟之内是否低于85% 如果发现85%以上的服务都没有心跳,Eureka Server会认为当前实例的客户端与自己的心跳连接出现了网络故障,那么Eureka Server会把这些实例保护起来,让这些实例不会过期导致实例剔除。

这样做的目的是为了减少网络不稳定或者网络分区的情况下,Eureka Server将健康服务剔除下线的问题。 使用自我保护机制可以使得Eureka 集群更加健壮和稳定的运行。

进入自我保护状态后,会出现以下几种情况

  • Eureka Server不再从注册列表中移除因为长时间没有收到心跳而应该剔除的过期服务
  • Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上,保证当前节点依然可用。
protected volatile int numberOfRenewsPerMinThreshold; //每分钟最小续约数量
protected volatile int expectedNumberOfClientsSendingRenews; //预期每分钟收到续约的
客户端数量,取决于注册到eureka server上的服务数量

Eureka的自我保护机制,都是围绕上面这两个变量来实现的。

五、Eurka信息存储原理多级缓存设计

在这里插入图片描述

在这里插入图片描述

六、zk和eureka的区别

zk:是CP模型设计,目的是一个分布式协调系统,用于进行资源的统一管理,当节点挂了之后,需要进行leader选举(zab协议),在这个期间服务不可用。
eureka:是AP模型设计,目的服务注册发现系统,用于进行服务的注册发现,eureka各个节点是平等的,几个节点挂了不影响正常节点工作,当eureka客户端发现连接失败后会自动切换到其他正常节点,只要一台eureka节点还在,就能保证服务注册发现可用,只不过查到的信息可能不是最新的,不保证强一致性。

Eureka Server在运行期间会去统计心跳失败的比例在15分钟之内是否低于85% 如果发现85%以上的服务都没有心跳,Eureka Server会认为当前实例的客户端与自己的心跳连接出现了网络故障,那么Eureka Server会把这些实例保护起来,让这些实例不会过期导致实例剔除。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值