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

您所在的位置:网站首页 审计业务服务中心是什么 10分钟带你彻底搞懂注册中心

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

2024-07-13 05:51| 来源: 网络整理| 查看: 265

文章目录 十分钟搞懂系列什么是注册中心?注册信息变更通知机制监听机制轮询机制 注册中心实现工具总结

十分钟搞懂系列 序号标题链接110分钟带你彻底搞懂企业服务总线https://blog.csdn.net/belongtocode/article/details/119487731210分钟带你彻底搞懂微内核架构https://blog.csdn.net/belongtocode/article/details/119107837310分钟带你彻底搞懂服务限流和服务降级https://blog.csdn.net/belongtocode/article/details/119107785410分钟带你彻底搞懂负载均衡https://blog.csdn.net/belongtocode/article/details/118977839510分钟带你彻底搞懂集群容错和服务隔离https://blog.csdn.net/belongtocode/article/details/118968771610分钟带你彻底搞懂注册中心https://blog.csdn.net/belongtocode/article/details/118639474710分钟带你彻底搞懂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 秒。

总结

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

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3