1. 写在前面

最开始服务之间的调用借助的是域名,域名其实是个好东西,使用起来很方便,但所有调用请求都得走域名解析和负载均衡,相对来说性能就差一点,而且这些夹在中间的零部件会演变成性能瓶颈和潜在的单点风险。

后来大家一比较发现还不如直接端到端调用,那么就需要一个东西把调用链的两端连起来,这就是注册中心。

图片来源 主流微服务注册中心浅析和对比

注册中心提供服务的注册发现,用来连接调用链路的 ProviderConsumer 这两个端点。

一个注册中心得管理好服务的扩缩容、故障转移、流量分配这类的核心功能,自身同样需要高可用,妥善解决跨地域部署情况下注册中心节点之间的数据一致性。

因此我更倾向于认为注册中心是一个偏向体系化的产品,它的价值依赖于与之相匹配的服务规模和治理体系,它的思想虽然产生得很早,但是规模化地落地并不容易。

偏小的服务规模本身对于注册中心的依赖并不明显,实现的手段也没有定式;大型服务又会对注册中心的定位、功能提出更苛刻的需求。

2. CP 还是 AP

究竟是选择强一致性还是高可用性,当下的主流技术选型倾向于后者,但这并不是说明 CP 组件没有存在的意义,而是 AP 组件更契合互联网对于注册中心的定位。

互联网系统高可用永远是摆在首位的东西,因为系统不可用的时间通常跟财产损失直接挂钩。服务列表在短时间少了一两个节点、多了一两个节点,这点流量倾斜对于大多数服务来说感知并不明显,只需要注册中心在某个短暂的时间窗口内重新达到一致性的状态就可以,注册中心不应该在运行时影响到处于正常调用的两个端点之间的连通性。

3. 放过 ZK 吧

CP 的代表就是 zookeeper,至今 zookeeper 也是非常流行的用于注册中心的组件,这在一定程度上要感谢 dubbo

dubbozookeeper 中是用一个树形结构的两个节点,分别维护服务的 ProviderComsumer 的,列表注册在这两个节点下面,服务的健康检查依赖 zookeeper 提供的临时节点特性,实际上跟 session 的生命周期绑定在一起。但临时节点的问题就是数据易失,一旦集群故障节点重启丢失服务列表,可能造成服务大面积瘫痪,电商新贵 PDD 就曾经出现过这个问题。

图片来源 Dubbo 官网

CP 最关键的问题在于无法支持机房容灾,例如 ABC 三个机房,机房 C 和其他两个机房产生了网络隔离,部署在机房 Czookeeper 节点是无法提供写入的,这意味着机房 C 部署的 Provider 不能扩缩容、不能重启,最好在故障期间一直保持原样,否则 Provider 任何操作都会是高危的,会直接影响到部署在机房 CComsumer

顺带说一句,我认为 zookeeper 真挺好的,它本身的定位就是个分布式协调服务,并不是专门为注册中心设计的,你不能拿评价注册中心的眼光去评价它,你要的功能 zookeeper 基本上都有,借助 Curator 拿来就可以用,提供了 election,提供了 ZABTPS 低了点(其实也可以了)但是也满足大部分服务规模。

4. Eureka 的挣扎

Eureka —— 奈飞的网红组件,AP 注册中心的代表。

Eureka 1.x 今天回头看来是个很牵强的实现,因为它的架构从诞生之日起,就意味着将来数据规模增长之后大概率会出问题,集群整体可伸缩性很低,每扩容一台 Eureka 节点意味着整体点对点之间需要多一份数据流,而这种 Peer 点对点机制的数据流很容易打满网卡,造成服务端压力。

根据公开的资料,Eureka 在实例规模五千左右时就会出现明显的性能瓶颈,甚至是服务不可用的情况。

