【微服务】------服务注册

在 微服务的基建工作 中提到过,在云原生、微服务时代,如果还是手动修改服务地址,是几乎不可完成的工作,需要一种机制完成自动上报和获取服务地址的支撑组件,可以保障服务的快速上线和下线,这就是服务注册/发现组件。

为了表述方便,从系统规模定义几个阶段:

  • 巨型应用架构时期:很多应用都是一个巨型服务,一个应用包含所有功能,部署在小型机和大型机上,或者直接部署在物理服务器上。

  • 单体架构时期:应用体量缩小,服务增多,而且出现虚拟化技术,物理服务器被连接成虚拟化平台,应用部署在虚拟机中。

  • SOA架构时期:应用通用功能逐渐沉淀,业务应用借助沉淀的通用组件逐渐解耦,微服务的很多组件也是从这个时期开始成型。

  • 微服务架构时期:这个时期承接模块化时期,甚至有一种说法是微服务只是SOA的一种特殊形式。系统进一步解耦,根据业务角色不同,应用以业务为分界,缩小为业务单元。

  • 函数架构时期:应用进一步分割为函数,实现serverless架构,不需要具体的服务器概念,只需要执行函数的服务即可。目前来看,这个时期是比较理想的时期,因为不同人相互协作定义的函数,可能重复或者冲突,不利于架构的演进。

随着大家对在微服务或者函数架构中趟坑,很多人开始提出回归单体应用架构,这应该也是架构螺旋进步的一种方式。

在微服务中,还有一种角色是根据调用关系定义的:

  • 客户端服务(简称客户端):调用其他服务的实例
  • 服务端服务(简称服务端):被其他服务实例调用的实例

微服务中客户端和服务端只对一个调用定义的,客户端在其他调用关系中,角色可能会转变为服务端。

服务注册表

说到服务发现时,必须要说一个重要组件:服务注册表,它是服务发现的核心,是一个包含了所有服务实例的网络位置和监控状态的数据库,通过服务注册组件将信息写入服务注册表,通过服务发现组件获取有效的服务实例的网络位置信息。目前常用的服务注册表有:Eureka、etcd、Consul、Zookeeper,Kibernetes等镜像调度服务没有明确的服务注册表组件,是通过内置的服务注册功能实现。对于比如F5和Nginx这种代理器,其中的upstream配置也属于服务注册表。

服务发现

在微服务架构中,服务之间通过轻量级协议互相调用,一般是HTTP请求,为了完成一次请求,服务需要知道目标服务实例的网络位置(IP和端口)。

在巨型应用架构时期,配置一个符合要求的服务器环境需要花费大量的时间,也就意味着服务地址发生变动的概率和频率都非常低,而且很多应用部署在一台小型机或者大型机上。到了单体架构时期,应用体量大数量少,发生地址变动所需要修改的地方就比较少,所以对于服务发现也就没有那么强的需求。换句话说,在单体架构之前,服务实例的相对位置固定,变动频率低,可以通过硬编码到代码中。

但是到了云时代,服务器环境配置变得简单,数量逐渐增多,扩展和迁移逐渐频繁。而且,随着虚拟化和容器的应用,服务器地址都是根据规则动态分配,由于服务升级、扩展、失败回滚等情况增多,服务的网络位置甚至不可预知。这个时候必须使用服务发现机制保证客户端服务能够自动获取服务端服务的地址。

通常,服务发现有两种模式:客户端发现模式、服务端发现模式。

客户端发现模式

客户端发现模式通过客户端组件根据负载均衡算法决定相应服务实例的网络位置,也就是说,客户端组件保存有服务端所有实例的服务注册表,调用发生时,根据负载均衡算法,从服务注册表中选择一个网络位置,向服务端发起请求,完成调用。由于网络的不可靠性,有的客户端组件还会实现访问失败重试、访问超时时间设定等功能。

这种模式的架构如图:

具体的过程为:

  1. 服务实例向服务注册器上报网络位置,即注册

  2. 客户端服务发现组件定时拉取服务注册器中服务实例的网络位置信息及健康状态,保存在服务注册表中

  3. 客户端服务调用服务端服务时,通过客户端服务发现组件,根据负载均衡算法,选取可用一个服务实例,发起调用

在Spring Cloud(或者说是Netflix开源组件)中,组件Eureka Server组件相当于服务注册器,Eureka Client组件实现了服务注册表,Ribbon实现了负载均衡算法和重试策略。

客户端发现模式优缺点兼备。优点是对已有服务友好,除了客户端组件外,其他部分无需改动。而且,客户端存有所有服务实例信息,可以有针对性的定义负载均衡算法。缺点是客户端与服务注册器绑定,需要针对每种语言实现不同的客户端组件。

服务端发现模式

服务端发现模式是有一个单独的服务发现组件,这个实例持有服务注册表,同时也起到负载均衡器的作用,客户端调用服务端时,直接调用服务发现实例,通过服务实例代理到后端服务实例中,所以服务端发现模式也被称为代理模式

这种模式的架构如图:

