注册中心 Service Discovery --- Intro

注册中心 Service Discovery --- Intro

  • 为什么需要注册中心
  • 注册中心的原理
  • 常用的注册中心
  • 注册中心的高可用

为什么需要注册中心

  • 在微服务架构中,系统被拆分成了若干个独立的服务,因此服务之间需要进行通信和协作。为了实现服务的发现和调用,需要一个中心化的注册中心来进行服务的注册和发现。注册中心可以让服务通过名字进行访问,而不用关心服务的物理位置和实现细节
  • 服务注册中心就是在整个的微服务架构中单独提出一个服务,这个服务不完成系统的任何的业务功能,仅仅用来完成对整个微服务系统的服务注册和服务发现,以及对服务健康状态的监控和管理功能。

注册中心的主要作用是:

  • 服务的注册和注销:服务在启动时将自己的信息注册到注册中心,服务关闭时注销自己的信息。
  • 服务的发现和访问:客户端通过注册中心查询服务的信息,获取服务的地址和端口,然后进行调用。
  • 健康检查和服务摘除:主动的检查服务健康情况,对于宕机的服务将其摘除服务列表
  • 服务的负载均衡和路由:注册中心可以根据服务提供者的负载情况和调用方的请求路由选择合适的服务提供者。

注册中心的原理

主要架构
在这里插入图片描述

  • 各个微服务在启动时,将自己的网络地址等信息注册到注册中心,注册中心存储这些数据。
  • 服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。
  • 各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。
  • 微服务网络地址发送变化(例如实例增加或IP变动等)时,会重新注册到注册中心。这样,服务消费者就无需人工修改提供者的网络地址了.

服务注册的实现

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

客户端注册(调用方实现)

  • 客户端注册是服务自己要负责注册与注销的工作。当服务启动后注册线程向注册中心注册,当服务下线时注销自己.
  • 缺点:注册注销逻辑与服务的业务逻辑耦合在一起,如果服务使用不同语言开发,那需要适配多套服务注册逻辑。
    在这里插入图片描述
    代理注册
  • 代理注册由一个单独的代理服务负责注册与注销。当服务提供者启动后以某种方式通知代理服务,然后代理服务负责向注册中心发起注册工作.
    在这里插入图片描述

服务发现

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

客户端发现(调用方实现)

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

代理发现

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

心跳机制

  • 如果服务有多个实例,其中一个实例出现宕机,注册中心是可以实时感知到,并且将该实例信息从列表中移出,也称为摘机。
  • 心跳检测有主动和被动两种方式。
  • 被动检测是指服务主动向注册中心发送心跳消息,时间间隔可自定义,比如配置5秒发送一次,注册中心如果在三个周期内比如说15秒内没有收到实例的心跳消息,就会将该实例从列表中移除。
  • 主动检测是注册中心主动发起,每隔几秒中会给所有列表中的服务实例发送心跳检测消息,如果多个周期内未发送成功或未收到回复就会主动移除该实例
    ————————————————
                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_42774617/article/details/131740758

常用的注册中心

Zookeeper

  • 经典的服务注册中心中间件
    java体系中,大部分的集群环境都是依赖zookeeper管理服务的各个节点

Eureka

  • Netflix开发的服务发现框架
    基于REST的服务 用于服务注册、管理、负载均衡、服务故障转
  • 其组件特点:
    包含两个组件:EurekaServer 和 EurekaClient
    EurekaServer提供注册服务,服务节点的信息可以在界面中直观的看到
    允许在注册服务时,自定义实现检查自身状态的是够健康的方法
    EurekaClient简化与EurekaServer的交互,同时也是一个内置的、使用轮询负载算法的负载均衡器

Consule

  • 用于服务发现和配置的工具分布式的,高度可用的,并且具有极高的可伸缩性
  • 提供了功能齐全的控制面板, 主要特点:服务发现、健康检查、键值存储、安全服务通信、多数据中心、ServiceMesh
  • 提供多个数据中心支持,基于Fabio做负载均衡
    八卦池,其中包含给定数据中心的所有节点

Nacos

  • 用于微服务的发现、配置、管理. 更敏捷、容易地构建、交付、管理微服务平台

在这里插入图片描述

