微服务-注册中心

一. 分布式系统架构与微服务

分布式系统架构和微服务是现代软件开发中常见的两种概念,它们通常结合使用来构建灵活、可扩展和高效的应用程序。

分布式系统架构:
分布式系统架构是指将一个单一的应用程序或服务拆分成多个独立的部分,这些部分可以在不同的计算机、服务器或者地理位置上运行,并通过网络进行通信和协作。分布式系统的设计旨在提高系统的可靠性、可用性和扩展性,同时减少单点故障的影响。

分布式系统架构主要特点:
分解性: 将整体系统分解成多个相互独立的模块或服务。
分布性: 这些模块可以部署在不同的硬件设备上,通过网络进行通信。
并发性: 多个模块可以并发地运行和处理请求。
透明性: 用户和应用程序不需要关心系统的分布性,系统应该提供一致的操作接口。

微服务架构:
微服务架构是一种分布式系统架构的特定实现方式,它将一个应用程序拆分成一组小型服务,每个服务都运行在自己的进程中,并通过轻量级的通信机制(通常是HTTP或消息队列)进行互相调用。每个微服务都专注于一个特定的业务功能,并且可以独立部署、升级和扩展。

微服务架构的特点:
服务化: 将应用程序拆分成多个小型、自治的服务。
分布式管理: 每个服务可以由不同的团队开发、部署和管理。
松耦合: 每个微服务都可以独立开发、测试、部署和扩展,它们之间通过API或者消息传递进行通信,避免了传统单体应用程序中的紧耦合问题。
多语言和技术栈: 每个微服务可以使用最适合其需求的编程语言、数据库和技术栈。
微服务架构通过解耦和自治的服务单元来提高系统的灵活性、可维护性和可扩展性,同时也增加了复杂性和运维的挑战,因此在设计和实施时需要权衡各种因素。

二.什么是注册中心

注册中心:通常指的是分布式系统架构中的一个核心组件,主要用于服务发现和服务治理。注册中心在微服务架构中特别常见。具体来说,注册中心负责管理整个系统中所有的服务实例,包括它们的网络位置(如IP地址和端口号)以及运行状态。

服务实例: 注册在注册中心中的具体服务的运行实例,指的是具体提供某项服务的实际运行实例或者节点。例如,一个微服务架构中的某个具体服务(如用户管理服务)可能会运行多个实例,每个实例都会向注册中心注册自己的位置和状态,以便其他服务可以发现和调用它们。

配置中心: 配置中心用于集中管理和动态更新应用程序的配置信息。它提供了一个存储配置的地方,应用程序在运行时可以从配置中心获取最新的配置。配置中心通常支持配置的版本管理、动态刷新、权限控制等功能,以便于管理和维护应用程序的配置。 比如Nacos、Spring Cloud Config等配置中心,应用程序可以从这些中心获取数据库连接信息、日志级别、业务参数等配置,而不需要硬编码在应用中,从而实现配置和代码的分离。

注册中心与配置中心的区别:
主要功能不同: 注册中心关注服务实例的注册和发现,确保服务之间能够相互发现和通信;配置中心关注应用配置的集中管理和动态更新,确保应用程序在运行时能够获取最新的配置信息。
服务对象不同: 注册中心服务于服务实例,帮助它们相互发现和通信;配置中心服务于应用程序,提供配置管理和动态更新的功能,使得应用配置可以集中管理和动态调整。

三.注册中心主要功能:

服务注册(Service Registration):服务实例启动时,会向注册中心注册自己的信息,包括服务名称、版本号、网络位置(IP地址和端口号)等。注册中心将这些信息存储起来,形成服务注册表(服务注册表是分布式系统中用于管理和存储服务实例信息的重要组件。它通常由服务注册中心(Service Registry)来实现和维护。服务注册表在微服务架构中尤为重要,它使得服务之间的通信变得更加透明和可靠。常见的服务注册表包括ZooKeeper、Nacos,和Netflix的Eureka、Consul、etcd等)。

服务发现(Service Discovery):当服务消费者需要调用某个服务时,它可以向注册中心查询该服务的注册信息。注册中心返回该服务的可用实例列表,消费者可以根据负载均衡策略选择一个实例进行调用,而不需要事先配置服务的位置。

健康检查(Health Check):注册中心会定期检查注册的服务实例的健康状态,比如是否存活、负载情况,是否能够正常处理请求等。服务实例通常会定期发送心跳信号给注册中心,以表明自己的健康状态。如果发现某个服务实例不可用,注册中心将从注册表中移除该实例,以确保消费者不会再将请求发送到不可用的服务实例上。

负载均衡(Load Balancing):一些注册中心会提供负载均衡的功能,通过在多个服务实例之间分发负载,确保系统资源的高效利用。

