服务注册与发现总结

news2024/11/26 4:27:05

文章目录

    • 概要
    • 一、服务注册与发现技术要点
        • 1.1、服务注册/下线
            • 1.1.1、代理注册
            • 1.1.2、客户端注册
        • 1.2、健康检查(续约)
            • 1.2.1、主动检测
            • 1.2.2、被动检测
        • 1.3、服务发现
            • 1.3.1、代理发现
            • 1.3.2、客户端发现
        • 1.4、服务变更通知
            • 1.4.1、主动通知
            • 1.4.2、被动通知
        • 1.5、高可用
    • 二、总结
  • 参考

概要

因为项目技术架构变更需要,去年年末调研过一次服务注册与发现组件,今天总结一下。常见的组件有Eureka、Zookeeper、etcd、consul、nacos,对比图如下:

组件名称/功能通信方式watch机制服务健康检查kv存储CAP一致性算法跨数据中心(机房)开发语言运维监控社区活跃度
Eurekahttp发现方long polling注册方主动上报不支持AP--------java
Zookeepertcp(sdk)zk会主动通知发现方注册方主动上报支持CPzab(paxos)----java
nacoshttp,grpc,dns,dubbo发现方 long polling注册方主动上报支持CP/AP可选raft支持java
etcdhttp,grpc发现方long polling注册方主动上报支持CPraft----go
consulhttp,grpc发现方long polling注册方主动上报和consul主动询问支持CPraft +gossip支持go

一、服务注册与发现技术要点

之所以会有服务注册与发现这种中间件,主要是在微服务大行其道之下,可能一开始由配置文件或数据库来管理服务的服务标识,服务ip,服务port等关键属性也可以,但随着服务增多,服务上线、下线、重启、非正常宕机越来越频繁,原来呆板的管理模式已经难以跟上服务频繁变动的步伐,于是诞生了服务注册与发现。

其核心功能如下:

  • 服务注册/下线
  • 健康检查(续约)
  • 服务发现
  • 服务变更通知(watch机制)
  • 高可用(集群部署)

流程图如下:
服务注册与发现

1.1、服务注册/下线

服务注册就是服务提供者把自身的元数据告诉服务注册与发现中间件,元数据主要包含服务标识,服务ip,服务port,有时还可携带身份校验,协议,版本号等信息。
服务注册可分为客户端注册和代理注册。

1.1.1、代理注册

代理注册是由一个单独的代理服务负责注册与下线,当服务提供者启动后以某种方式通知代理服务,然后代理服务负责向注册中心发起注册工作,见下图:
代理注册
缺点:

  1. 引入了一个代理服务,必须保证代理服务高可用,增加系统复杂性;
  2. 代理中心要有健康检查的功能,将服务提供者状态及时上报给服务注册中心,相比客户端注册延迟更高。

优点:

  1. 针对多语言的技术栈,有一定优势。

ps:流行的服务注册与发现都提供多种语言的SDK,非必要使用客户端注册为宜。

1.1.2、客户端注册

客户端注册是有客户端直接引入相应的SDK进行注册与下线工作。服务启动时服务提供者直接向服务注册中心发起注册工作。
客户端注册
缺点:

  1. 需要引入服务注册下线相关逻辑,特别是多语言技术栈下,每种语言都要提供一套。但是现在流行的服务注册与发现都有提供多种语言的SDK,这个缺点可以忽略不计了,除非是自研的。

优点:

  1. 相对于代理注册,代理注册的缺点就是客户端注册的优点。

1.2、健康检查(续约)

健康检查是指服务注册中心检查服务提供者是否能正常提供服务,其本质就是心跳机制。心跳若基于TCP的KeepAlive机制并不保险,所以往往是由服务注册中心或服务提供者暴漏一个健康检查接口,根据是谁暴漏的接口可以分为主动检测和被动检测

1.2.1、主动检测

主动检测是由服务注册中心发起,调用服务提供者提供的健康检查接口。服务注册中心每隔一定时间就会主动询问服务提供者,服务提供者
正常应答,说明健康,否则服务注册中心就会将服务提供者下线,并通知服务消费者。

主动检测机制并不流行,主要是因为需要服务提供者提供接口,就需要开发者编写相应代码,与业务耦合,很麻烦。五种流行的中间件中就consul提供了主动检测的机制,但用的并不多。

