10分钟带你彻底搞懂注册中心

十分钟搞懂系列

序号标题链接
110分钟带你彻底搞懂企业服务总线https://blog.csdn.net/belongtocode/article/details/119487731
210分钟带你彻底搞懂微内核架构https://blog.csdn.net/belongtocode/article/details/119107837
310分钟带你彻底搞懂服务限流和服务降级https://blog.csdn.net/belongtocode/article/details/119107785
410分钟带你彻底搞懂负载均衡https://blog.csdn.net/belongtocode/article/details/118977839
510分钟带你彻底搞懂集群容错和服务隔离https://blog.csdn.net/belongtocode/article/details/118968771
610分钟带你彻底搞懂注册中心https://blog.csdn.net/belongtocode/article/details/118639474
710分钟带你彻底搞懂RPC架构https://blog.csdn.net/belongtocode/article/details/118639448

服务治理可以说是微服务系统中最为关键的一个设计要素,各个微服务都需要通过它来实现自动化的注册和发现。那么今天,我们就来聊聊实现服务治理的基本方法。

我们先来模拟一个业务场景,你感受一下。

假如我们要设计和开发一个分布式服务系统,对于一个完整的业务系统而言,服务在数量上通常都是具有一定规模的,而服务之间需要相互调用并形成复杂的访问链路。

那么这个时候,我们通常会面临以下两个挑战:

  • 如何管理服务实例的数量?
  • 如何管理服务实例的状态?

显然,如果一个系统中存在几十个、甚至上百个服务时,我们可能都无法明确系统中到底有哪些服务正在运行。而且由于自动扩容、服务重启等因素,服务实例的运行时状态也会经常变化。如下图所示:

img

所以,为了更好地描述服务的运行时状态,我们可以对每个服务实例信息进行抽象,并通过更加统一、形象的方式表达出来,如下所示:

img

不过,既然服务数量的增加以及服务实例的变化都不可避免,那么有什么好办法能够有效地管理这些服务实例呢?

这实际上就是一个服务治理的问题。一般来说,为了实现高效的服务治理,需要引入注册中心来管理服务的实例。

什么是注册中心?

注册中心是服务实例信息的存储仓库,也是服务提供者和服务消费者进行交互的桥梁。它主要提供了服务注册和服务发现这两大核心功能。

img

我们看这张服务注册流程图就知道,对于注册中心而言,服务的提供者和消费者都相当于是它的客户端,所以都内嵌了专门与注册中心实现交互的客户端组件。

针对服务的提供者而言,每当服务启动,就会通过这个注册中心的客户端组件,自动将自己注册到注册中心,这就是服务注册过程,有时候也叫服务发布过程。

而对于服务消费者来说,执行的是订阅操作而不是注册操作,也就是说它会对那些自己感兴趣的服务进行订阅,通过订阅操作就能从注册中心中,自动获取那些已经注册的服务提供者信息,这就是服务发现过程。

从图中我们还能发现服务消费者与提供者之间的一个明显差异点,也就是消费者持有一个本地缓存,保存着那些已经获取到的服务提供者的实例信息。

这个本地缓存有两方面的作用。一方面,服务消费者可以先通过查询本地缓存,来快速获取目标服务的实例信息,从而提高服务发现的效率;另一方面,如果注册中心出现不可用或者网络访问出现异常,那么消费者就无法从注册中心中获取服务实例信息,这时候基于本地缓存,也同样可以实现对已注册服务的正常调用。

注册信息变更通知机制

讲到这里,我们实际上就已经了解了 。通过获取注册中心中的服务实例信息,我们就可以掌握系统中服务的数量以及当前的运行时状态了。

但仍然有一个问题摆在我们面前,就是一旦服务的运行时状态发生了变更,我们又该如何有效获取这些变更信息呢?

这就需要在注册中心里进一步引入变更通知机制:

img

变更通知机制是实现注册中心的一大难点,因为这个过程涉及服务提供者、消费者和注册中心三者之间的数据同步问题,想要在分布式环境下实现数据同步是有挑战的。下面我就来给你介绍下两种主流的实现方法,一种是监听机制,一种是轮询机制。

监听机制

从架构设计来讲,状态变更管理可以采用注册中心本身具有的发布 - 订阅模式。

因此也就诞生了服务监听机制。它可以用来确保服务消费者能够实时监控服务的更新状态,是一种被动接收变更通知的实现方案,一般是采用监听器和回调机制。

img

我们看服务监听机制图,服务消费者可以对这些具体的服务实例节点添加监听器,当这些节点发生变化时,例如服务 B 的第一个实例变得不可用、服务 C 的第一个实例地址发生变更,或者是服务 D 新增了一个实例 3,那么注册中心就能触发监听器中的回调函数,确保更新通知到每一个服务消费者。

所以很显然,使用监听和通知机制具备实时的数据同步效果。

轮询机制

另一种确保状态信息同步的方式是采用轮询机制。这是一种主动拉取策略,即服务的消费者会定期调用注册中心提供的服务获取接口,以此获取最新的服务列表,并更新本地缓存。

img