注册中心的高可用

  • 在微服务中,注册中心作为一个存储所有服务中心的地方必然不可能是单机的。因为如果注册中心无法使用,那么服务提供者就无法对外暴露自己的服务,消费者也无法获取自己需要调用的服务的具体地址,整个应用将会崩溃。首先需要保证的就是注册中心的高可用。
    一致性和可用性的抉择

一致性和可用性的抉择

  • 根据CAP理论, 分布式系统一般分为CP类型和AP类型

CP类型注册中心

  • Zookeeper是一个典型的CP类型的组件。
  • zookeeper实现了paxos算法,zookeeper集群有一个节点作为leader,如果leader节点挂了zk会通过ZAB协议来进行leader选举,但是在选举的过程中zk是不能对外提供服务的。
  • 而且当因为网络分区导致zk集群出现断裂问题时,由于ZAB协议需要半数以上的节点参与,所以可能会有部分或者全部的zk节点无法对外提供服务。但是zk可以保证所有可用节点都数据都是一致,即使节点崩溃,在恢复后也会和其他节点保持一致,这就是zk牺牲了可用性而保证的强一致性。

AP类型注册中心

  • 而类似与eureka的注册中心则是AP类型的。eureka实现高可用是通过启动多个eureka server服务,每一个eureka server即是提供者也是消费者,每个eureka server将自己作为服务注册给其他的eureka server,这样每个eureka server都是其他server 的replica。eureka这种模式中每个节点都是平等的,不存在leader、flower。
  • 当集群中某一个server节点宕机,请求可以直接转移到其他节点。即使发生了网络分区,尽管不同分区之间无法进行通信,但是在每一个分区内的节点是通信并且可以正常对外提供服务,这样就保证了在server节点宕机的情况下的注册中心的可用性。
  • 而问题在于由于不同分区无法通信,就导致可能一部分节点的数据和另一部分有差别,这就是牺牲了强一致性来换取系统可用性。

注册中心的选择

  • 首先我们应该明确的是其实注册中心的存在与否应该是不能直接影响服务的调用的。服务之间的调用时通过http或者rpc等协议直接调用的,注册中心只是提供一个调用地址。服务是否可以正常使用不能直接靠注册中心节点信息来决定。
  • 即使注册中心出现问题,只要服务本身没有宕机,理论上来说还是应该正常对外提供服务。所以很明显对于我们来说AP类型的注册中心是要优于CP类型的注册中心的
  • 当然在实际实现过程中很多框架都会尽可能的去修补这些问题,比如eureka会定时的同步各个节点的数据,尽可能的做到数据一致性。dubbo的zk注册中心实现过程中也会本地缓存服务信息并不是完全通过zk信息来决定是否剔除服务等。所以实际在选择时还是需要根据自身实际以及是否还有其他需求来确定。

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

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

相关文章

一周学会Django5 Python Web开发-Django5二进制文件下载响应

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计25条视频,包括:2024版 Django5 Python we…

CrossOver 24.0.0 for mac 震撼发布 2024最新下载安装详细图文教程

2024年2 月 23 日消息,CodeWeavers 近日发布了 CrossOver 24 版本更新,基于近期发布的 Wine 9.0,不仅兼容更多应用和游戏,还初步支持运行 32 位应用程序。 苹果在 macOS Catalina 系统中移除对 32 位软件的支持之后,在…

08 Redis之集群的搭建和复制原理+哨兵机制+CAP定理+Raft算法

5 Redis 集群 2.8版本之前, Redis采用主从集群模式. 实现了数据备份和读写分离 2.8版本之后, Redis采用Sentinel哨兵集群模式 , 实现了集群的高可用 5.1 主从集群搭建 首先, 基本所有系统 , “读” 的压力都大于 “写” 的压力 Redis 的主从集群是一个“一主多从”的读写分…

K线实战分析系列之三:吞没形态

K线实战分析系列之三:吞没形态 一、吞没形态二、看涨吞没形态三、看跌吞没形态四、吞没形态判别标准 一、吞没形态 两根或两根以上的K线形成的组合形态,吞没形态就是一种主要的反转形态。 这个形态由两根K线组成,前短后长,一阴一…

Python爬虫-存储到csv乱码-使用utf-8-sig编码

代码 import requests import csvdef get_data():url https://careers.tencent.com/tencentcareer/api/post/Query?timestamp1708743664770&countryId&cityId&bgIds&productId&categoryId&parentCategoryId&attrId&keywordpython&pageIn…