1.2.2、被动检测

被动检测就是由服务提供者发起,调用服务注册中心提供的健康检查接口。服务提供者每隔一定时间就会主动上报给服务注册中心,这样服
务注册中心依据健康策略(超时时间阈值、超时次数阈值)就可以知道服务提供者是否健康,不满足健康策略就将服务提供者下线,并通知
服务消费者。

服务注册中心如何检查呢,当然是定时任务了,比如每隔一定时间检查下该服务提供者上次上报的时间与当前时间差值是否超
过超时时间阈值之类的。

这种健康检查方式是最流行的,一般内置在SDK中,在服务提供者发起注册时,注册成功后就会启动健康检查逻辑。五种流行的中间件都提供了被动检测的机制。

1.3、服务发现

服务发现就是服务消费者通过服务注册中心能够通过关键词查询到相应的服务提供者,然后去请求服务提供者。
服务发现也可分为代理发现和客户端发现。

1.3.1、代理发现

代理发现是指服务消费者向服务提供者发起网络调用时由代理完成服务发现操作。

  1. 服务消费者通过服务标识发起对服务提供者的网络调用,但该调用实际请求发向代理;
  2. 代理消费者收到请求,根据服务标识向服务注册中心查询服务提供者的IP,Port等信息;
  3. 代理向服务提供者发起网络调用,并将结果返回给服务消费者。

代理发现
缺点:

  1. 引入了一个代理服务,必须保证代理服务高可用,增加系统复杂性;

优点:

  1. 代理服务中可以增加限流,负载均衡,熔断等手段,使这些非业务逻辑无需与服务消费者耦合在一起;
  2. 多语言技术栈友好。
1.3.2、客户端发现

客户端发现是指服务消费者直接通过服务注册中心获取服务提供者的信息,然后直接向服务提供者发起网络调用。
客户端发现
与代理发现相比,优缺点相反。

1.4、服务变更通知

服务消费者/代理第一次获取了所有服务提供者的信息后,就缓存在本地了,后续对服务提供者的网络调用就基于本地缓存了,那么后来某个服务提供者挂了或者新上线一个服务提供者该如何告诉服务发现的一方呢?这个时候就需要服务变更通知机制了。

服务通知机制从服务注册中心角度看,也分为主动通知与被动通知。

1.4.1、主动通知

主动通知是建立在服务消费者和服务注册中心支持watch机制的基础上的。即服务消费者向服务注册中心注册要watch的服务标识(前缀),并实现接收服务注册中心通知服务提供者变更的逻辑(add,del),等服务服务变更者发生变更(新服务上线,已有服务故障或下线等)时便可及时通知服务消费者。
主动通知
缺点:

  1. 逻辑复杂,需要服务消费者关注相关逻辑,可能与业务耦合,进一步增加开发者心智负担。

优点:

  1. 服务提供者发生变更可及时通知服务消费者,有利于服务对外的稳定。

主动通知虽然及时,但实现逻辑复杂,需要开发者关注,应用并不广,五大中间件中只有ZooKeeper支持

1.4.2、被动通知

被动通知一般是通过长轮询的机制来实现的,也可以叫伪watch机制。即服务消费者通过SDK封装好的接口,设置要关注的服务标识,SDK内部会通过长轮询机制及时获取服务提供者的变更,进而更新服务消费者本地服务缓存。
被动通知

  1. 服务消费者启动长轮询,并在请求中设置一个较长时间T的超时时间与上次的版本号V;
  2. 服务注册中心如果检测到服务提供者发生变化,则返回新的版本号V和服务提供者信息,否则一直hang住,直到T耗尽才返回,并且V不变;
  3. 继续轮询。

优缺点与主动通知相反,但变更通知慢也是相对的,一般来说也是够用了,瑕不掩瑜,所以大多采用该方案进行服务变更通知。

1.5、高可用

在整个微服务系统中,注册中心服务地位无疑是特殊的,它一般不依赖于其他服务,但所有业务服务都依赖于它,一旦注册中心崩溃,将导致整个系统不可用,因此注册中心服务必须具有高可用的特性,所以在实际生产中都是集群式部署。

二、总结

