概述:

当下主流的服务注册与发现的解决方案,主要有两种:

  • 应用内注册与发现:注册中心提供服务端和客户端的SDK,业务应用通过引入注册中心提供的SDK,通过SDK与注册中心交互,来实现服务的注册与发现。
  • 应用外注册与发现:业务应用本身不需要通过SDK与注册中心打交道,而是通过其他方式与注册中心交互,间接完成服务注册与发现。

两种典型的注册中心实现

  • 应用内

采用应用内注册与发现的方式,最典型的案例要属Netflix开源的Eureka,官方架构如下:

介绍下Eureka的架构,它主要由三个重要的组件组成:

1)Eureka Server:注册中心的服务端,实现了服务信息注册、存储以及查询功能;

2) 服务端的Eureka Client:集成在服务端的注册中心SDK,服务提供者通过调用SDK,实现服务注册、反注册等功能;

3)客户端的Eureka Client:集成在客户端的注册中心SDK,服务消费者通过调用SDK,实现服务订阅、服务更新等功能。

  • 应用外

采用应用外方式实现服务注册和发现,最典型的案例是开源注册中心Consul,它的架构图如下:

通过这张架构图,可以看出来使用Consul实现应用外服务注册和发现主要依靠三个重要的组件:

1)Consul:注册中心的服务端,实现服务注册信息的存储,并提供注册和发现服务;

2)Registrator:一个开源的第三方服务管理器项目,它通过监听服务部署的Docker实例是否存活,来负责服务提供者的注册和销毁;

3)Consul Template:定时从注册中心服务端获取最新的服务提供者节点列表并刷新LB配置(比如Nginx的upstream),这样服务消费者就通过访问Nginx获取最新的服务提供者信息。

小结一下,这两种解决方案的不同之处在于应用场景,应用内的解决方案一般适用于服务提供者和服务消费者同属于一个技术体系;应用外的解决方案一般适合服务提供者和服务消费者采用了不同技术体系的业务场景,比如服务提供者提供的是C++服务,而服务消费者是一个Java应用,这时候采用应用外的解决方案就不依赖于具体一个技术体系。同时,对于容器化后的云应用来说,一般不适合采用应用内SDK的解决方案,因为这样会侵入业务,而应用外的解决方案正好能够解决这个问题。

注册中心选型要考虑两个问题

在选择注册中心解决方案的时候,除了要考虑是采用应用内的注册还是用用外注册的方式以外,还有两个最值得关注的问题,一个是高可用,一个是数据一致性。

  • 高可用

注册中心作为服务提供者和服务消费者之间沟通的纽带,它的高可用性十分重要。试想,如果注册中心不可用了,那么服务提供者就无法对外暴露自己的服务,而服务消费者也无法知道自己想要调用的服务的具体地址,后果将不堪设想。

实现高可用性的方法主要有两种:

1)集群部署,顾名思义就是通过部署多个实例组成集群来保证高可用性,这样的话即使有部分机器宕机,将访问迁移到正常的机器上就可以保证服务的正常访问;

2)多IDC部署,就是部署在不止一个机房,这样能保证即使一个机房因为断电或者光缆被挖断等不可抗力因素不可用时,仍然可以通过把请求迁移到其他机房来保证服务的正常访问。

以Consul为例,看看它是如何通过这两种方法来保证注册中心的高可用性。

从下面的官方架构图中你可以看到,一方面,在每个数据中心(data center)内都有多个注册中心Server节点可供访问;另一方面还可以部署多个数据中心来保证多机房高可用性。

  • 数据一致性

为了保证注册中心的高可用性,注册中心的部署往往都采用集群部署,并且还通常部署在不止一个数据中心,这样的话就会引出另外一个问题,多个数据中心之间如何保证数据一致?如何确保访问数据中心任何一台机器都能得到正确的数据?

