架构师面试(三十八):注册中心架构模式

题目

在微服务系统中,当服务达到一定数量时,通常需要引入【注册中心】组件,以方便服务发现。

大家有没有思考过,注册中心存在的最根本的原因是什么呢?注册中心在企业中的最佳实践是怎样的?注册中心的服务发现有两大模式,分别是:【客户端发现模式】和【服务端发现模式】,这两者之间有怎样的区别呢?

下面关于【注册中心】的描述中,说法正确的有哪几项?

A. 注册中心存在的本质原因是为了降低【服务提供方】和【服务消费方】之间的耦合性,避免两者循环依赖的问题;

B. 在大中型微服务系统中,【注册中心】通常需要和 “服务管理平台” 配合完成 服务的注册和订阅,而【注册中心】专注于 “服务节点的注册” 和 “服务节点的发现”;

C.【客户端发现模式】的注册中心相对直接,因为客户端知晓可用的服务实例,能针对特定应用实现智能负载均衡;Consul Template 是客户端发现模式的典型范例;

D.【服务端发现模式】的注册中心最大的优点是客户端无需关注服务发现的细节,减少了编程语言框架需要完成的服务发现逻辑;这种模式对部署环境的依赖较强,Netflix Eureka 是服务端发现模式的典型范例。

解析

一、先讨论注册中心存在的本质原因

举例,服务消费方 X 远程调用服务提供方 Y,如下图所示。我们说,服务 X 依赖于服务 Y;也就是说,服务 X 知道服务 Y 的存在性, 而服务 Y 不知道服务 X 的存在性。当服务 Y 集群扩容一个节点或缩容一个节点时,服务 Y 就需要把这种情况同步告之服务 X,也就是说,服务 Y 需要知道服务 X 的存在性。

图片

言外之意,从服务调用上来说,服务 X 依赖于服务 Y,但是从服务管理上来说,服务 Y 又需要依赖于服务 X。此时,服务消费方和服务提供方之间形成了一种循环依赖的局面。怎么解决这个问题呢?这就是【注册中心】这个组件存在的根本原因了,如下图所示。

图片

为了避免服务提供方 Y 对服务消费方 X 的依赖,服务 Y 只需把自己注册到【注册中心】即可,然后哪个服务对 Y 感兴趣,自己去【注册中心】发现和获取就好了,服务 Y 不用关注。因此:注册中心存在的本质原因是为了降低【服务提供方】和【服务消费方】之间的耦合性,避免两者之间循环依赖的问题。

二、再说注册中心在企业应用的一种最佳实践。

如下图所示,【服务管理平台】用于对服务集群信息(比如:服务名称、服务负责人、服务归属部门、服务吞吐量等)和服务订阅信息进行管理,侧重于对服务集群的管理;【注册中心】用于对服务节点的注册、健康检查、提供节点查询和变更通知等,侧重于对服务节点的管理。

图片

基本的服务流程如下:

  1. 服务负责人在对外发布服务时,需要首先在【服务管理平台】上对服务进行注册;

  2. 服务消费方服务的负责人,如果要调用其他服务,需要在【服务管理平台】上发起调用申请,即 “订阅服务”申请;该申请被审批通过后,方可生效,毕竟如果是高吞吐的调用,是需要服务提供方集群进行扩容的;

  3. 服务提供方服务集群中的每一个节点,在启动的时候,将自己注册到【注册中心】;并且每一个节点在宕机或假死时,注册中心都可以通过 “健康检查” 及时获取到;

  4. 服务消费方服务集群中的每一个节点,在启动的时候或启动之后,都可以到【注册中心】获取到已经订阅的服务提供方集群中还活跃的服务节点列表;如果服务提供方集群节点列表有任何变化,【注册中心】都可以及时将 “变更信息” 通知到服务消费方集群中的每一个节点;

  5. 最后,服务消费方集群中的每一个节点,向服务提供方集群中的每一个节点发起 【RPC】调用。

三、我们再讨论注册中心服务发现的两大模式:【客户端发现模式】和【服务端发现模式】。

【客户端发现模式】更为常见,如下图所示。服务提供方向注册中心进行注册,每一个服务消费方节点从注册中心获取服务提供方服务集群的节点列表,并且对请求实现负载均衡。

图片

【客户端发现模式】的注册中心相对直接一些,因为客户端知晓可用的服务实例,能针对特定应用实现智能负载均衡;这种模式的缺点就是客户端与服务注册绑定,要针对服务端用到的每个编程语言和框架,实现客户端的服务发现逻辑;Netflix Eureka  是客户端发现模式的典型范例。

【服务端发现模式】如下图所示,客户端直接将请求打在 服务端的 “负载均衡” 组件上,“负载均衡” 组件查询【注册中心】获取服务提供方节点列表,然后将请求转发到其中一个节点上。

图片

【服务端发现模式】最大的优点就是客户端无需关注服务发现的细节,只需要简单地直接向负载均衡器发送请求即可,这减少了编程语言框架需要完成的服务发现逻辑;不过,这种模式需要部署环境提供这样的 “负载均衡”组件方可,对部署环境的依赖较强;Consul Template 是服务端发现模式的典型范例。(关于Consul Template 我们会在后续进行详细分析!)

参考答案

AB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day.js和Moment.js对比,日期时间库怎么选?

在JavaScript的日期处理库中,Moment.js 和 Day.js 是两个非常流行的选择。本文将基于从npmtrends的数据,对这两个库进行详细的对比分析。 Moment.js的重度使用者。凡是遇到时间和日期的操作,就把Moment.js引用上。 直到有天我发现加载的mome…

罗默如何用木星卫星“宇宙钟表”测量光速?

