如何设计一个注册中心?(1)概念

news2024/11/15 15:38:40

1. 为什么需要注册中心

一个集群中有众多服务,每个服务有N个实例,因此需要一个第三方节点来存放每个服务的信息,这样服务需要其它的服务信息,直接到第三方节点获取就行了。这个第三方的节点,就是注册中心。

2. 注册中心的功能

在这里插入图片描述
三个模块:
注册中心模块:负责维护服务信息,提供服务注册接口,服务信息获取接口,同时根据心跳机制,与服务提供方维持心跳,从而及时检测到服务提供方是否下线,从而在注册中心中将其信息剔除。

服务提供方模块:将本地的相关服务通过端口暴露出去,可供服务消费方进行服务消费;与注册中心通过定时任务保持心跳机制,方便注册中心及时进行服务下线。

服务消费方模块:从注册中心拉取服务相关信息,从而消费服务提供者提供出来的服务;同时当注册中心服务信息有更新的时候,及时更新本地服务节点信息,重新生成代理对象使用。

功能:
服务注册表 :服务注册表是注册中心的核心,它用来记录各个微服务的信息,例如微服务的名称、IP、端口等。服务注册表提供查询API和管理API,查询API用于查询可用的微服务实例,管理API用于服务的注册与注销。

服务注册与发现:服务注册是指微服务在启动时,将自己的信息注册到注册中心的过程。服务发现是指查询可用的微服务列表及网络地址的机制。

服务检查:注册中心使用一定的机制定时检测已注册的服务,如发现某实例长时间无法访问,就会从服务注册表移除该实例。

3. 注册中心工作的过程

在这里插入图片描述
各个微服务在启动时,将自己的网络地址等信息注册到注册中心,注册中心存储这些数据。

服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。

各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。

微服务网络地址发送变化(例如实例增加或IP变动等)时,会重新注册到注册中心。这样,服务消费者就无需人工修改提供者的网络地址了。

4. 服务注册的实现

服务进程在注册中心注册自己的元数据信息。通常包括主机和端口号,有时还有身份验证信息,协议,版本号,以及运行环境的信息。

服务注册有两种形式:客户端注册和代理注册。

客户端注册(调用方实现)
客户端注册是服务自己要负责注册与注销的工作。当服务启动后注册线程向注册中心注册,当服务下线时注销自己。
在这里插入图片描述
缺点:注册注销逻辑与服务的业务逻辑耦合在一起,如果服务使用不同语言开发,那需要适配多套服务注册逻辑。

代理注册
代理注册由一个单独的代理服务负责注册与注销。当服务提供者启动后以某种方式通知代理服务,然后代理服务负责向注册中心发起注册工作。
在这里插入图片描述

5. 服务发现

服务发现也分为客户端发现和代理发现。

客户端发现(调用方实现)
客户端发现是指客户端负责向注册中心查询可用服务地址,获取到所有的可用实例地址列表后客户端根据负载均衡算法选择一个实例发起请求调用。
在这里插入图片描述
这种方式非常直接,客户端可以控制负载均衡算法。但是缺点也很明显,获取实例地址、负载均衡等逻辑与服务的业务逻辑耦合在一起,如果服务发现或者负载平衡有变化,那么所有的服务都要修改重新上线。

代理发现
代理发现是指新增一个路由服务负责服务发现获取可用的实例列表,服务消费者如果需要调用服务A的一个实例可以直接将请求发往路由服务,路由服务根据配置好的负载均衡算法从可用的实例列表中选择一个实例将请求转发过去即可,如果发现实例不可用,路由服务还可以自行重试,服务消费者完全不用感知。
在这里插入图片描述

6. 心跳机制

如果服务有多个实例,其中一个实例出现宕机,注册中心是可以实时感知到,并且将该实例信息从列表中移出,也称为摘机。

心跳检测有主动和被动两种方式。
被动检测是指服务主动向注册中心发送心跳消息,时间间隔可自定义,比如配置5秒发送一次,注册中心如果在三个周期内比如说15秒内没有收到实例的心跳消息,就会将该实例从列表中移除。
主动检测是注册中心主动发起,每隔几秒中会给所有列表中的服务实例发送心跳检测消息,如果多个周期内未发送成功或未收到回复就会主动移除该实例。