故障转移和容错(Failover and Fault Tolerance):当某个服务实例发生故障时,注册中心可以快速将流量转移到其他健康的实例,从而提高系统的可用性和稳定性。

四.常见的注册中心:

常见的注册中心包括ZooKeeper、Nacos、Eureka、Consul等,它们通过提供REST API或其他协议与服务实例通信,管理和监控整个系统中的服务。
在这里插入图片描述

一致性算法:指定了每个系统使用的一致性算法。ZooKeeper使用ZAB(ZooKeeper Atomic Broadcast),Nacos和Consul使用RAFT。

服务发现:表示系统是否支持动态服务发现(其他服务通过服务注册中心查询服务信息,从而能够动态地调用其他服务而无需硬编码依赖)。所有四个系统都支持服务发现。

服务注册:表示系统是否支持服务注册(微服务启动时将自身信息注册到服务注册中心,包括服务名称、IP地址、端口号、健康状态等)。所有四个系统都支持服务注册。

健康检查:表示系统是否支持对服务实例的健康状态检查(定期检查服务实例的健康状态,包括运行状态、响应时间等,将不健康的实例从服务发现中移除,避免向其分发请求)。所有四个系统都支持健康检查。

负载均衡:表示系统是否提供负载均衡功能(负载均衡是指在多个服务实例之间分配请求的过程,以确保系统能够处理更多的请求并提高可靠性。比如,将请求均匀地分发到多个服务实例,避免某个实例过载或故障时影响整体服务可用性)。Consul内置了负载均衡,而其他系统大多依赖于客户端实现或第三方组件。

一致性保证:描述系统的一致性级别(系统在数据更新和分布式事务处理中的一致性级别。强一致性意味着在任何时刻,所有节点都能看到最新的数据,而一致性稍低的系统可能会在一段时间内存在数据不一致的情况)。ZooKeeper和Consul提供强一致性,Nacos和Consul提供一致性。

雪崩效应:指系统是否可能在某些条件下导致雪崩效应(多个服务实例在同一时间发生故障或不可用时,可能导致请求在系统中积累,最终导致整个系统不可用的情况。为了避免雪崩效应,系统设计通常包括故障隔离、超时控制、限流等策略)。各系统在架构设计和实现上采取不同措施来避免雪崩效应。

K8s集成:指系统是否直接支持和集成到Kubernetes中(一个系统是否直接支持和集成到Kubernetes容器编排平台中。Kubernetes可以管理和调度大规模的容器化应用,通过其服务发现、负载均衡等功能简化了微服务的部署和管理)。

配置管理:指系统是否提供配置管理功能(集中管理微服务的配置信息,确保不同环境(开发、测试、生产)的配置能够灵活切换和管理,减少人工操作和错误)。

五. 常用注册中心的区别:

Zookeeper: 最早流行的开源分布式协调服务框架之一,提供了分布式配置中心的功能。以高可用,一致性和可靠信著称,需要用户自己来开发实现分布式配置的功能。

ZooKeeper本身提供了一些基础的原语(如创建节点、写入数据、监听节点变化等),可以用于构建更高级的分布式系统和应用。但是,要实现一个完整的分布式配置中心,需要用户编写代码来管理和维护配置信息的存储、读取、更新和同步。这些功能包括:
配置管理:设计和实现配置的存储结构,如何将应用的配置信息存储在ZooKeeper节点上。
配置更新:监控配置的变化,并在配置更新时通知相关的应用程序。
版本控制:确保配置的一致性和可靠性,可能需要实现版本管理机制。
安全性:对配置信息的访问进行权限控制,确保只有授权的应用程序可以读取或修改配置。
因此,尽管ZooKeeper提供了可靠的基础设施来处理分布式系统中的协调问题,但用户仍需要自行开发额外的代码来利用这些基础设施构建特定于自己应用的分布式配置管理功能。

Nocos: 阿里巴巴开源的服务注册中心和配置中心,自带了配置中心功能,提供了更多可视化配置管理工具。

Eureba NetFlix开源的服务注册中心,被广泛应用在Spring Cloud微服务架构中。提供了易于使用的REST API 和web界面,支持基于Region与Zone的服务分组与负载均衡。

Consul: HashiCorp开源的服务注册中心和配置中心,提供了服务发现,健康检查,KV存储和多数据中心功能,有更丰富的健康检查和路由功能与丰富的API和WEB UI。

六.ZAB(ZooKeeper Atomic Broadcast)和RAFT

ZAB(ZooKeeper Atomic Broadcast)和RAFT都是一致性协议,用于确保分布式系统中多个节点之间的数据一致性和顺序性。

