微服务·架构组件之注册与发现

news2024/11/23 2:48:21

引言

微服务架构在现代软件开发中越来越受欢迎,它通过将系统拆分为多个小型、自治的服务来提高可维护性、可扩展性和灵活性。然而随着服务数量的增多,服务之间的通信何发现变得更加复杂。本报告旨在深入探讨微服务中的注册与发现,介绍其背景、核心概念、实现技术以及应用实例。

背景与概念

在微服架构中,服务通常是独立部署的,它们可能会在分布式环境中的不同主机上运行。服务之间需要相互通信,但由于服务的数量和位置的变化,需要一种机制来自动识别和定位服务。这就是服务注册与发现的作用。

服务注册

服务注册是将服务的元数据(如服务的名称、地址、端口等)注册到一个中心化的注册中心或服务注册表中。注册中心充当服务的目录,存储所有可用的服务信息

服务发现

服务发现是指客户端应用程序通过查询注册中心来查询需要调用的服务的位置,客户端不需要硬编码服务的位置,而是通过机制来获取。

实现技术

常用的服务注册中心组件有Consul、Eureka、etcd、Zookeeper、Nacos。接下来会对这些组件进行详细的分析。

数据模型

注册中心的核心数据是服务名称和它对应的网络地址。当服务注册了多个实例时,我们需要对不健康的实例进行过滤或者针对实例的一些特征进行流量的分配,那么需要在实例上存储一些例如健康状态、权重等属性。随着服务规模的扩大,又需要在整个服务级别设定一些权限规则,以及对所有实例都生效的一些开关,于是在服务级别又会设立一些属性。再往后,发现单个服务的实例又会划分为多个子集的需求,例如一个服务是多机房部署的,那么可能需要对每个机房做不同的配置这样又需要在服务和实例之间再设定一个数据级别。

另外需要考虑的是数据的隔离模型,作为一个共享服务的组件,需要能够在多个用户或者业务方使用的情况下,保证数据的隔离和安全。

注册中心数据模型隔离模型
Nacos服务-集群-实例三层模型四层逻辑隔离模型
Zookeeperk-v
Eureka/Consul实例模型

服务的分级模型:

在这里插入图片描述

服务的逻辑隔离模型:

在这里插入图片描述

数据一致性

数据一致性可以归为两类,一种是基于Leader的非对称部署的单点写一致性,一种是对称部署的多写一致性。

注册中心一致性协议特点
Nacos简化的Raft(CP),Distro(AP)具备机房容灾,集群扩展能力
ZookeeperZAB保证数据的强一致性,缺乏机房容灾,无法适应大型场景
EurekaRenew

负载均衡

负载均衡严格的说并不算传统注册中心的功能。一般来说服务发现的完成流程应该是先从注册中心获得服务的实例列表,然后根据自身的需求来选择其中的部分实例或者按照一定的流量分配机制来访问不同的服务提供者,因此注册中心本身一般不限定服务消费者的访问策略。Eureka、Zookeeper包括Consul本身都没有去实现可配置及可扩展的负载均衡机制,Eureka的负载均衡是由Ribbon来完成的,而Consul则是由Fabio做负载均衡。

服务消费者往往不关心所访问的服务提供者的负载均衡,它们只关心以最高效和正确的访问服务提供者的服务。而服务提供者,则非常关心自身被访问的流量的调配。因此服务提供者需要能够完全掌握服务的流量调配,并可以动态调整。目前的负载均衡由基于权重、服务提供者负载、响应时间、标签等策略。

  • Ribbon(客户端负载均衡),主要是选择合适现有的IRule,ServerListFilter等接口,或自己继承这些接口,实现自己的过滤逻辑
    • RoundRobinRule,轮询,Ribbon的默认负载均衡策略
    • RandomRule,随机
    • RetryRule,先按照轮询的策略获取服务,如果获取服务失败则在指定时间内进行重试,获得可用的服务
    • WeightResponseTimeRule,对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
    • BestAvailableRule,先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
    • AvailablityFilteringRure,先过滤掉故障实例,在选择并发量较小的实例
    • ZoneAvoidanceRule,默认规则,复合判断server所在区域的性能和servier的可用性选择服务器
  • Nacos(服务端负载均衡),除了提供基于健康检查和权重的负载均衡方式外,还提供了基于第三方CMDB的标签负载均衡器
注册中心负载均衡
Nacosnacos
Zookeeper
Eurekaribbon

健康检查

Zookeeper和Eureka都是实现一种TTL机制,就是如果客户端在一定时间内没有向注册中心发送心跳,则会将这个客户端摘除。Eureka允许在注册服务的时候自定义检查自身状态的健康检查方法。在Dubbo和SpringCloud这两大体系内,也是使用TTL作为默认健康检查机制。Nacos目前支持临时实例使用心跳上报方式维持活性,发送心跳的周期默认是5s,Nacos服务端会在15s没有收到心跳将实例设置为不健康,在30s没有收到心跳时将这个临时实例摘除。