7. 注册中心高可用

高可用无非就是做集群,我们可以对注册中心部署多个节点。在消费端consumer只需要知道一个服务注册中心集群地址cluster-url即可

8. 常见的注册中心

Dubbo中的注册中心:Dubbo支持多种注册中心的实现,常用的是Redis、Zookeeper,这些组件本身就可以做到高性能和高可用。在Dubbo架构图中,可以看到注册中心(Registry)位于顶端,所有的服务治理相关的操作都围绕它进行。服务提供者(Provider)注册到注册中心,服务消费者(Comsumer)到注册中心订阅,同时,注册中心中的变更也会通知服务消费者。

eureka:
在这里插入图片描述
服务提供者向Eureka Server中注册服务, Eureka Server接受到注册事件会在集群和分区中进⾏数据同步,Application Client作为消费端(服务消费者)可以从Eureka Server中获取到服务注册信息,进⾏服务调⽤。微服务启动后,会周期性地向Eureka Server发送⼼跳(默认周期为30秒)以续约⾃⼰的信息。

Eureka Server在⼀定时间内没有接收到某个微服务节点的⼼跳, Eureka Server将会注销该微服务节点(默认90秒)。

每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的⽅式完成服务注册列表的同步。

Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使⽤缓存中的信息找到服务提供者。

zookeeper:
高度可靠的分布式协调
ZooKeeper是一种集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务。所有这些类型的服务都以分布式应用程序的某种形式使用。
zookeeper的核心主要是包含两个部分:服务信息的管理和变更通知机制(watch)

nacos:Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

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

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

相关文章

2023.7.14 智慧芽前端面试总结

整体面试体验感蛮不错的,面试官很愿意与我交流,面试的结尾也给出了一定的学习建议。 由于这家公司主要的业务是做搜索引擎方面,估摸着是个自研。面试注重点主要是偏业务处理和针对工具的使用,还有无障碍阅读英文文章,…

C++进阶—哈希/unordered系列关联式容器/底层结构(一篇文章学习哈希)

目录 0. 前言map/set和unordered_map/unordered_set 1. unordered系列关联式容器 1.1 unordered_map 1.1.2 unordered_map的接口说明 1. unordered_map的构造 2. unordered_map的容量 3. unordered_map的迭代器 4. unordered_map的元素访问 5. unordered_map的查询 6…

Spring原码学习第一篇:Spring源码概述

1、Spring获取对象的过程 2、Spring源码概述图: 2、一些重要的接口 BeanDefinition中实现的方法,把xml中定义的对象封装为一个对象,方便后面处理 4、BeandefinitionReader BeandefinitionReader作为一个抽象层来处理配置文件,定…

Autosar通信实战系列01-CanSM模块功能及配置开发详解

本文框架 前言1. CanSM General配置2. 通道详细配置解析2.1 添加一路CanSMController2.2 CanSMController配置2.3 关联DemEvent配置前言 在本系列笔者将结合工作中对通信实战部分的应用经验进一步介绍常用,包括但不限于通信各模块的开发教程,代码逻辑分析,调测试方法及典型…

【Maven二】——maven仓库

系列文章目录 Maven之POM介绍 maven命令上传jar包到nexus maven仓库 系列文章目录前言一、什么是maven仓库?二、仓库的分类建立私服的优势 三、远程仓库的配置四、远程仓库的认证部署至远程仓库五、快照版本&why六、从仓库解析依赖的机制七、镜像总结 前言 由…

习题—实用类

目录 1.xxx 1.包装类及其构造方法 import java.util.List; import java.util.ArrayList; import java.util.Scanner;//包装类及其构造方法 public class Test {public static void main(String[] args) {// 装箱:基本类型转换为包装类的对象 // 拆箱&#xff1a…

go mod verdor简明介绍