但是从另一个方面来说,Eureka 的架构清晰、运维部署都很方便,而且 Eureka 作为 SpringCloud 推荐的注册中心实现,国内用户数目也相当可观,可见在服务规模恰当的情况下其性能并没有问题,从携程的分享资料也可以看出,其内部的注册中心也是类似于 Eureka 的实现。

可见没有绝对完美的架构设计,适合自己、满足业务需求才是最主要的。

图片来源 infoQ:微服务注册中心 Eureka 架构深入解读,作者马军伟

Eureka 服务端多节点架构其实有点去中心化的意思,有意保持了每个节点的无状态特性,但是代价就是每个节点都持有全量数据,新增的数据可以往任意一个节点写入,然后由这个节点向其他节点广播,最终达到一致性。

数据都没有持久化,仅保存在内存中,带来了更好的读写性能、更短的响应时间,但是无法处理数据瓶颈,大节点扩容造成的数据同步存在打满网卡的风险,这点跟 redis 集群很像。

客户端 30s 定期上报心跳、客户端缓存服务列表这些都没什么好谈的,Eureka 有个很有意思的点是,它的集群节点实现了一个自我保护机制,用来预测到底是集群出问题还是客户端出问题,实现很简单但是思想挺实用的。

Eureka 2.0 的设计文档上体现了读写分离集群的思想,本质上是为了提升集群性能和容量,但是非常遗憾,目前 2.0 的状态是 Discontinued,短时间应该不会有成熟的产品出现。

图片来源 网络

5. Sofa-Registry = 未来?

虽然没有 Eureka 2.0,但是可以从蚂蚁开源的 Sofa-Registry 中了解类似思想的实现,Sofa-Registry 脱胎于阿里的 ConfigServer,从公开的资料显示,国内阿里应该是最早做注册中心读写分离实践的。

图片来源 ConfigServer架构,作者库昊天

这种架构带来的直接好处就是可以支持海量数据。

第一层的 session 集群可以无限水平扩展,彼此之间完全不需要通信,session 集群在内存中维护了注册中心需要的一切拓扑关系,客户端仅仅连接一部分 session 集群中的机器,如果某台 session 机器挂了客户端会选择另一台重连。

背后的 data 集群则通过分片存储所有的源数据,分片之间通过主从副本保证高可用,再将源数据推送到 session 集群保存下来,供客户端读取。

缺点也很明显,这种架构人力投入、运维成本肯定高于 Eureka

6. 跨地域部署

这几乎是注册中心不可避免的问题,高可用、机房容灾、网络延迟等都会催生出要求注册中心节点能够跨地域部署,这会引申出另一个问题就是如何做数据同步。

这种情况下已经不可能通过客户端注册或者是集群节点数据流复制来保证异地注册中心集群之间的数据一致,而是会研发单独的数据同步组件,通过跨地域专线实现地域间注册中心的数据同步。

如果专线断开,此时各自地域的注册中心依旧可以独立服务于本地域内服务的调用,等到专线恢复,二者的数据继续进行同步合并纠正,最终达到一致性。

对这个知识点感兴趣的可以了解下 Nacos-Sync 组件,是 Nacos 项目专门推出的开源数据同步服务。

7. 写在最后

文章略过了一些注册中心通用的概念,例如数据模型的分层、服务列表本地缓存、健康检查的方式、推拉权衡等,我认为叙述这些细节的意义并不大。

很多时候,理解某个组件我认为最重要的是理清它的架构演进过程,这是宝贵的经验财富,你可以抓住并学习每次架构演进的方向和原因。