保姆级教程!安利一款Kali Linux 安装 + 获取 root 权限 + 远程访问!

一、什么是Kali kali是linux其中一个发行版,基于Debian,前身是BackTrack(简称BT系统)。kali系统内置大量渗透测试软件,可以说是巨大的渗透系统,涵盖了多个领域,如无线网络、数字取证、服务器、…

构建未来新零售平台的设计与实现的总结

随着科技的飞速发展和消费者需求的不断变化,新零售已经成为零售行业的新趋势。在这个数字化时代,构建一个高效、智能、一体化的新零售平台架构至关重要。本文将探讨如何设计和实现一个具备创新性和竞争力的新零售平台。 引言: 新零售是指利用…

十一、Qt数据库操作

一、Sql介绍 Qt Sql模块包含多个类,实现数据库的连接,Sql语句的执行,数据获取与界面显示,数据与界面直接使用Model/View结构。1、使用Sql模块 (1)工程加入 QT sql(2)添加头文件 …

面试redis篇-05双写一致

原理 双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致 读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间写操作:延迟双删方案一:分布式锁,一致性要求高

C语言之mkdtemp()特定占位符:XXXXXX 用法实例(八十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

2.deeplabv3+的主干网络(mobilenet网络)

deeplabv3的论文中用了resnet网络,在这里用轻量级网络mobilenet替换resnet,下面分别是两个网络的代码。 1.mobilenet网络 代码如下: import math import os import cv2 import numpy as np import torch import torch.nn as nn import tor…

STM32_DS18B20_1_芯片简介及初始化配置

DS18B20介绍 DS18B20数字温度计提供9位到12位摄氏度的温度测量,并具有非易失性,用户可编程的上下触发点的报警功能。DS18B20通过1线总线进行通信,根据定义,该总线只需要一条数据线,即可与中央微处理器进行通信…

NestJS入门7:增加异常过滤器

前文参考: NestJS入门1 NestJS入门2:创建模块 NestJS入门3:不同请求方式前后端写法 NestJS入门4:MySQL typeorm 增删改查 NestJS入门5:加入Swagger NestJS入门6:日志中间件 本文代码基于上一篇文章《…

Flink join详解(含两类API及coGroup、connect详解)

Flink SQL支持对动态表进行复杂而灵活的连接操作。 为了处理不同的场景,需要多种查询语义,因此有几种不同类型的 Join。 默认情况下,joins 的顺序是没有优化的。表的 join 顺序是在 FROM 从句指定的。可以通过把更新频率最低的表放在第一个、…

Redis可视化工具——RedisInsight

文章目录 1. 下载2. 安装3. RedisInsight 添加 Redis 数据库4. RedisInsight 使用 RedisInsight 是 Redis 官方出品的可视化管理工具,支持 String、Hash、Set、List、JSON 等多种数据类型的管理,同时集成了 RedisCli,可进行终端交互。 1. 下载…

【数据结构和算法初阶(C语言)】时间复杂度(衡量算法快慢的高端玩家,搭配例题详细剖析)

目录 1.算法效率 1.1如何衡量一个算法的好坏 1.2 算法的复杂度 2.主菜-时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.2.1算法的最好,最坏和平均的情况 3.经典时间复杂度计算举例 3.1计算冒泡排序的时间复杂度 3.2计算折半查找的时间复杂度 3.…

思维导图教你如何学会计算机组成原理

02 给你一张知识地图,计算机组成原理应该这么学 了解了现代计算机的基本硬件组成和背后最基本的冯诺依曼体系结构,我们就可以正式进入计算机组成原理的学习了。在学习一个一个零散的知识点之前,我整理了一份学习地图,好让你对将要…

AI:132-基于深度学习的涉案人脸图像识别与敲诈勒索嫌疑分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

华清远见作业第四十二天——Qt(第四天)

思维导图&#xff1a; 编程&#xff1a; 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTextToSpeech> //语音播报类 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public Q…

一种新型的AlGaN/GaN HEMTs小信号建模与参数提取方法

来源&#xff1a;A new small-signal modeling and extraction methodin AlGaN/GaN HEMTs&#xff08;SOLID-STATE ELECTRONICS 07年&#xff09; 摘要 本文提出了一种新型的用于GaN HEMTs&#xff08;氮化镓高电子迁移率晶体管&#xff09;的小信号等效电路&#xff0c;包含2…
最新文章