SpringCloud(二):Eureka服务注册与发现

Eureka服务注册中心

前言

因为Eureka2.x在2018年停更,所以一般情况下继续研究Eureka的意义不大,由于道人本公司现在还有部分项目在使用Eureka,所以道人写下一些总结比较浅显的一些知识,应对平时项目开发。服务注册方面作为其替代品zookeeper,道友们可以去道人zookeeper专栏中去看看。

本篇博文纯理论,关于Eureka在项目中如何使用,会在下篇文章中详细介绍。


Eureka的作用

在SpringCloud中,其实就可以简单的理解为服务注册中心

至于服务注册中心,你也可以理解为,服务应用(Provider)去统一地点(Eureka)注册,消费该服务的应用可以在该地点(Eureka)获取相关信息,从而基于RPC框架,调用该服务应用。

举个简单栗子

租房为例

  • 房东(Provider)去中介(Eureka)将自己的房子出租并发布租房信息,这一过程就可以理解为服务注册
  • 然后租客(Consumer)需要某一类型的房子,然后他找到中介(Eureka),看有没有符合要求的房子出租,这一过程就是获取注册信息(get Registry)
  • 找到符合要求的房子信息,就通过中介(Eureka)获取的信息,来找到房东(Provider),达成交易,这一过程就是RPC框架远程调用(remote call)

这里肯定有道友问了,为什么不直接找房东(Provider)?

其实在微服务兴起之前的确是直接找房东的(Provider)。但是微服务兴起后,房东太多了(服务太多),根本不知道该调用哪个服务,服务信息、管理都面对很大问题,因此Eureka应运而生,干起服务注册中心的活(道友也可以理解为中介)。

Eureka的原理

Eureka模型图

  • Eureka Client:注册中心客户端

Eureka Client 是一个 Java 客户端,用于简化与 Eureka Server 的交互。Eureka Client 会拉取、更新和缓存 Eureka Server 中的信息。因此当所有的 Eureka Server 节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者,但是当服务有更改的时候会出现信息不一致。

  • Register: 服务注册

服务的提供者,将自身注册到注册中心,服务提供者也是一个 Eureka Client。当 Eureka Client向Eureka Server注册时,它提供自身的元数据,比如IP 地址、端口,运行状况指示符 URL,主页等

  • Renew: 服务续约

Eureka Client 会每隔30秒发送一次心跳来续约。 通过续约来告知Eureka Server该Eureka Client 运行正常,没有出现问题。 默认情况下,如果Eureka Server 在 90 秒内没有收到Eureka Client 的续约,Server 端会将实例从其注册表中删除,此时间可配置,一般情况不建议更改。

服务注册取消的大致流程

这里不详细解释,只叙述大致过程,不涉及源码部分(原因是Eureka停更)。

两个存储,一个是整体注册信息的存储registry,一个是最近变化队列recentlyChangedQueue。

# 整体注册信息缓存
private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry = new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();
# 最近变化队列
private ConcurrentLinkedQueue<RecentlyChangedItem> recentlyChangedQueue = new ConcurrentLinkedQueue<RecentlyChangedItem>();
  • 注册新服务
  1. 将实例注册信息放入或者更新registry
  2. 将实例注册信息加入最近修改的记录队列
  3. 主动让Response缓存失效
  • 服务取消
  1. 从registry中剔除这个实例
  2. 将实例注册信息加入最近修改的记录队列
  3. 主动让Response缓存失效

自我保护机制

# 关闭自我保护机制(默认是打开的-true)
eureka.server.enable-self-preservation=false

自我保护机制:默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。

Eureka通过“自我保护模式”来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式**,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)**。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章