三、spring cloud eureka(基本概念及架构设计)

2019-03-23  本文已影响0人  小manong

一、eureka概述

1、背景

(1)netflix公司与AWS的ELB
(2)eureka诞生
(3)ELB和eureka搭配使用

2、eureka优势

(1)提供完成的服务注册和服务发现实现
(2)与spirngcloud无缝集成
(3)采用AP而非CP

在生产实践中,服务注册及发现中保留可用以及过期的数据总比丢失可用的数据好。---peter kelly

(4)开源

3、eureka和zk作为注册中心比较

eureka和zk作为注册中心时候的比较
比较项目 zk eureka
设计原则 CP AP
优点 数据强一致 服务高可用
缺点 网络分区会影响 Leader 选举,超过阈值后集群不可用 服务节点间的数据可能不一致; Client-Server 间的数据可能不一致;
使用场景 单机房集群,对数据一致性要求较高 云机房集群,跨越多机房部署;对注册中心服务可用性要求较高

二、eureka架构设计

eureka架构设计图

1、设计理念

(1)AP由于CP
(2)Peer to Peer设计

主从复制:Master-Slave模式,一个主副本和多个从副本,所有数据的写操作都是提交到主副本,最后由主副本更新到其他的从副本(常采用异步更新),通常写是整个系统的瓶颈所在。
对等复制:副本之间不分主从,任何的副本都可以接受写数据,然后副本之间进行数据更新。在对等复制中,由于每一个副本都可以进行写操作,各个副本之间的数据同步及冲突处理是一个比较难解决的问题。

1、客户端:在客户端中配置相应的服务端的多个peer节点,在客户端实际操作中有如下几点规律;(1)有多个分区时候,优先选择与应用实例所在分区一样的其他服务实例,如果没有的话选择默认是defaultZone(2)客户端会维护一个可用的server列表,请求的时候优先从可用的列表中进行选择,如果请求失败切换到下一个server进行重试,重试次数为3次(3)为了防止客户端请求服务端的节点不均匀现象,客户端有一个定时任务来刷新并随机化eureka server的列表。
2、服务端:server本身依赖于客户端,也就是每一个server是作为其他server的客户端存在。在一个server启动的时候,有一个synvUp操作,通过客户端请求其他的server节点中的一个节点获取注册的应用实例信息,然后复制到其他的peer节点。eureka中采用版本号(lastDirtyTimestamp)和心跳机制(renewLease从新租约方式)的方式来解决数据复制过程中的冲突问题。

(3)Zone和region的设计

(4)self preservation设计

2、组件调用关系设计

(1)服务提供者

1、启动后,向注册中心发起 register 请求,注册服务
2、在运行过程中,定时向注册中心发送 renew 心跳,证明“我还活着”。
3、停止服务提供者,向注册中心发起 cancel 请求,清空当前服务注册信息。

(2)服务消费者

1、启动后,从注册中心拉取服务注册信息
2、在运行过程中,定时更新服务注册信息。
3、服务消费者发起远程调用:
a> 服务消费者(北京)会从服务注册信息中选择同机房的服务提供者(北京),发起远程调用。只有同机房的服务提供者挂了才会选择其他机房的服务提供者(青岛)。
b> 服务消费者(天津)因为同机房内没有服务提供者,则会按负载均衡算法选择北京或青岛的服务提供者,发起远程调用。

(3)服务注册中心

1、启动后,从其他节点拉取服务注册信息。
2、运行过程中,定时运行 evict 任务,剔除没有按时 renew 的服务(包括非正常停止和网络故障的服务)。
3、运行过程中,接收到的 register、renew、cancel 请求,都会同步至其他注册中心节点

3、数据存储结构

eureka数据存储结构图

Eureka Client 在拉取服务信息时,先从缓存层获取(相当于 Redis),如果获取不到,先把数据存储层的数据加载到缓存中(相当于 Mysql),再从缓存中获取。值得注意的是,数据存储层的数据结构是服务信息,而缓存中保存的是经过处理加工过的、可以直接传输到 Eureka Client 的数据结构。

(1)数据存储层

第一层的 key 是spring.application.name,value 是第二层 ConcurrentHashMap;
第二层 ConcurrentHashMap 的 key 是服务的 InstanceId,value 是 Lease 对象;
Lease 对象包含了服务详情和服务治理相关的属性。

Eureka Server 内置了一个 TimerTask,定时将二级缓存中的数据同步到一级缓存(这个动作包括了删除和加载)。

(2)二级缓存层

一级缓存:ConcurrentHashMap<Key,Value> readOnlyCacheMap,本质上是 HashMap,无过期时间,保存服务信息的对外输出数据结构。
二级缓存:Loading<Key,Value> readWriteCacheMap,本质上是 guava 的缓存,包含失效机制,保存服务信息的对外输出数据结构。

1、Eureka Client 发送 register、renew 和 cancel 请求并更新 registry 注册表之后,删除二级缓存;2、Eureka Server 自身的 Evict Task 剔除服务后,删除二级缓存;3、二级缓存本身设置了 guava 的失效机制,隔一段时间后自己自动失效;

1、Eureka Client 发送 getRegistry 请求后,如果二级缓存中没有,就触发 guava 的 load,即从 registry 中获取原始服务信息后进行处理加工,再加载到二级缓存中。
2、Eureka Server 更新一级缓存的时候,如果二级缓存没有数据,也会触发 guava 的 load。

三、eureka高可用原理分析

1、默认情况下面不同region是相互隔离的,region之间的数据是不会复制的,但是eureka client提供了fetch-remote-regions-registry配置,作用是拉取远程的注册信息到本地
2、availabilityZone,eureka中默认eureka-client-prefer-zone-eureka配置为true,也就是拉取serverUrl时候,默认选取和应用实例同一个zone的eureka server列表。

1、客户端高可用原理

(1)在client启动之前,如果没有eureka server,则通过配置eureka.client.back-registry-impl从备份的registry读取关键服务的信息。
(2)在client启动后,如果运行时候server全部挂掉了,本地内存有localRegion之前获取的数据。
(3)如果是server部分挂了。如果预计恢复时间比较长,可以人工介入,通过配置中心人工摘除服务(但是基本不用这样做)。在client中会维护一份不可用的server列表,一旦心跳时候失败,当该列表的大小超过指定的阈值时候就会进行重新清空,重新清空后,client会进行重试(默认3次)

2、服务端高可用原理


参考:
微服务注册中心 Eureka 架构深入解读
重新定义springcloud
深度剖析服务发现组件Netflix Eureka
其他资料

上一篇下一篇

猜你喜欢

热点阅读