这里就涉及到分布式系统中著名的CAP理论,即同时满足一致性、可用性、分区容错性这三者是不可能的,其中C(Consistency)代表一致性,A(Availability)代表可用性,P(Partition Tolerance)代表分区容错性。

为什么说CAP三者不能被同时满足的呢?

你可以想象在一个分布式系统里面,包含了多个节点,节点之间通过网络连通在一起。正常情况下,通过网络,从一个节点可以访问任何别的节点上的数据。

但是有可能出现网络故障,导致整个网络被分成了互不连通的区域,这就叫做分区。一旦出现分区,那么一个区域内的节点就没法访问其他节点上的数据了,最好的办法是把数据复制到其他区域内的节点,这样即使出现分区,也能访问任意区域内节点上的数据,这就是分区容错性。

但是把数据复制到多个节点就可能出现数据不一致的情况,这就是一致性。要保证一致,就必须等待所有节点上的数据都更新成功才可用,这就是可用性。

总的来说,就是数据节点越多,分区容错性越高,但数据一致性越难保证。为了保证数据一致性,又会带来可用性的问题。

而注册中心一般采用分布式集群部署,也面临着CAP的问题,根据CAP不能同时满足,所以不同的注册中心解决方案选择的方向也就不同,大致可分为两种:

1)CP型注册中心,牺牲可用性来保证数据强一致性,最典型的例子就是zookeeper、etcd、consul了,zookeeper集群内只有一个leader,而且在leader无法使用的时候通过paxos算法选举一个新的leader。这个leader的目的就是保证写信息的时候只向这个leader写入,leader会同步信息到followers,这个过程就可以保证数据的强一致性。但如果多个zookeeper之间网络出现问题,造成出现多个leader,发生脑裂的话,注册中心就不可用了。而etcd和consul集群内都是通过raft协议来保证强一致性,如果出现脑裂的话,注册中心也不可用。

2)AP型注册中心,牺牲一致性来保证可用性,最典型的例子就是Eureka了。对比下zookeeper,eureka不用选举一个leader,每个eureka服务器单独保存服务注册地址,因为有可能出现数据信息不一致的情况。但是当网络出现问题的时候,每台服务器都可以完成独立的服务。

而对于注册中心来说,最主要的功能是服务的注册和发现,在网络出现问题的时候,可用性的需求要远远高于数据一致性,即使因为数据不一致,注册中心内引入了不可用的服务节点,也可以通过其他措施来避免,比如客户端的快速失败机制等,只要实现最终一致性,对于注册中心来说就足够了。因此,选择AP型注册中心,一般更加合适。

总结

总的来说,在选择开源注册中心解决方案的时候,要看业务的具体场景。

1)如果你的业务体系都采用java语言的话,netflix开源的eureka是一个不错的选择,并且它作为服务注册与发现解决方案,能够最大程度的保证可用性,即使出现了网络问题导致不同节点数据不一致,你仍然能够访问eureka获取数据;

2)如果你的业务体系语言比较复杂,eureka也提供了sidecar的解决方案;也可以考虑使用consul,它支持了多种语言接入,包括Go、Python 、PHP、Scala、Java、Erlang、Ruby、Node.js、.NET、Perl等;

3)如果你的业务已经是云原生的应用,可以考虑使用consul,搭配Registrator和Consul Template来实现应用外的服务注册与发现。