第一章总结了服务注册与发现的技术要点,下面再五种常用中间件总结如下:

  • Eureka:
    Eureka是Netflix的开源项目,是一个很优秀的服务注册组件,但是Netflix将2.0闭源后,便已不是最优选择,不过现有的项目使用Eureka 1.x功能已足够使用,不必急于更换技术栈,新项目建议不要使用Eureka了。

  • Zookeeper
    Zookeeper是由Google开源的由Java语言实现的分布式协调服务,是Hadoop和Hbase的重要组件,提供了KV存储、发布订阅、负载均衡、分布式同步等功能。由此可以看出Zookeeper的诞生与服务注册与发现并没有几毛钱的关系,只是恰巧其中某些功能可以实现服务注册于发现,于是大家就拿来用了。
    ZooKeeper使用临时节点(ephemeral node)来实现服务注册和基本的健康检查功能。每当服务实例启动就会在ZooKeeper中注册一个临时节点,而当服务实例故障或下线该临时节点会被ZooKeeper自动删除,如果有其他服务依赖这个服务可以设置监听该服务实例对应的临时节点,当临时节点被删除时,依赖该服务的其他服务会获得通知。依赖ZooKeeper自身的高可用及临时节点提供的健康检查和监听机制来实现具备容错能力的服务发现机制。
    由于zookeeper 遵循CP,一旦Leader挂掉,重新选举非常耗时,网上资料是30-120s,在此期间均不可用,显然不符合服务注册与发现的高可用要求,因此并不是非常适合做服务注册与发现中间件。

  • etcd
    etcd本身只是一个高可用的一致性键值存储系统,用于提供可靠的分布式键值存储,若要实现服务注册与发现功能,需要象ZK一样,基于etcd的api来做进一步封装。

  • consul
    consul是HashiCorp开源的专门面向服务注册与发现功能的中间件,开箱即用。

  • nacos
    nacos是Alibaba开源的专门面向服务注册与发现功能的中间件,开箱即用。

由此可知,consul和nacos乃上上只选,当然还是要根据项目按需评估。

参考

服务注册发现组件的原理及比较
五种常用的注册中心比较
etcd v3 服务注册与发现
选Zookeeper作为注册中心我们还要注意些什么
Eureka介绍

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

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

相关文章

linux系统vim编辑器的使用

前言: 前面我们就说过在linux系统下一切都是文件,也可以说在日常使用linux系统过程中使用频率最高工具,基本没有之一,今天就来详情介绍一下我们在日常使用vim编辑器的过程中一些常见的指令,博主始终遵循好记心不如烂笔…

Excel排序

Excel排序 写在前面: Excel是我们最常用的办公工具之一,其中排序是最基础和最重要的一项,如下介绍了两种排序方式,有需要者可以参照这些步骤完成相关任务~ 一、排序方法1 使用Excel自带的排序功能,具体步骤如下&…

pandas菜鸟速学-series

一、pandas是什么 一个基于numpy的数据处理数据分析的工具。 特点: Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大…

重学SSE

概述 SSE(Server-Sent Events)是一种用于实现服务器主动向客户端推送数据的技术,也被称为“事件流”(Event Stream)。它基于 HTTP 协议,利用了其长连接特性,在客户端与服务器之间建立一条持久化…

暴力递归到动态规划(一)

⭐️前言⭐️ 动态规划是一个很难的模块,如果一道动态规划的题目直接去推出动态转移方程来解题,是很难的,所以应该先想出暴力解决的方法,再去用空间换时间优化,得出动态规划的解法。 🍉欢迎点赞 &#x1f…

【Java设计模式】—— 享元模式概述和示例

目录 概述享元模式的定义与特点享元模式的结构与实现1. 模式的结构2. 模式的理论实现 享元模式的应用实例代码实现 享元模式的应用场景享元模式的在实际工作中的应用参考文献 概述 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那…

Linux命令学习之mkdir、rmdir和rm

这篇文章想要学习一下目录的创建(mkdir)、空目录的删除(rmdir)、非空目录的删除(rm)。 mkdir mkdir是新建目录的命令。man mkdir看一下mkdir的使用说明。 按q键退出帮助说明。 mkdir /learnwell在根目录…

贷款业务-贷款模式

参考文章 多流量模式下的系统设计- 呱说产品自营 互联网金融之信贷三部曲:贷中 导读 互联网的玩法,基本都是流量为王。网上也有种说法,互联网平台,最终都会走上金融业务,一般都是指贷款业务。 但是,做…