ZAB(ZooKeeper Atomic Broadcast):
ZAB是ZooKeeper中使用的一致性协议,它的设计目标是提供高可用性和严格的顺序一致性。ZAB的目标是提供强一致性,即所有节点在同一时间看到相同的数据状态。它通过选举Leader和使用基于日志的复制机制来保证这一点。

ZAB主要特点:
领导者选举: ZooKeeper集群中的一个节点被选举为Leader,负责处理客户端请求和更新操作。
原子广播: Leader接收客户端的写请求,并通过ZAB协议将其原子性地广播给所有的Follower节点。
基于日志的复制: Leader将每一个事务请求转换为一个事务提案,并将这些提案通过一种类似Paxos的协议进行广播,确保所有Follower按照相同的顺序接收和应用这些提案。

RAFT:
RAFT是一种由Diego Ongaro 和 John Ousterhout 提出的分布式一致性算法,目标是提供易理解和易实现的一致性协议。RAFT通过领导者选举和日志复制机制提供了一种可理解和实现的分布式一致性解决方案,广泛用于诸如Nacos和Consul等系统中。

RAFT的主要特点:
领导者选举: RAFT集群中的每个节点都可以是Candidate、Leader或Follower。选举Leader的过程通过投票来完成,确保每个任期内只有一个Leader。
领导者日志复制: Leader负责接收客户端的写请求,并将这些请求作为日志条目追加到其日志中。Leader通过RPC将这些条目复制到所有的Follower节点上。
安全性: RAFT确保只有在大多数节点确认了条目追加操作后,该条目才被视为已提交,从而保证数据的一致性和持久性。

ZAB和RAFT比较:
复杂度与实现: RAFT相对于ZAB来说更易于理解和实现,因此在许多新兴的分布式系统中得到了广泛应用,如Nacos和Consul。
历史与稳定性: ZAB在ZooKeeper中有着长时间的实际应用和稳定性验证,适用于需要强一致性和高可用性的场景。

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

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

相关文章

邮箱表单系统源码

邮箱表单简介 我们的邮箱表单系统是一个简洁高效的工具,旨在为用户提供一种便捷的方式来提交他们的邮箱地址。该系统可以用于订阅新闻通讯、注册活动、获取用户反馈等多种场景。 功能特点: 用户友好的界面: 表单设计简洁直观,用…

t-SNE降维可视化并生成excel文件使用其他画图软件美化

t-sne t-SNE(t-分布随机邻域嵌入,t-distributed Stochastic Neighbor Embedding)是由 Laurens van der Maaten 和 Geoffrey Hinton 于 2008 年提出的一种非线性降维技术。它特别适合用于高维数据的可视化。t-SNE 的主要目标是将高维数据映射…

修改vscode的字体为等宽字符

在文件——首选项——设置 中 搜索 Editor: Font Family 将内容改为下面的 Consolas, Courier New, monospace 之后重启Vscode就行了

初步探究Rust生态与图形界面编程

引言 Rust作为一种现代的、安全的系统编程语言,自2010年问世以来,逐渐在开发社区中崭露头角。它的内存安全保证、并发处理能力、以及无需垃圾回收机制的高性能特性,使得它成为了开发系统工具、网络服务、以及嵌入式系统的热门选择。然而&…

(五十三)第 8 章 动态存储管理(伙伴系统)

1. 背景说明 2. 示例代码 buddySystem.h // 伙伴系统实现头文件#ifndef BUDDY_SYSTEM_H #define BUDDY_SYSTEM_H#include "errorRecord.h"#define POWER_TIME 10 // 可利用空间总容量的 2 的幂次,子表的个数为 POWER_TIME + 1 #define MAX_USED_BLOCK_NUM 100 //…

我的 Java 面试“打怪升级”之路01

前言 在当今的科技行业,Java 作为一门广泛应用的编程语言,其相关的岗位竞争可谓十分激烈。作为一名求职者,经历 Java 面试就如同一场充满挑战的“打怪升级”游戏。在这里,我想和大家分享一下我在 Java 面试中的一些经历和感悟。 …

SwiftUI 截图(snapshot)视频画面的极简方法

功能需求 在 万物皆可截图:SwiftUI 中任意视图(包括List和ScrollView)截图的通用实现 这篇博文中,我们实现了在 SwiftUI 中截图几乎任何视图的功能,不幸的是它对视频截图却无能为力。不过别着急,我们还有妙招。 在上面的演示图片中,我们在 SwiftUI 中可以随心所欲的截图…

前端Vue组件化实践:打造灵活可维护的地址管理组件

随着前端技术的不断演进,复杂度和开发难度也随之上升。传统的一体化开发模式使得每次小小的修改或功能增加都可能牵一发而动全身,严重影响了开发效率和维护成本。组件化开发作为一种解决方案,通过模块化、独立化的开发方式,实现了…