服务注册中心如何选型相关推荐

  1. 阿里面试败北:5种微服务注册中心如何选型?这几个维度告诉你!

    1.前言 微服务的注册中心目前主流的有以下五种: Zookeeper Eureka Consul Nacos Kubernetes 那么实际开发中到底如何选择呢?这是一个值得深入研究的事情,别着急,今 ...

  2. 微服务注册中心的选型和思考

    来自:架构之美 概述 在微服务时代,注册中心越来越被重视.服务治理逐渐跟业务服务并驾齐驱.所以本文想对注册中心进行体系化探索.注册中心,起源于分布式时代.不管是水平拆分架构,或者垂直拆分架构,对于多服 ...

  3. 微服务注册中心技术选型:5种主流注册中心,哪个最香?

    讲解5种常用的注册中心,对比其流程和原理,无论是面试还是技术选型,都非常有帮助. 对于注册中心,在写这篇文章前,我其实只对ETCD有比较深入的了解,但是对于Zookeeper和其它的注册中心了解甚少, ...

  4. 主流微服务注册中心浅析和对比

    开源产品受开发者热捧,是因为其代码透明.可以参与共建.有社区进行交流和学习,当然更重要的是开源产品的接入成本低.个人开发者或者中小型公司往往会将开源产品作为选型首选. 开发者通过阅读源代码,理解产品的 ...

  5. 微服务 注册中心的作用_SpringCloud(二)服务注册中心与Eureka工作原理介绍

    微服务的注册中心 author:QYX 注册中心可以说是微服务架构中的通讯录,它记录了服务和服务地址的映射关系,在分布式架构中,服务会注册到这里,当服务需要调用其他服务时, 就会在这里找到服务的地址, ...

  6. 微服务注册中心为什么要使用Consul替代Eureka?

    ---------------- 版权声明:本文为CSDN博主「fishinhouse」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://b ...

  7. 主流微服务注册中心浅析和对比 1

    开源产品受开发者热捧,是因为其代码透明.可以参与共建.有社区进行交流和学习,当然更重要的是开源产品的接入成本低.个人开发者或者中小型公司往往会将开源产品作为选型首选. 开发者通过阅读源代码,理解产品的 ...

  8. 微服务注册中心怎么选?

    目录 前言 CAP理论 服务注册中心解决方案 主流注册中心产品 Apache Zookeeper -> CP Spring Cloud Eureka  -> AP Consul Nacos ...

  9. 服务注册中心Nacos

    文章目录 一.服务注册中心Nacos最佳实践 1.Nacos注册中心简介 背景分析 Nacos概述 构建Nacos服务 初始化配置 服务启动与访问 2.服务注册与调用入门(重点) 业务描述 生产者服务 ...

最新文章

  1. 【django轻量级框架】View与Model交互(模块的交互关系)
  2. Linux里设置环境变量的方法(转)
  3. codeforces Educational Codeforces Round 49 (Rated for Div. 2) C题
  4. python版本切换_怎么切换python版本
  5. java面向对象之父类的引用指向子类的对象
  6. 大学计算机软件基础心得体会,学习计算机应用基础心得体会.doc
  7. arcgis运行慢_ArcGIS Pro运行较慢的诊断方法
  8. mysql 存储过程游标 循环输出select 查询结果
  9. 汇编语言王爽第四版 第六章内容解读(附实验五答案解析)
  10. 精通JavaScript系列目录
  11. android TabHost
  12. cad放大_如何把CAD图纸转为高清图片?教你两种方法,小白也能轻松学会
  13. 使用Roslyn动态编译代码
  14. centos7查看进程ps_查看进程之ps命令
  15. 忘记了PPT文件打开密码怎么办?
  16. ##CSAPP读书日记-第九章-虚拟内存
  17. MBR和GUID分区模式的区别
  18. Vivado综合设置之-gated_clock_conversion
  19. 初学者用Eclipse和IDEA哪个好用一点?
  20. bios设置网卡启动来恢复网络正常使用的方法图文教程

热门文章

  1. go 代理加速配置详解
  2. randomize方式总结
  3. 基于html、css的个人网站(网页制作期末作业)
  4. 【深度学习】(11) 学习率衰减策略(余弦退火衰减,多项式衰减),附TensorFlow完整代码
  5. LeetCode575
  6. 各类3D打印技术的制造工艺原理
  7. 智能工厂——实现智能制造的关键要素之一
  8. c语言strcat()/strcat_s()函数详解
  9. 在ICT圈子找非研发工作
  10. 百面机器学习(13)——生成式对抗网络