eureka集群只注册一个_闲聊注册中心——ZK、Eureka、Sofa-Registry相关推荐

  1. eureka 集群失败的原因_对于注册中心,ZooKeeper、Eureka哪个更合适?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://h5ip.cn/Kr8D 简介 Eureka本 ...

  2. eureka集群只注册一个_一、Spring Cloud Eureka服务注册中心

    Sping boot Eureka是服务中心,管理各种服务功能包括服务的注册.发现.熔断.负载.降级等.Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装. 在du ...

  3. eureka集群只注册一个_Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇

    Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...

  4. eureka 集群失败的原因_Eureka集群的那些坑

    今天遇到一个Eureka集群的一个坑. 问题现场类似是这样的:两台Eureka组成的服务注册中心集群,两台服务提供方server1.server2,两个服务调用方client1.client2. 正常 ...

  5. Linux搭建eureka集群,基于dns搭建eureka集群

    eureka集群方案: 1.通常我们部署的eureka节点多于两个,根据实际需求,只需要将相邻节点进行相互注册(eureka节点形成环状),就达到了高可用性集群,任何一个eureka节点挂掉不会受到影 ...

  6. JavaEE进阶知识学习-----SpringCloud(四)Eureka集群配置

    Eureka集群配置 microservicecloud-eureka-7001使EurekaServer服务注册中心,一旦这个出现问题,那么微服务就不能正常的工作,为防止这种情况,所以出现了集群,就 ...

  7. SpringCloud--Eureka服务注册与发现 Eureka 集群搭建 详细案例!!!

    SpringCloud组件--Eureka 完整笔记 一.Eureka基础知识 1.1.什么是服务治理 ? 1.2. 什么是服务注册与发现? 1.3.Eureka两组件:Eureka Server和E ...

  8. 疯狂Spring Cloud连载(5)Eureka集群搭建

    2019独角兽企业重金招聘Python工程师标准>>> 本文节选自<疯狂Spring Cloud微服务架构实战> 京东购买地址:https://item.jd.com/1 ...

  9. 《SpringCloud超级入门》使用Eureka集群搭建《十三》

    前面我们搭建的注册中心只适合本地开发使用,在生产环境中必须搭建一个集群来保证高可用.Eureka 的集群搭建方法很简单:每一台 Eureka 只需要在配置中指定另外多个 Eureka 的地址就可以实现 ...

最新文章

  1. 基于python3的一次简单的请求url接口返回json类型结果实例。
  2. Snackbar-Android M新控件
  3. 特征提取 notes
  4. 《F4+2》—团队项目系统设计改进与详细设计
  5. Postgre约束详解
  6. 第一次失效_特斯拉螺栓腐蚀失效分析_搜狐汽车
  7. 数字图像处理--颜色选择
  8. Dynamic Wallpaper for Mac视频动态壁纸
  9. .NET中的Lambda表达式与匿名方法
  10. 项目日志 Log4cpp
  11. windows 驱动开发使用的一些工具
  12. PHP TOP5开源小程序商城盘点
  13. 热带鱼屏保(Marine Aquarium 3),如何才能绕过它的Key Code?
  14. 一个Android项目被360报毒的解决方案
  15. uniapp 简单有效判断手指滑动方向
  16. 网络资源计算机教学设计,第11课 网络资源任我搜 教案
  17. Polyhedral Compilation及ISL学习资料
  18. android屏幕跳转,Android 几种屏幕间跳转的跳转Intent Bundle
  19. scipy 插值重采样
  20. springboot尚硅谷雷神学习笔记

热门文章

  1. 硬盘S.M.A.R.T. status Failing
  2. 《微观经济学》 第九章
  3. PhpBazar adid SQL注入漏洞
  4. 计算机怎么看显卡内存容量,显存容量是什么,详细教您查看显卡容量大小方法...
  5. java分词主谓宾_英语五种结构的句子(主谓 主谓宾 主谓宾宾补 主系表 主谓双宾)谁给我讲一下…...
  6. 项目经理PMO必备的工作汇报技巧
  7. centos7通过yum安装nginx以及其简单配置使用
  8. 面向对象:继承(经典类新式类继承原理、属性查找)、派生
  9. easyUI easyui-datagrid (良好习惯:onClickRow,onSelect 都写上,事件同步)
  10. java计算机毕业设计html5健身房信息管理系统源码+mysql数据库+系统+lw文档+部署