其实轮询机制在实现上就是一个定时器,我们需要重点考虑的问题就是轮询的频率。

一方面,为了确保数据同步的时效性,轮询频率不能太短;但另一方面,考虑到轮询对注册中心的性能影响,也不能过于频繁地进行定时操作。一般来说,轮询频率控制在几十秒到几分钟之间是一种比较好的选择。

注册中心实现工具

现在,通过前面的分析,相信你已经对注册中心的实现原理有全面了解了。

其实,注册中心本质上是一种架构模型,在日常的开发过程中,为了避免重复造轮子,我们并不需要去实现这一模型,而是可以采用业界主流的一些注册中心实现工具。比较具有代表性的实现工具,包括 Consul 、Zookeeper、Eureka、Nacos 等。

其中,Consul 来自 HashiCorp 公司,它主要是用来提供分布式环境下的服务发现与配置功能;Zookeeper 是 Apache 的顶级项目,作为分布式协调领域的代表性框架,被广泛用于注册中心、配置中心、分布式锁等构建场景;Netflix 的 Eureka 则采用了一套完全不同的实现方案,被集成到微服务开发框架 Spring Cloud 中;而 Nacos 是由阿里巴巴开发的,它是面向云原生应用构建动态服务发现、配置和服务管理的平台。

可以说,这些工具各有特色,它们也都实现了注册中心的高可用性、服务实例存储以及同步功能,并提供了一组方便集成的客户端组件。另外我们也知道,注册中心主要的应用场景就是微服务系统,而目前最主流的微服务开发框架就是 Dubbo 和 Spring Cloud,它们分别使用了 Zookeeper 和 Eureka 作为默认的注册中心实现方案。

因此,接下来我们就重点探讨下这两款注册中心工具。

Zookeeper 是“服务监听机制”实现策略的典型代表性工具,它本质上是一个树形结构,可以在树上创建临时节点,并对节点添加监听器。

临时节点的客户端与该节点建立长连接,并会实时关注节点的状态,同时,客户端存在一个回调函数,当节点状态发生变化时,就会通过监听器将这种变化传递到客户端并触发回调函数。如下图所示:

img

而对于 Netflix Eureka 而言,它采用的就是典型的“轮询机制”来实现服务实例状态的同步,如下所示:

img

在 Eureka 中,客户端和服务器端之间通过发送心跳来实现“轮询机制”。Eureka 有一个租约的概念,也就是服务的提供者需要通过续约机制,来确保注册中心中的服务实例状态得到更新。而心跳的作用就是用来完成这种续约操作。

一般来说,这个心跳的频率是 30 秒,而如果某个服务连续 90 秒没有发心跳,Eureka 服务器就会认为该服务已经失效,注册中心就会更新它的状态信息。通过这种方式,就可以确保 Eureka 服务器中服务实例信息的正确性。

另外,服务的消费者也是通过轮询机制来获取服务提供者的实例信息,它默认的轮询频率同样也是 30 秒。

总结

以上就是这节课的全部内容。

在这节课中,你只需要记住注册中心就是一种服务治理工具,它可以管理系统中所有服务实例的运行时状态,并能够把这些状态的变化同步到各个服务中。你在开发分布式系统的过程当中,就可以通过引入注册中心,以轻松实现对大规模服务的高效治理。

最后,我想给你留一道思考题:在注册中心中,实现注册信息变更通知的方法有哪些,它们之间有什么区别?你可以在评论区留下你的答案,和我讨论。

参考文章:
整理于极客时间每日一课对应文章

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
BERT(Bidirectional Encoder Representation from Transformers)是一种在NLP领域中非常受欢迎的模型。它在2018年10月底由Google发布,并在11项NLP任务中表现出卓越的性能。\[1\] BERT的设计基于Transformer模型,它采用了双向编码器来学习上下文相关的词向量表示。与传统的词向量模型(如word2vec)相比,BERT能够更好地捕捉词语之间的语义关系和上下文信息。\[2\] BERT的训练过程包括两个阶段:Masked LM和下一句预测。在Masked LM阶段,BERT会随机遮盖输入文本中的一些词语,然后通过上下文来预测这些被遮盖的词语。在下一句预测阶段,BERT会判断两个句子是否是连续的。通过这两个任务的训练,BERT能够学习到更全面的语义表示。\[2\] BERT的优势在于它能够在各种NLP任务中进行迁移学习。通过将BERT的预训练模型与特定任务的训练数据进行微调,可以在下游任务中取得很好的性能。这种迁移学习的策略使得BERT成为了目前许多NLP任务的最优解决方案。\[2\] 总结来说,BERT是一种基于Transformer模型的双向编码器,通过预训练和微调的方式,在各种NLP任务中取得了卓越的表现。它的设计使得它能够更好地捕捉词语之间的语义关系和上下文信息,从而提高了NLP任务的性能。\[1\]\[2\] #### 引用[.reference_title] - *1* *3* [彻底搞懂Bert](https://blog.csdn.net/Enjoy_endless/article/details/89226190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [转:【NLP】彻底搞懂BERT](https://blog.csdn.net/joeland209/article/details/100189836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Apple_Web

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值