客户端健康检查和服务端健康检查有一些不同的关注点。客户端健康检查只要关心客户端上报心跳的方式,服务端摘除不健康客户端的机制。而服务端健康检查,则关注探测客户端的方式、灵敏度及设置客户端健康状态的机制。Nacos既支持客户端健康检查,也支持服务端健康检查

性能与容量

影响读写性能的因素有很多,一致性协议、机器的配置、集群的规模、存量数据的规模、数据结构以及读写逻辑的设计等。但是并不是性能越高越好,因为追求性能往往需要在其他方面做出牺牲。Zookeeper在写性能上可以达到上万的TPS,但是写逻辑是通过k-v进行的,内部没有聚合,其次Zookeeper舍弃了服务发现的基本功能,如健康检查、友好的查询接口等,最后Paxos协议本身就限制了Zookeeper的集群规模。

注册中心容量
Nacos10W+
Zookeeper百万级
Eureka5000左右

易用性

Zookeeper的易用性比较差,客户端使用比较复杂,没有针对服务发现的模型设计以及响应的API封装,对多语言的支持也不太好,同时也没有比较好用的控制台进行运维管理。

Eureka和Nacos有针对服务注册与发现的客户端,基于springCloud体系的starter,帮助用户以非常低的成本无感知的做到服务注册与发现。同时还暴露标准的HTTP接口,支持多语言和跨平台访问。

集群扩展性

Zookeeper使用的ZAB协议,由于是单点写,在集群扩展上不具备优势。Eurake在协议上说理论可以扩展到很大的规模,因为都是点对点的数据同步,但是性能有很大的问题。

集群扩展性的另一方面是多地域部署和容灾支持。当讲究集群的高可用和稳定性以及网络上的跨地域延迟要求能够在每个地域都部署集群的时候,我们现有的方案有多机房容灾、异地多活、多数据中心等。

多机房容灾问题,基于Leader写的协议是无法支持的,意味着Zookeeper不能在没有人工干预的情况下做到多机房容灾。Eurake的部署模式天然支持多机房容灾,因为Eurake采用的是纯临时实例的注册模式:不持久化、所有数据同通过客户端心跳上报补偿。Nacos支持两种模式的部署,一种是AP协议的部署,可以完美替代当前的Zookeeper、Eurake并支持多机房容灾。另一种是CP模式,不支持多机房容灾。

小结

注册中心数据结构数据一致性负载均衡健康检查容量易用性集群扩展性
Nacos三层(Service-Cluster-instance)Raft, DistronacosTTL10W+推荐支持多机房容灾
Eurake单层(instance)RenewRibbonTTL5000左右推荐支持多机房容灾
Zookeeperk-v结构ZAB-TTL100W不推荐不支持多机房容灾

应用案例

  • Hadoop生态系统使用Zookeeper管理各个组件的状态和位置,实现高可用、故障转移等功能。
  • Nerfix的微服务架构中使用Euraka作为服务注册与发现以及故障转移和负载均衡等功能
  • Nacos作为微服务架构中主流的服务注册与发现中心被广泛使用。

总结和展望

服务注册与发现是微服务架构中的关键组成部分,它为分布式系统提供了自动化的服务管理和通信机制。不同的实现技术适用于不同的场景,开发者可以根据需求选择合适的工具。随着微服务架构的发展,服务注册与发现的技术也在不断演进,未来将更加强调性能、安全性和多云支持等方面的创新。

参考文献

Netflix Eureka Documentation: https://github.com/Netflix/eureka
Apache ZooKeeper Documentation: https://zookeeper.apache.org/doc/r3.7.0/
Nacos架构&原理https://developer.aliyun.com/ebook/36?spm=a2c6h.20345107.ebook-index.18.152c2984fsi5ST

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

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

相关文章

使用rem + sass + 媒体查询 进行横竖屏适配移动端项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、 媒体查询(Media Query)1.简单了解2.简单例子3. 语法(1)媒体类型(mediatype )&#xff0…

【黑科技】游戏开发程序员必备工具【一】

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:效率…

MongoDB实验——在Java应用程序中操作 MongoDB 数据

在Java应用程序中操作 MongoDB 数据 1. 启动MongoDB Shell 2. 切换到admin数据库,使用root账户 3.开启Eclipse,创建Java Project项目,命名为MongoJava File --> New --> Java Project 4.在MongoJava项目下新建包,包名为mo…

【SpringBoot系列】 测试框架之@SpringBootTest的使用