Go 语言在 go 1.6 版本以后编译 go 代码会优先从 vendor 目录先寻找依赖包,它具有以下优点: 复制依赖:go mod vendor 会把程序所依赖的所有包复制到项目目录下的vendor 文件夹中,所以即使这些依赖包在外部源(如 GitHu…

「C/C++」C/C++宏定义#define

✨博客主页:何曾参静谧的博客 📌文章专栏:「C/C」C/C程序设计 目录 术语说明宏定义 #define定义常量定义函数定义代码块常用标识符用宏包含头文件 术语说明 定义宏是一种预处理器指令,它可以将一些代码片段或者常量直接替换为另一…

刘二大人Pytorch课程笔记

Lecture01. Overview 没啥好记的,理解就好 人工智能和机器学习等的关系: 正向传播 正向传播本质上是按照输入层到输出层的顺序,求解并保存网络中的中间变量本身。 反向传播 反向传播本质上是按照输出层到输入层的顺序,求解并…

LangChain 联合创始人下场揭秘:如何用 LangChain 和向量数据库搞定语义搜索?

近期,关于 ChatGPT 的访问量有所下降的消息引发激烈讨论,不过这并不意味着开发者对于 AIGC 的热情有所减弱,例如素有【2023 最潮大语言模型 Web 开发框架】之称的大网红 LangChain 的热度就只增不减。 原因在于 LangChain 作为大模型能力“B2…

1快速入门MyBatis

开发前的准备 准备数据库表:汽⻋表t_car 确定表中的字段以及字段的数据类型 guide_price是decimal类型,专⻔为财务数据准备的类型produce_time可以用char类型 , 格式’2022-10-11’ 使用navicat for mysql⼯具向t_car表中插⼊两条数据 配置IDEA中ma…

【C++修炼之路】vector 模拟实现

👑作者主页:安 度 因 🏠学习社区:StackFrame 📖专栏链接:C修炼之路 文章目录 一、读源码二、成员变量三、默认成员函数1、构造2、析构3、拷贝构造4、赋值重载 四、访问1、[ ] 重载2、迭代器 五、容量1、cap…

Profibus DP主站转Modbus TCP网关profibus从站地址范围

远创智控YC-DPM-TCP网关。这款产品在Profibus总线侧实现了主站功能,在以太网侧实现了ModbusTcp服务器功能,为我们的工业自动化网络带来了全新的可能。 远创智控YC-DPM-TCP网关是如何实现这些功能的呢?首先,让我们来看看它的Profib…

Oracle解析JSON字符串

Oracle解析JSON字符串 假设某个字段存储的JSON字符串,我们不想查出来后通过一些常见的编程语言处理(JSON.parse()或者是JSONObject.parseObject()等),想直接在数据库上处理,又该如何书写呢? 其实在ORACLE中…

算法06-搜索算法-广度优先搜索

文章目录 参考:总结大纲要求搜索算法-广度优先搜索迷宫问题问题迷宫的存储迷宫的移动搜索方式代码实现 图的广度优先遍历题目描述用邻接矩阵表示图 搜索算法-广度优先搜索 参考: 【算法设计】用C类和队列实现图搜索的广度优先遍历算法 C/C 之 广度优先…

梯度下降(Gradient Descent)

基本思想 梯度下降是一个用来求函数最小值的算法,本次,我们将使用梯度下降算法来求出代价函数的最小值。 梯度下降背后的思想是:开始时我们随机选择一个参数的组合,计算代价函数,然后我们寻找下一个能让代价函数值下降…

Linux:squid透明代理

在传统代理上进行修改并添加网卡 这次不使用手动代理,而是把网关搞成代理 在下面这个链接里的文章实验下进行修改 Linux:squid传统代理_鲍海超-GNUBHCkalitarro的博客-CSDN博客 完成以后不用再win10上去配置,代理的那一步,然后…

Python(十二)常见的数据类型

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

TabLayout+ViewPager实现滚动页面

目录 一、TabLayout介绍 二、TabLayout的常用属性和方法 常用属性: 常用方法: 三、适配器介绍 (一)、PagerAdapter介绍: (二)、FragmentPagerAdapter介绍: (三&am…

习题 1.26

我们先来看看题目要求,题目住说将 square 调用换成了(* x x),结果导致执行时间变慢。 根据以前学过的内容,我们知道 在做显示乘法的时候,是直接进行计算的,而在做函数调用的时候,是先进行表达式展开的&…