具体的过程为:

  1. 服务实例向服务注册器上报网络位置,即注册

  2. 服务发现实例定时通过某种机制获取服务注册器中服务实例的网络位置信息及健康状态,保存在服务注册表中

  3. 客户端服务调用服务端服务时,直接调用服务发现实例,服务发现实例根据内部实现,查询服务注册表,将请求代理到后端服务实例

服务端发现模式中的服务发现组件有两种实现方式:

  • 第一种,集中式代理,服务发现组件是单独的服务实例,这个实例是高可用高吞吐的系统组件,代理后端服务实例,代表性的是F5和Nginx。
  • 第二种,主机进程代理,服务发现组件由系统环境提供,集成在主机上或者集成在操作系统中,代表性的是Istio ServiceMesh。

两种实现方式的优点是语言无关,客户端不需要关心任何服务发现的细节,只需要将原有的调用实例的请求修改为向服务发现实例发送请求。集中式代理的缺点是,存在单点问题,需要单独部署一个高可用、高吞吐的系统服务,由原来的一次调用增加为两次调用,有性能开销。主机进程代理的缺点是运维复杂,需要能力强的运维团队做支持。

服务注册

服务注册是将服务实例的网络信息和健康状态写入服务注册表中,有两种方式:自注册模式、第三方注册模式。

自注册模式

这种模式是服务实例主动向服务注册表上报网络位置和健康状态,有的实现中,服务实例还会通过心跳保障注册信息不会过期。

Eureka就是采用的这种方式,服务实例通过Eureka Client组件主动上报自己的网络位置信息和健康状态。

这种模式实现相对简单,但是把服务实例和服务注册表耦合,优缺点明显。

第三方注册模式

第三方注册模式是服务实例不需要直接向服务注册表注册信息,而是借助被称为注册器的组件进行注册。服务注册器是通过扫描部署环境或者订阅事件的方式,跟踪服务实例的变更。当监测到服务实例有变化,会向服务注册表上报变化信息。

这种方式可以将服务实例与服务注册表解耦,同时也引入另外的问题。即注册器需要内置在部署环境中,增加了运维复杂性。或者注册器需要部署一个集中式的管理组件,成为系统约束点。

未完待续

在微服务中,服务实例的运行环境会动态变化,实例网络位置也是如此,因此,客户端为了访问服务必须要使用服务发现机制。

服务发现有客户端发现模式和服务端发现模式,服务注册有自注册模式和第三方注册模式。服务发现和服务注册通过服务注册表链接在一起。

后面有时间,会再补充目前比较常用的服务发现、服务注册的相关组件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Netty学习——高级篇2 Netty解码技术 备份

接上篇:Netty学习——高级篇1 拆包 、粘包与编解码技术,本章继续介绍Netty的其他解码器 1 DelimiterBasedFrameDecoder分隔符解码器 DelimiterBasedFrameDecoder 分隔符解码器是按照指定分隔符进行解码的解码器,通过分隔符可以将二进制流拆分…

蓝桥2021A组B题

直线 问题描述格式输入格式输出评测用例规模与约定解析参考程序难度等级 问题描述 格式输入 无 格式输出 填空题提交答案即可 评测用例规模与约定 无 解析 题目要求点和点确定一条直线,如果没有多个点在同一条直线只能算一条直线这个条件就很简单。一共21*20个…

【PDF-XSS攻击】Java项目-上传文件-解决PDF文件XSS攻击

文章目录 背景解决pdfbox依赖控制器代码PdfUtils工具类 验证最后源码参考 背景 上传xss-pdf造成存储型xss因为在浏览器直接预览的PDF,而不是预览,所以安全部门认为会有XSS漏洞 解决 安全部门修复建议 1、根据白名单的标签和属性对数据进行过滤&#…

Day1 省选衔接题 思路总结

Day1 省选题 思路 取数 可反悔的贪心。我们开一个双向链表记录此时每个数的前/后一个数是什么。一个简单但不一定正确的贪心策略即为:每次都取走当前值最大的且可取的数,并更新列表。考虑如何使这个贪心思路正确。 设 p r e x pre_x prex​ 表示 x x …

OpenHarmony应用开发引入开源C/C++库---之Har包里的NDK

Har 包 HAR(Harmony Archive)是静态共享包,可以包含代码、C 库、资源和配置文件。通过 HAR 可以实现多个模块或多个工程共享 ArkUI 组件、资源等相关代码。HAR 不同于 HAP,不能独立安装运行在设备上,只能作为应用模块…

HTML基础(3)

1、内联框架 iframe用于在网页内显示网页&#xff0c;语法如下&#xff1a; <iframe src"URL"></iframe> URL指向隔离页面 hight&#xff0c;weight设置高宽&#xff0c;删除边框将frameborder设置为0 <td> <iframe frameborder"0&qu…

用C代码实现环形缓冲区(ring buf)