SpringBootTest的详细介绍 SpringBootTest 是 Spring Boot 测试框架中的注解,用于标识一个测试类,以指示该类是一个 Spring Boot 应用程序的测试类。它允许你在测试环境中加载整个 Spring Boot 应用程序上下文,测试应用程序的各种组件、服务…

如何备考 PMP 考试?

一、PMP学习7步走攻略 ​1、熟悉考试大纲: PMP考试大纲是备考的基础,考生需要详细熟悉考试大纲,了解各个知识领域的重点和难点。 2、制定学习计划: 根据考试大纲和个人情况,制定学习计划,合理分配学习时间…

OA项目之我的会议(查询会议排座送审)

目录 会议查询 会议排座 会议送审 思路: 关键性会议SQL的编写后台实现前台实现 会议查询 MeetingInfoDao.java // 通用的会议查询SQL语句,包含会议信息表数据,主持人姓名、审批人姓名、会议状态private String getSQL() {return "…

android:新建工程文件介绍

一、前言当我们新建一个app时会呈现出固定的工程文件,这篇文章介绍新建工程里的文件。 二、介绍 Structure:就是你选择哪个页面就会显示那个页面的结构,就比如说我选择的是MainActivity他就会显示这个页面所使用的方法。 1-2:是android自动生…

【ESP32】解决接串口助手时,无法启动问题

本文主要记录ESP32正常烧录程序后,接上串口助手就无法启动,报错 waiting for download,拔掉串口助手后,程序可以正常启动 📋 个人简介 💖 作者简介:大家好,我是喜欢记录零碎知识点的…

小程序隐私保护授权处理方式之弹窗组件

欢迎点击关注-前端面试进阶指南:前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的🪜 小程序隐私保护授权弹窗组件 调用wx.getUserProfile进行授权时,返回错误信息:{errMsg: “getUserProfile:fail api scope is…

nvm和volta对node版本控制的区别

前言——我们做前端开发的都会需要node.js环境,我们直接安装指定的版本可以么?可以,只不过在需要换版本的时候还得卸载重新装。那有工具可以帮助我们不用卸载就更改node版本么?有啊,nvm就可以。那又有没有什么工具不用…

高忆管理:沪指震荡微涨,半导体板块走强,卫星导航概念拉升

30日早盘,A股两市维持震动格式。到午间收盘,沪指涨0.06%报3137.72点,深成指涨0.33%,创业板指涨0.12%,两市合计成交6424亿元。北向资金净流出8.82亿元。盘面上,半导体、纺织机械、元器件、通信设备、软件服务…

1.网络空间搜素引擎

网络空间搜素引擎 地址 :shodan.io 简介 : 这句话还是有点东西得 。 区别: 平常得搜素引擎主要搜网页,shadan可以搜所以带有ip地址的设备。使用 : 1.提供官方api 2.可以去淘宝15元买个初级会员 3.过滤器查看官方…

C# Dapper 操作Oracle数据库

nuget安装内容 1.配置连接字符串 OracleConnectionString这个可用 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","…

多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比

多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比 目录 多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实现GRU-Adaboost和GRU多变量时间序列预测对比 模型描述 M…

基于Googlenet深度学习网络的螺丝瑕疵检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ....................................................................................% 获…

python爬虫关于ip代理池的获取和随机生成

前言 在进行爬虫开发时,代理IP池是一个非常重要的概念。代理IP池是指一个包含多个可用代理IP的集合,这些代理IP可以用来绕过网站的防爬虫策略,从而提高爬取数据的成功率。 在本文中,我们将介绍如何获取代理IP池,并且随…

统一使用某一个包管理工具,比如yarn pnpm

原因:前端每个人的习性不一样,有人用npm 有人用yarn等包管理工具,混合下载插件容易出bug,就用个小工具锁住就行了,只能使用yarn或者pnpm反向下载依赖和下载插件。不然就报错 1.在项目主目录下创建preinstall.js // 如…

直播预告!生鲜与零售商品识别系统产业实践与部署详解

生鲜零售作为民生消费的重要一环,在促进行业新消费升级的进程中有着至关重要的作用。在超市等无人零售场景中,目前结算方式主要有以下几种: 但是以上几种方法存在如下缺点: 条形码方式:对于成品包装的商品较为成熟&…

MindSponge分子动力学模拟——软件架构(2023.08)

技术背景 在前面一篇文章中,我们介绍了MindSponge的两种不同的安装与使用方法,让大家能够上手使用。这篇文章主要讲解MindSponge的软件架构,并且协同mindscience仓库讲解一下二者的区别。 整体架构 首先我们来了解一下MindSponge独立仓库的软…

day28 异常

to{}catch{} try{}catch{}的流传输 try {fis new FileInputStream("file-APP\\fos.txt");fos new FileOutputStream("fos.txt");int a ;while ((a fis.read())! -1){fos.write(a);}System.out.println(a); } catch (IOException e) {e.printStackTrace()…