Java-Interview-Advanced/docs/distributed-system/registration-center- guide.md
2020-04-25 19:55:58 +08:00

3.4 KiB
Executable File
Raw Blame History

非常常见的一个技术面试题,但凡只要是聊到分布式这块,一定会问问你,DubboSpring Cloud服务注册中心,你们当时是怎么选型和调研的,你们最终是选择了哪块技术呢?你选择这块技术的原因和理由是什么呢?

Eureka、ZooKeeper

Dubbo作为服务框架的一般注册中心会选择zk

Spring Cloud作为服务框架的,一般服务注册中心会选择Eureka

**Consul、Nacos**普及型还没那么广泛,我会在面试训练营课程里增加对应的内容,给大家去进行补充

(1)服务注册发现的原理

集群模式 ZooKeeper

Eurekapeer-to-peer部署一个集群但是集群里每个机器的地位是对等的各个服务可以向任何一个Eureka实例服务注册和服务发现集群里任何一个Euerka实例接收到写请求之后会自动同步给其他所有的Eureka实例 ZooKeeper

ZooKeeper服务注册和发现的原理Leader + Follower两种角色只有Leader可以负责写也就是服务注册他可以把数据同步给Follower读的时候leader/follower都可以读

(2)一致性保障CP or AP

CAPC是一致性A是可用性P是分区容错性

CPAP

ZooKeeper是有一个leader节点会接收数据 然后同步写其他节点一旦leader挂了要重新选举leader这个过程里为了保证C就牺牲了A不可用一段时间但是一个leader选举好了那么就可以继续写数据了保证一致性

Eureka是peer模式可能还没同步数据过去结果自己就死了此时还是可以继续从别的机器上拉取注册表但是看到的就不是最新的数据了但是保证了可用性强一致最终一致性

3服务注册发现的时效性

zk时效性更好注册或者是挂了一般秒级就能感知到

eureka默认配置非常糟糕服务发现感知要到几十秒甚至分钟级别上线一个新的服务实例到其他人可以发现他极端情况下可能要1分钟的时间ribbon去获取每个服务上缓存的eureka的注册表进行负载均衡

服务故障隔60秒才去检查心跳发现这个服务上一次心跳是在60秒之前隔60秒去检查心跳超过90秒没有心跳才会认为他死了2分钟都过去

30秒才会更新缓存30秒其他服务才会来拉取最新的注册表

三分钟都过去了,如果你的服务实例挂掉了,此时别人感知到,可能要两三分钟的时间,一两分钟的时间,很漫长

(4)容量

zk不适合大规模的服务实例因为服务上下线的时候需要瞬间推送数据通知到所有的其他服务实例所以一旦服务规模太大到了几千个服务实例的时候会导致网络带宽被大量占用

eureka也很难支撑大规模的服务实例因为每个eureka实例都要接受所有的请求实例多了压力太大扛不住也很难到几千服务实例

之前dubbo技术体系都是用zk当注册中心spring cloud技术体系都是用eureka当注册中心这两种是运用最广泛的但是现在很多中小型公司以spring cloud居多所以后面基于eureka说一下服务注册中心的生产优化

5多机房、多数据中心、健康检查