用C代码实现环形缓冲区&#xff08;ring buf&#xff09; 概述环境介绍launch.json(没改&#xff09;tasks.json注意 代码ringbuf.cringbuf.hmain.c 测试说明工程代码下载 概述 因嵌入式项目需要&#xff0c;串口接收的数据有很高的周期性发送频率&#xff0c;原方式通过查询接…

VideoGPT:Video Generation using VQ-VAE and Transformers

1.introduction 对于视频展示&#xff0c;选择哪种模型比较好&#xff1f;基于似然->transformers自回归。在没有空间和时间溶于的降维潜在空间中进行自回归建模是否优于在所有空间和时间像素级别上的建模&#xff1f;选择前者&#xff1a;自然图像和视频包括了大量的空间和…

java程序生成exe文件启动时,在没有java环境计算机运行

1.idea项目配置工件 2. 开始构建java程序成jar包 3. 生成exe启动程序 注&#xff1a;下面的输入框中写错了&#xff0c;应该是.\jre才对 4. 在已经选择的生成exe存放文件夹找到已经生成exe启动程序

一文详解静态图和动态图中的自动求导机制

01 静态图与动态图的区别 之前在[1]中提到过&#xff0c;自动求导&#xff08;AutoDiff&#xff09;机制是当前深度学习模型训练采用的主要方法&#xff0c;而在静态图和动态图中对于自动求导的处理是不一样的。作为前置知识&#xff0c;这里简单进行介绍。 我们都知道静态图…

Vue.js------vue基础

1. 能够了解更新监测, key作用, 虚拟DOM, diff算法2. 能够掌握设置动态样式3. 能够掌握过滤器, 计算属性, 侦听器4. 能够完成品牌管理案例 一.Vue基础_更新监测和key 1.v-for更新监测 目标&#xff1a;目标结构变化, 触发v-for的更新 情况1: 数组翻转情况2: 数组截取情况3…

QT:信号与槽

作业&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…

Platforms Jumping(贪心,处理策略)

文章目录 题目描述输入格式输出格式样例输入1样例输出1样例输入2样例输出2样例输入3样例输出3提交链接提示 解析参考代码 题目描述 有一条宽度为 n n n 的河流。河的左岸是 0 0 0 单元格&#xff0c;右岸是 n 1 n1 n1 单元格(更正式地说&#xff0c;这条河可以表示为一串从…

MySQL基础练习题:习题2-3

这部分主要是为了帮助大家回忆回忆MySQL的基本语法&#xff0c;数据库来自于MySQL的官方简化版&#xff0c;题目也是网上非常流行的35题。这些基础习题基本可以涵盖面试中需要现场写SQL的问题。上期帮助大家建立数据库&#xff0c;导入数据&#xff0c;接下来让我们继续练习。 …

代码随想录35期Day08-字符串

344.反转字符串 位运算 func reverseString(s []byte) {l : 0r : len(s) - 1for l < r {s[l] ^ s[r]s[r] ^ s[l]s[l] ^ s[r]lr--} }541. 反转字符串II 没技巧 func reverseStringRange(s []byte, l int, r int) {if r > len(s) {r len(s) - 1}for l < r {s[l] ^…

c++的学习之路:22、多态(1)

摘要 本章主要是说一些多态的开头。 目录 摘要 一、多态的概念 二、多态的定义及实现 2.1、多态的构成条件 2.2、虚函数 2.3、虚函数的重写 2.4、C11 override 和 final 2.5、重载、覆盖(重写)、隐藏(重定义)的对比 三、思维导图 一、多态的概念 多态的概念&#…

Harmony鸿蒙南向驱动开发-Regulator

Regulator模块用于控制系统中各类设备的电压/电流供应。在嵌入式系统&#xff08;尤其是手机&#xff09;中&#xff0c;控制耗电量很重要&#xff0c;直接影响到电池的续航时间。所以&#xff0c;如果系统中某一个模块暂时不需要使用&#xff0c;就可以通过Regulator关闭其电源…

Vue3---基础2(component)

主要讲解 component 的创建 以及vue插件的安装 Vue.js Devtools 为谷歌浏览器的Vue插件&#xff0c;可以在调试工具内查看组件的数据等 下载 有两种下载方式 1. 谷歌应用商店 打开Chrome应用商店去下载&#xff0c;这个方法需要魔法 2. 极简插件 极简插件官网_Chrome插件下载_…

【图论】详解链式前向星存图法+遍历法

细说链式前向星存图法 首先要明白&#xff0c;链式前向星的原理是利用存边来进行模拟图。 推荐左神的视频–建图、链式前向星、拓扑排序 比方说有这样一张图&#xff0c;我们用链式前向星来进行模拟时&#xff0c;可以将每一条边都进行编号&#xff0c;其中&#xff0c;红色的…

SQL注入sqli_labs靶场第五、六题

第五题 根据报错信息&#xff0c;判断为单引号注入 没有发现回显点 方法&#xff1a;布尔盲注&#xff08;太耗时&#xff0c;不推荐使用&#xff09; 1&#xff09;猜解数据库名字&#xff1a;&#xff08;所有ASCII码值范围&#xff1a;0~127&#xff09; ?id1 and length…