如何设计一个注册中心

一、什么是注册中心

注册中心主要是用来解决微服务架构下多个服务相互远程调用的问题,比如说存在服务提供者在集群A,服务调用者在集群B,集群A和集群B位于不同的机器上面,那么在服务调用者方B调用服务提供者方A服务的过程中,如何包证服务提供者A可用:

在上图中,有这么几个问题需要解决:

①集群B的服务调用者如何发现集群A的服务提供者

②集群B的服务调用者如何选择集群A中的某一台服务提供者机器发起调用

③集群A的服务提供者机器下线之后,集群B中调用者如何感知到这台机器的下线,不在对已下线的机器发起调用

④集群B提供的某个服务如何获知集群A中那些机器正在消费该服务

以上问题将通过服务注册中心来解决,采用服务注册中心来实时存储更新服务提供者信息及该服务的实时调用者信息

二、CAP定理

CAP定理,又被叫做布鲁尔定理。对于设计分布式系统而言,CAP是必须要掌握的入门级定理。

分布式系统的最大难点,就是各个节点的状态如何同步。CAP 定理是这方面的基本定理,也是理解分布式系统的起点。

C (一致性):指数据在多个副本之间能够保持一致的特性(严格的一致性)在分布式系统中的所有数据备份,在同一时刻是否同样的值。(所有节点在同一时间具有相同的数据),保证原子性。

  • 强一致性:在任意时刻,所有节点中的数据是一样的。
  • 弱一致性:数据更新后,如果能容忍后续的访问只能访问到部分或者全部访问不到,则是弱一致性。我们经常提到的最终一致性就是属于弱一致性。

A (可用性):指系统提供的服务必须一直处于可用的状态,每次只要收到用户的请求,服务器就必须给出回应。在合理的时间内返回合理的响应(不是错误和超时的响应)

P (分区容错性):如果出现了分区问题,我们的分布式存储系统还需要继续运行。不能因为出现了分区问题,整个分布式节点全部就熄火了,罢工了,不做事情了。

  • 分区:分布式的存储系统会有很多的节点,这些节点都是通过网络进行通信。而网络是不可靠的,当节点和节点之间的通信出现了问题,此时,就称当前的分布式存储系统出现了分区。但是,值得一提的是,分区并不一定是由网络故障引起的,也可能是因为机器故障。比如,我们的分布式存储系统有 A、B 两个节点。那么,当 A、B 之间由于可能路由器、交换机等底层网络设备出现了故障,A 和 B 通信出现了问题,但是 A、B 依然都在运行,都在对外提供服务。这时候,就说 A 和 B 发生了分区。还有一种情况也会发生分区,当 A 出现了宕机,A 和 B 节点之间通信也是出现了问题,那么我们也称 A 和 B 发生了分区。

CAP原则的精髓就是要么CA,要么CP,要么AP,但是不存在CAP。

组合 分析结果
CA 满足原子和可用,放弃分区容错。说白了,就是一个整体的应用。
CP 满足原子和分区容错,也就是说,要放弃可用。当系统被分区,为了保证原子性,必须放弃可用性,让服务停用。
AP 满足可用性和分区容错,当出现分区,同时为了保证可用性,必须让节点继续对外服务,这样必然导致失去原子性。

在以分布式系统为限定条件的CAP世界里, P 是早已确定的答案,不选 P,一旦发生分区错误,整个分布式系统就完全无法使用了,这是不符合实际需要的。所以,对于分布式系统,我们只能能考虑当发生分区错误时,如何选择一致性和可用性。

当一套系统在发生分区故障后,客户端的任何请求都被卡死或者超时,但是,系统的每个节点总是会返回一致的数据,则这套系统就是 CP 系统,经典的比如 Zookeeper。

如果一套系统发生分区故障后,客户端依然可以访问系统,但是获取的数据有的是新的数据,有的还是老数据,那么这套系统就是 AP 系统,经典的比如 Eureka。

image

三、Eureka与Zookper的核心原理

1、Zookper 原理

特点:CP系统,当一套系统在发生分区故障后,客户端的任何请求都被卡死或者超时,但是,系统的每个节点总是会返回一致的数据。

原理:ZooKeeper是有一个leader节点会接收数据, 然后同步写其他节点,一旦leader挂了,要重新选举leader。

参考文件:Zookper原理详解:https://zhuanlan.zhihu.com/p/59313297

2、Eureka 原理

特点:AP系统,遵循的是最终一致性。如果一套系统发生分区故障后,客户端依然可以访问系统,但是获取的数据有的是新的数据,有的还是老数据。

原理:下图是Eureka集群原理图,采用peer-to-peer(同辈)的架构集群模式,部署一个集群,但是集群里每个机器的地位是对等的。各个服务可以向任何一个Eureka实例服务注册和服务发现,集群里任何一个Euerka实例接收到写请求之后,会自动同步给其他所有的Eureka实例 。

但是他就会有一个问题,可能还没同步数据过去,结果自己就死了。

此时还是可以继续从别的机器上拉取注册表,但是看到的就不是最新的数据了,但是保证了可用性 ,此种状态就遵循了最终一致性。

四、自己设计一个注册中心的关键

通过上面的讨论,我们可以知道如果要设计一个注册中心,肯定要考虑客户端与服务器端相应的开发:

心跳机制

心跳机制是保证服务调用者与服务提供者正常通信的关键。

服务端:在单位时间内,如果所注册服务没进行服务的续约,则要将该服务下线。

客户端:告诉服务端自己是否存活以便进行服务的一个续约。

高并发

在注册中心中存在着两种角色,即服务提供者方与服务调用方,服务提供者方向注册中心注册服务是写操作,服务调用者方向注册中心拉取相应列表是读操作,在这个过程中不可避免会出现并发操作,而注册中心为了解决高并发的问题,借用了 CoppyOnWriteArrayList 的实现原理实现了读写分离。

CAP选择

最后就是根据业务需要选择cp系统,还是ap系统。选择CP系统,保证数据是一致的,如Zookper。选择AP系统,保证数据是可用的,如Eureka。

原文地址:https://www.cnblogs.com/tianwenxin/p/15214115.html