PLC信号发生器(博途SCL)

信号发生器的应用请参看下面的博客文章,在演示分析滤波器的作用时,我们需要对信号进行叠加处理。 博途PLC滤波指令 Filter_PT1、Filter_PT2、Filter_DT1详细使用说明(含Simulink+博途PLC仿真)_RXXW_Dor的博客-CSDN博客博途S7-1200/1500PLC的PID控制和详细使用说明,请参看…

计算机组成原理---第四章 指令系统习题详解版

(一)课内例题 4.1 4.2 具体分析,4.2 中, 因为只有一行:单字长 二地址:源寄存器、目标寄存器 操作码看OP(15-91) 然后按操作数的物理位置来区别RR型,RS型&#xf…

代码随想录训练营Day58| 739. 每日温度 496.下一个更大元素 I

目录 学习目标 学习内容 739. 每日温度 496.下一个更大元素 I 学习目标 739. 每日温度 496.下一个更大元素 I 学习内容 739. 每日温度 739. 每日温度 - 力扣(LeetCode)https://leetcode.cn/problems/daily-temperatures/ class Solution:def da…

Excel VBA编程

前两天我朋友找我帮忙,让给excel做个按钮功能,方便他们表格统计,我晚上研究了一下给他做出来了,这里记录一下入门操作和大概思路,具体怎么写VBA的代码我就不记录了,那玩意儿看教程去吧,也不是这…

【网络】socket套接字

1.理解IP 每台主机都有自己的IP地址,所以当数据从一台主机传输到另一台主机就需要IP地址。报头中就会包含源IP和目的IP。源IP地址:发送数据报那个主机的IP地址,目的IP地址:想发送到的那个主机的IP地址我们把数据从一台主机传递到…

C语言-const关键字

1.const 关键字 const 是 constant 的缩写,const 在实际编程中用得比较多,意思是“恒定不变的”,它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。 (可读,不可写) const 可以修饰变量,数组&a…

光明区马田大围城市更新旧改项目--华润集团

【华润光明马田大围旧改一期项目基础信息】 项目开发商:华润集团 占 地 面 积:约110151㎡ 建 筑 面 积:待专规图 物 业 类 型:华润一期范围内的待拆迁物业 项 目 进 度:直接确权阶段,即将立项 【项目现…

c++ new 源码学习一下

之前有一篇文章介绍了 new 的一些用法 c new 在指定内存上创建对象&#xff0c;今天结合源码来学习一下 new 更详细的用法。相关的源码&#xff1a;gcc git 1&#xff0c;void* operator new (std::size_t size); 我们可以在头文件<new>里看到它的原型&#xff1a; _G…

J2EE 技术的企业人事管理系统的设计与实现(论文+源码)_kaic

目 录 一、引 言 二、相关技术概述 (一) 基于 MVC 设计模式的 J2EE 技术 (二) MySql 数据库管理系统 (三) 基于 B/S 结构的系统安全 三、企业人事管理系统总体设计 (一) 系统需求分析 1.功能结构分解 2.员工档案管理模块 3.员工工资管理模块 (二) 系统总体结构设计 四、企业人…

2023-06-03 陕西省技能大赛 crypto 复现

文章目录 奇怪的sar题目描述&#xff1a;题目分析&#xff1a; Ham3题目描述&#xff1a;题目分析&#xff1a; BigDataEnc题目描述&#xff1a;题目分析&#xff1a; 奇怪的sar 题目描述&#xff1a; from Crypto.Util.number import *key flag{**********}bits 1024 msg …

ESP32+U8G2库显示中文

这里写自定义目录标题 在使用esp32u8g2oled进行中文先显示例程 废话不说&#xff0c;直接上代码 #include <Arduino.h> #include <U8g2lib.h> //软件SPI U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock/ 14, / data/ 13, / cs/ 15, / dc/ 7, / r…

【AI绘图】三、stable diffussion操作界面介绍以及如何使用

上一篇&#xff1a;【AI绘图】二、stable diffusion环境准备与安装 stable diffusion操作界面介绍 操作界面总共分为5大块 1.模型选择区&#xff1b;点击跳转 2.功能区域&#xff1b;点击跳转 3.提示词输入&#xff1b;点击跳转 4.参数设置区&#xff1b;点击跳转 5.出图区点击…