一、17世纪的“宇宙级实验” 1676年,丹麦天文学家奥勒罗默(Ole Rmer)在巴黎天文台做出惊人发现: 木星卫星的“迟到早退”现象,竟能揭示光速的秘密! 通过观察木卫一(Io)的轨道周期变…

deepseek 技巧整理

1、导出word 和excel 功能,在使用以下提示词。 请帮我列出减肥期间可以吃的水果,并分析该水果含有的营养元素,以表格的形式星现。1.要以html的方式输出 2.要可以直接运行 3.页面要提供可以直接下载word和excel功能

思考软件框架

数据库是达梦数据库 假定里面有40张表,软件的业务逻辑比较复杂。 当然,依然是对数据库中数据的增,删,改,查,组合,显示。 但是也涉及到多种软件,多台设备之间的通信。 我们可以使用…

探索 Disruptor:高性能并发框架的奥秘

在当今的软件开发领域,处理高并发场景是一项极具挑战性的任务。传统的并发解决方案,如基于锁的队列,往往在高负载下表现出性能瓶颈。而 Disruptor 作为一个高性能的并发框架,凭借其独特的设计和先进的技术,在处理海量数…

前端面经-VUE3篇--vue3基础知识(一)插值表达式、ref、reactive

一、计算属性(computed) 计算属性(Computed Properties)是 Vue 中一种特殊的响应式数据,它能基于已有的响应式数据动态计算出新的数据。 计算属性有以下特性: 自动缓存:只有当它依赖的响应式数据发生变化时&#xff…

数据结构6 · BinaryTree二叉树模板

代码函数功能顺序如下: 1:destroy:递归删除树 2:copy:复制二叉树 3:preOrder:递归前序遍历 4:inOrder:递归中序遍历 5:postOrder:递归后续遍…

C++/SDL进阶游戏开发 —— 双人塔防游戏(代号:村庄保卫战 13)

🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 十…

强化学习之基于无模型的算法之时序差分法

2、时序差分法(TD) 核心思想 TD 方法通过 引导值估计来学习最优策略。它利用当前的估计值和下一个时间步的信息来更新价值函数, 这种方法被称为“引导”(bootstrapping)。而不需要像蒙特卡罗方法那样等待一个完整的 episode 结束才进行更新&…

AE/PR模板 100个现代文字标题动态排版效果动画 Motion Titles

Motion Titles是一个令人惊艳的AE/PR模板,提供了100个现代文字标题的动态排版效果动画。这些动画效果能够为你的项目增添视觉冲击力和专业感,为文字标题注入活力和动感。该模板适用于Adobe After Effects CC或更高版本以及Adobe Premiere Pro 2020或更高…

【AI提示词】二八法则专家

提示说明 精通二八法则(帕累托法则)的广泛应用,擅长将其应用于商业、管理、个人发展等领域,深入理解其在不同场景中的具体表现和实际意义。 提示词 # Role: 二八法则专家## Profile - language: 中文 - description: 精通二八法…

前端八股 CSS 1

盒子模型 进行布局时将所有元素表示为一个个盒子box padding margin border content content:盒子内容 待显示的文本和图像 padding:内边距,内容和border之间的空间,不能为负数,受bkc影响 border:边框&#xff0c…

组件通信-$attrs

概述:$attrs用于实现当前组件的父组件,向当前组件的子组件通信(爷→孙)。 具体说明:$attrs是一个对象,包含所有父组件传入的标签属性。 注意:$attrs会自动排除props中声明的属性(可以认为声明过…

jdk开启https详细步骤

要在 JDK 中启用 HTTPS,您可以按照以下详细步骤进行操作: 生成密钥库和证书: 首先,您需要生成一个密钥库(keystore)和证书,可以使用 keytool 工具来生成。以下是使用 keytool 生成密钥库和证书的…

文章四《深度学习核心概念与框架入门》

文章4:深度学习核心概念与框架入门——从大脑神经元到手写数字识别的奇幻之旅 引言:给大脑装个"GPU加速器"? 想象一下,你的大脑如果能像智能手机的GPU一样快速处理信息会怎样?这正是深度学习的终极目标&…

关于CSDN创作的常用模板内容

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 好文评论新文推送 📃文章前言 &…

linux的信号量初识

Linux下的信号量(Semaphore)深度解析 在多线程或多进程并发编程的领域中,确保对共享资源的安全访问和协调不同执行单元的同步至关重要。信号量(Semaphore)作为经典的同步原语之一,在 Linux 系统中扮演着核心角色。本文将深入探讨…

《Android 应用开发基础教程》——第十一章:Android 中的图片加载与缓存(Glide 使用详解)

目录 第十一章:Android 中的图片加载与缓存(Glide 使用详解) 🔹 11.1 Glide 简介 🔸 11.2 添加 Glide 依赖 🔸 11.3 基本用法 ✦ 加载网络图片到 ImageView: ✦ 加载本地资源 / 文件 / UR…

AE模板 300个故障干扰损坏字幕条标题动画视频转场预设

这个AE模板提供了300个故障干扰损坏字幕条标题动画视频转场预设,让您的视频具有炫酷的故障效果。无论是预告片、宣传片还是其他类型的视频,这个模板都能带给您令人惊叹的故障运动标题效果。该模板无需任何外置插件或脚本,只需一键点击即可应用…

在 Python 中,以双下划线开头和结尾的函数(如 `__str__`、`__sub__` 等)

在 Python 中,以双下划线开头和结尾的函数(如 __str__、__sub__ 等)被称为特殊方法(Special Methods)或魔术方法(Magic Methods)。它们确实是 Python 内置的,用于定义类的行为&#…