【java算法专场】滑动窗口(下)

目录 水果成篮 算法分析 算法步骤 示例 算法代码 找到字符串中所有字母异位词 算法分析 算法步骤 示例 算法代码 优化 算法代码 串联所有单词的子串 算法分析 算法步骤 示例 算法代码 最小覆盖子串 算法分析 算法步骤 示例 算法代码 算法分析 这道题其实…

AI绘画Stable Diffusion 自制素材工具: layerdiffusion插件—透明背景生成工具

大家好,我是设计师阿威 今天给大家分享一款AI绘画的神级插件—LayerDiffusion。 Layerdiffusion是一个用于stable-diffusion-webui 的透明背景生成(不是生成图再工具扣图,是直接生成透明背景透明图像)插件扩展,它可以…

【Linux 文件读写描述符重定向 Linux 一切皆文件缓冲区】

文章目录 一、文件的读写操作二、文件描述符三、文件重定向四、理解 Linux 一切皆文件五、文件缓冲区 一、文件的读写操作 文件内容属性 当文件没有被操作的时候,一般文件还是在磁盘当中 文件操作文件内容的操作文件属性的操作,文件操作有可能即改变内容…

《python程序语言设计》2018版第5章第55题利用turtle黑白棋盘。可读性还是最重要的。

今天是我从2024年2月21日开始第9次做《python程序语言设计》作者梁勇 第5章 从2019年夏天的偶然了解python到2020年第一次碰到第5章第一题。彻底放弃。再到半年后重新从第一章跑到第五章,一遍一遍一直到今天2024.7.14日第9次刷第五章。 真的每次刷完第五章感觉好像…

【JavaScript】解决 JavaScript 语言报错:Uncaught SyntaxError: Unexpected token

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 缺少必要的语法元素2. 使用了不正确的字符或符号3. JSON 格式错误4. 字符串未正确闭合 四、解决方案与预防措施1. 检查语法元素2. 正确使用符号和字符3. 修正 JSON 格式4. 字符串闭合 五、示例代码和实践建议…

android13 文件管理器无法安装apk 奔溃问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.我们简单写个apk测试下 3.排查客户apk 4.frameworks源码排查 5.编译验证 6.彩蛋 1.前言 客户提供的文件管理apk不能安装apk文件,一点击就奔溃。 2.我们简单写个apk测试下 private void installApk(File apkFile) {i…

映美精黑白相机IFrameQueueBuffer转halcon的HObject

映美精黑白相机&#xff0c;用wpfhalcon开发取图 1.到官网下载&#xff0c;开发包 1sdk 2c开发例子 3c#开发例子 引入TIS.Imaging.ICImagingControl35.dll 3.ICImagingControl使用这个类控制相机 /// <summary> /// 相机控制 /// </summary> public ICImagingC…

MySQL的插入(DML)

1.给指定字段添加数据 这个就是&#xff0c;想插入所对应的字段&#xff0c;就插入所对应的数值。先把字段列出来&#xff0c;不一定是全部的字段&#xff0c; 然后插入想要的值&#xff0c;注意&#xff0c;只能插入一行。 INSERT INTO 表名 (字段1,字段2,.....) VALUES(值…

将swagger注解导入apifox的IDEA配置

在使用IDEA开发中&#xff0c;经常需要将后端接口导出到Apifox&#xff0c;以便于测试。将swagger注解内容导出到Apifox中&#xff0c;需要进行以下设置: file->settting打开对话框&#xff0c;选择Other Settings -> Apifox Help&#xff0c;如下图&#xff1a; 2.选…

【软件测试】自动化测试常用函数 -- 详解

一、WebDriver API 一个简单自动化脚本的构成&#xff1a; 脚本解析 # coding utf-8 from selenium import webdriver import time browser webdriver.Firefox() time.sleep(3) browser.get("http://www.baidu.com") time.sleep(3) browser.find_element_by_id(…

数据实时化是必要还是偏见?

数据实时化是必要还是偏见&#xff1f; 一、前言二、数据仓库的起源三、数据架构的演进四、数据实时化的必要性五、总结 本文主要基于数据仓库的起源和数据架构的演进来聊聊&#xff0c;数据实时化是否真的必要&#xff1f;是"过度优化"、“实时偏见"还是"…

【数据结构】手写快速排序

一、理念 什么是快速排序&#xff1f; 首先确立pivot&#xff0c;比如下图位于末尾 然后i遍历3到6 在3的时候&#xff0c;j指向i前面一位 如果3<5(pivot)&#xff0c;那么j&#xff0c;同时将i与j指向的交换&#xff0c;第一次交换是原地不动 一直到遇见9&#xff0c;…