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

news/2024/5/18 20:20:24/文章来源:https://blog.csdn.net/xiaoli8748/article/details/137564415

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

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

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

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

  • 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组件主动上报自己的网络位置信息和健康状态。

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

第三方注册模式

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

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

未完待续

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

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

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

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

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

相关文章

vue vue3 手写 动态加载组件

效果展示 一、需求背景: # vue3 项目涉及很多图表加载、表格加载 #考虑手写一个动态加载组件 二、实现思路 通过一个加载状态变量,通过v-if判断,加载状态的变量等于哪一个,动态加载组件内部就显示的哪一块组件。 三、实现效果…

酷开科技 |酷开系统全视频化升级,让电视回归视频属性

随着消费升级浪潮的兴起,家庭互联网这一概念也在资本的注入下,成为了新风口。酷开系统全视频化升级,让电视回归视频属性,酷开系统在之前瀑布流板块设计的基础上,增加了视频流图文融合的并行界面,同时酷开系…

AWS入门实践-利用S3构建一个静态网站

使用Amazon S3托管静态网站是一个流行的选择,因为它简单、成本效益高,并且易于维护。静态网站由不含服务器端脚本的文件组成,如HTML、CSS和JavaScript文件。下面是使用S3托管静态网站的操作步骤: 如果大家没有AWS免费账号&#x…

外包干了15天,技术倒退明显

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能…

ITK 重采样 resample

Itk 重新采样有二多种情况&#xff0c;这里说二种情况 1. 输入参数 &#xff0c;和输出相关数据&#xff0c;输出范围&#xff0c;spacing &#xff1b; typedef itk::Image< float, 3 > itkFloatImageType;typedef itk::ResampleImageFilter < itkFloatImageType, i…

数字化智慧养老:引领老年人融入科技时代新生活

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 人类社会已经步入了一个全新的数字时代。在这个时代&#xff0c;互联网、大数据、人工智…

搭建前后端的链接(java)

搭建前后端的链接(java) 一.前提 1.1 javaEE 搭建前后端的链接首先需要用到javaEE&#xff0c;也就是java企业版&#xff0c;也就是java后端(后端javaSE) 利用javaEE和前端交互&#xff0c;javaSE和数据库交互&#xff0c;javaSE和javaEE之间再进行交互就实现了前后端的交互…

“卷生卷死”的消费电子ODM,如何用数据建设缩短交期?奇点云供应链控制塔实践

消费电子制造是一个充分竞争的行业。 哪怕对于已位居全球龙头的ODM厂商&#xff08;原始设计制造商&#xff09;而言&#xff0c;在既卷质量又卷价格还卷创新的市场始终保持领先&#xff0c;也从不简单。 以本文分享的企业为例&#xff0c;企业A是领先的智能硬件ODM厂商&…

scRAN-seq|加权最近邻分析(2)

概述 本文[1]介绍了Seurat 5.0.0中的加权最近邻&#xff08;WNN&#xff09;分析方法&#xff0c;这是一种用于整合和分析多模态单细胞数据的无监督框架。 简介 多模态分析作为单细胞基因组学的一个新兴领域&#xff0c;它通过同时测量多种数据类型来精确描绘细胞状态&#xff…

掼蛋的六讲原则

第一讲&#xff1a;与同事玩掼蛋&#xff0c;讲娱乐 同事可以说是现在的人们见得最多的一批人&#xff0c;所以与同事打好关系是十分有必要的&#xff0c;所以在和同事玩掼蛋的时候&#xff0c;我们主要讲究的是娱乐精神&#xff0c;大家一起开开心心玩&#xff0c;工作也能变得…

Docker快速上手及常用命令速查

Docker快速上手 安装 在ubuntu上安装docker: sudo apt-get install docker docker -v #查看版本在centos7上安装docker&#xff1a;(docker在YUM源的Extras仓库中) yum install docker systemctl start dockerdocker常用命令速查 #查看docker信息 docker info #查看本地镜…

SpringBoot及其特性

0.前言 Spring 框架提供了很多现成的功能。那么什么是 Spring Boot&#xff1f;使用 Spring 框架&#xff0c;我们可以避免编写基础框架并快速开发应用程序。为了让 Spring 框架提供基础框架&#xff0c;我们需要向 Spring 框架描述有关我们的应用程序及其组件的信息。 不只是…

面试记录(三)

面了57min&#xff0c;实在问麻了&#xff0c;下面的问题就没有按顺序记录了&#xff1a; 1.linux熟悉吗&#xff1a;熟悉基础的环境变量、目录等用法&#xff0c;问如何查找一个文件&#xff08;不会&#xff0c;又追问如何设计一个c的程序去查找&#xff1a;先找文件类型&am…

java基础语法(12)| 异常

1. 异常 1.1 什么是异常 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。 在Java等面向对象的编程语言中&#xff0c;异常本身是一个类&#xff0c;产生异常就是创建异常对象或抛出了一个异常对象。Java处理异…

万界星空科技生产工时管理系统

生产工时管理系统是一个管理系统&#xff0c;生产管理人员可以详细地、逐项活动地查看生产和即时劳动力数据&#xff0c;特别是活动级劳动力信息&#xff0c;辅助生产管理人员利用从车间获得的效率数据&#xff0c;实时监控生产流程&#xff0c;并在提高生产率&#xff0c;控制…

C++的并发世界(十一)——线程池

0.线程池的概念 1.线程池使用步骤 ①初始化线程池&#xff1a;确定线程数量&#xff0c;并做好互斥访问&#xff1b; ②启动所有线程 ③准备好任务处理基类&#xff1b; ④获取任务接口&#xff1a;通过条件变量阻塞等待任务 2.atomic原子操作 std:atomic是C11标准库中的一个…

ics-05-攻防世界

题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…

Vue2电商前台项目(三):完成Search搜索模块业务

目录 一、请求数据并展示 1.写Search模块的接口 2.写Vuex中的search仓库&#xff08;三连环&#xff09; 3.组件拿到search仓库的数据 用getters简化仓库中的数据 4.渲染商品数据到页面 5.search模块根据不同的参数获取数据展示 &#xff08;1&#xff09;把派发actions…

HTML5.Canvas简介

1. Canvas.getContext getContext(“2d”)是Canvas元素的方法&#xff0c;用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中&#xff0c;首先通过getElementById方法获取id为"myCanvas"的Canvas元素&#xff0c;然后使用getContext(“2d”)方法获取该Ca…

MySQL学习笔记(数据类型, DDL, DML, DQL, DCL)

Learning note 1、前言2、数据类型2.1、数值类型2.2、字符串类型2.3、日期类型 3、DDL总览数据库/表切换数据库查看表内容创建数据库/表删除数据库/表添加字段删除字段表的重命名修改字段名&#xff08;以及对应的数据类型&#xff09; 4、DML往字段里写入具体内容修改字段内容…