服务发现的基本原理以及如何实现?

Redis实现服务注册与服务发现源码阅读(Go语言) 服务注册与服务发现redis方案源码解读 阅读详情

一、什么是服务发现?

服务发现并没有怎样的高深莫测,它的原理再简单不过。只是市面上太多文章将服务发现的难度妖魔化,读者被绕的云里雾里,顿觉自己智商低下不敢高攀。

服务提供者是什么,简单点说就是一个HTTP服务器,提供了API服务,有一个IP端口作为服务地址。服务消费者是什么,它就是一个简单的进程,想要访问服务提供者提供的服务来干一些事情。一个HTTP服务器既可以是服务提供者对外提供服务,也可以是消费者需要别的服务提供者提供的服务,这就是服务依赖,没有你我就不是我自己。复杂的服务甚至有多个服务依赖。

服务发现有三个角色,服务提供者、服务消费者和服务中介。服务中介是联系服务提供者和服务消费者的桥梁。服务提供者将自己提供的服务地址注册到服务中介,服务消费者从服务中介那里查找自己想要的服务的地址,然后享受这个服务。服务中介提供多个服务,每个服务对应多个服务提供者。

file

服务中介就是一个字典,字典里有很多key/value键值对,key是服务名称,value是服务提供者的地址列表。服务注册就是调用字典的Put方法塞东西,服务查找就是调用字典的Get方法拿东西。

当服务提供者节点挂掉时,要求服务能够及时取消注册,比便及时通知消费者重新获取服务地址。

当服务提供者新加入时,要求服务中介能及时告知服务消费者,你要不要尝试一下新的服务。

二、Redis作为服务中介

Redis里面有丰富的数据结构,拿来存储服务字典再合适不过了。对每一个服务名称,我们用一个set结构存储服务的IP:Port字符串。如果服务提供者加入,调用sadd命令加入服务地址,如果服务挂掉,调用srem命令移除服务地址。对服务消费者使用smembers指令获取所有服务地址然后在消费进程里随机挑一个,或者使用srandmemember指令直接获取随机服务地址。

这个时候你也许会表示怀疑,服务发现真这么简单么?答案是还差一点,关于上面的这个解决方案有几个问题。

第一个问题是服务提供者进程如果被kill -9暴力杀死,不能主动调用srem命令怎么办?

这个时候服务列表中多了一个黑地址指向了不存在的服务而消费者完全不知道,这个时候服务中介就成了黑中介了。那该怎么办呢?

我们引入服务保活和检查机制,并更换数据结构。服务提供者需要每隔5秒左右向服务中介汇报存活,服务中介将服务地址和汇报时间记录在zset数据结构的value和score中。服务中介需要每隔10秒左右检查zset数据结构,踢掉汇报时间严重落后的服务地址项。这样就可以准实时地保证服务列表中服务地址的有效性。

第二个问题是服务列表变动时如何通知消费者。有两种解决方案。

第一种是轮询,消费者需要每隔几秒查询服务列表是否有改变。如果服务很多,服务列表很大,消费者很多,redis会有一定压力。所以这时候可以引入服务列表的版本号机制,给每个服务提供一个key/value设置服务的版本号,就是在服务列表发生变动时,递增这个版本号。消费者只需要轮询这个版本号的变动即可知道服务列表是否发生了变化。因为服务列表比较稳定,仅在网络严重抖动的情况下才会频繁发生变动,所以redis几乎没有压力。

第二种是采用pubsub。这种方式及时性要明显好于轮询。缺点是每个pubsub都会占用消费者一个线程和一个额外的redis连接。为了减少对线程和连接的浪费,我们使用单个pubsub广播全局版本号的变动。所谓全局版本号就是任意服务列表发生了变动,这个版本号都会递增。接收到版本变动的消费者再去检查各自的依赖服务列表的版本号是否发生了变动。这种全局版本号也可以用于第一种轮询方案。

第三个问题是redis是单点的,如果挂掉了怎么办?

这是个大问题。正是因为这个问题的存在,流行的服务发现系统都是使用分布式数据库zookeeper/etcd/consul等来作为服务中介,它们是分布式的多节点的,挂掉了一个节点没关系,系统仍然可以正常工作。

file

那如果整个zk集群挂掉会怎样呢?其实每个服务消费者在本地内存里都会存一份当前的服务列表,即使服务中介集群挂掉,也是可以使用当前的服务列表正常工作的。

那redis作为服务中介就真的不靠谱了么?其实还有个redis-sentinel可以消除redis的单点问题,redis-sentinel可以在主节点挂掉的时候,自动升级从节点为主节点。所以拿redis干这件事也是可以的。用redis干服务发现确实非常简单,虽然这种方式非常不流行。

三、服务提供者不只是HTTP服务

上面提到服务提供者简单来说就是HTTP服务器,其实服务多种多样。可以是数据库服务,可以是RPC服务,可以是UDP服务等等。

如果是MySQL数据库,那如何将MySQL服务注册到服务中介呢?原生的MySQL可没有提供这样功能。一般做法是提供一个Agent代理去注册。这个代理除了将服务地址注册到服务中介外,还需要监控MySQL的健康状况,以便当MySQL宕机时能及时切换到新的MySQL服务地址。一般这个Agent为了节省资源而不止监控一个数据库,它可以同时监控多个数据库,甚至是多种数据库。

四、服务配置重加载

服务发现一般只是用来注册和查找服务列表这样一个比较单纯的功能。不过现代的服务发现系统还会集成服务配置管理功能。这样可以实现服务配置的实时重加载。原理也很简单,就是对于每一个服务项,服务中介还会存储一个单独的key/value用来存储这个服务的配置信息。当这个配置项在后台被修改时,服务中介会实时通知相关服务器变更配置信息。比如数据库地址变动,业务参数修改等。

五、服务管理后台

为了便于服务管理,一般服务发现还会提供一个服务管理后台,用于管理人员查看服务集群的状态。如果服务注册和汇报时提供冗余的配置信息,服务管理后台就可以呈现更为详细的服务信息。服务管理后台还可以将所有的服务依赖组织起来,呈现出一颗漂亮的服务依赖树。

六、服务发现的一个简单实现

小编在闲暇之余基于Redis实现了一个简单的服务发现系统Captain。读者可以去github上下载这个项目进行学习。我除了编写了服务发现的服务器之外,客户端sdk也一块做了开发,可能不太稳定,希望读者体谅,不要用于线上的业务系统。

file

在Captain这个项目里,我的服务发现服务器将Redis提供的服务做了一层封装,对外提供HTTP API进行服务的注册和查找,没有使用上文提到的pubsub功能。

如何一起学习,有没有免费资料?

file

本文由博客一文多发平台 OpenWrite 发布!

云原生领域 Eureka 的服务发现的网络隔离与安全防护 本文旨在全面探讨云原生环境下Eureka服务发现的网络隔离与安全防护机制。随着微服务架构的普及,服务发现作为微服务通信的基础设施,其安全性和可靠性变得至关重要。本文将涵盖从基础概念到高级安全策略的完整知识体系,为架构师和开发者提供实用的安全实践指南。文章首先介绍Eureka的基本概念和架构,然后深入分析网络隔离的必要性和实现方式,接着探讨安全防护的各种策略,最后通过实际案例展示如何应用这些安全措施。Eureka: Netflix开源的服务发现框架,用于在云环境中实现服务的注册与发现服务注册。 阅读详情

相关推荐

vue3+ts项目里如何使用状态管理pinia以及数据持久化

vue3 pinia 数据持久化

ICUiseeyou的博客 8795

服务发现的基本原理

请原谅我使用了链家的图标,小编真不是给房产中介来打广告的。什么是服务发现?服务发现并没有怎样的高深莫测,它的原理再简单不过。只是市面上太多文章将服务发现的难度妖魔化,读者...

codehole_的博客 636

全网最全医学图像数据汇总

本仓库汇总了多个领域的医学图像开源数据集,涵盖CT、MRI、超声、内窥镜、病理、多模态、PET、OCT以及皮肤镜等多种成像技术。每个数据集均详细列出了任务类型、部位、格式、数量及下载链接,旨在为医学图像研究者提供便捷的资源导航。⚠️:这些数据集仅适用于学术研究用途。

2401_83173765的博客 3319

微服务实践(四):服务发现的可行方案以及实践案例

点击这里获取云原生干货 这是关于使用微服务架构创建应用系列的第四篇文章。第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点。第二和第三篇描述了微服务架构内部的通讯机制。这篇文章中,我们将会探讨服务发现相关问题。 为什么要使用服务发现? 设想一下,我们正在写代码使用了提供REST API或者Thrift API的服务,为了完成一次服务请求,代码需要知道服务实例的网络位置(IP地址和端口)。传统应用都运行在物理硬件上,服务实例的网络位置都是相对固定的。例如,代码可以从一个经常变更的配置文件中读取网络位置

云原生之家 566

解决Linux下Questasim中代码字体非常小

Questasim的source窗口里代码字体非常小 你是不是也遇到这样的问题,在使用Vmware时,Questasim的代码字体非常小,小到完全看不见,连断点都没办法标记。 下面我给出我摸索好久的解决办法,分享给大家。 1.首先,版本是Questasim 10.7c,在Vmware16中打开,情况如下: 不多逼逼,直接上图开搞: 给textFontV2设置值:monospace 12 normal roman 这里一定要注意啦,点完apply之后,不要点ok,直接关闭窗口。 ...

SummerXRT的博客 7819

【stata基础代码大全 】 可独立完成一篇实证

用stata打开,直接替换自己需要的变量就行,小白友好❗️❗️❗️。八、八.中介效应检验:路径分析(三种方法)第二种方法即Sobel-Goodman检验。*(7)Winsor处理,剔除异常值。六、内生性问题解决方法(附具体模型)其三,工具变量:两阶段最小二乘。第三种方法即Bootstrap检验。二、Stata中数据的基本处理。*(5)生成行业、年度虚拟变量。PSM1————近邻匹配。七、调节效应检验:机制分析。*(2)剔除数据中的样本。*(4)给变量添加标签。*(3)生成新的变量。*(6)基本数据匹配。

J_Giser的博客 8025

基于 Redis 发布订阅实现服务注册与发现

Redis发布订阅的详解并基于发布订阅进行服务注册与发现

面向生活编程 1831

零基础入门simulink1000例--第112例:在 Simulink 中构建一个基本的相控阵雷达波束形成系统仿真模型

摘要:本文详细介绍了使用Simulink实现相控阵雷达波束形成技术的完整流程。从创建Simulink模型、设计天线阵列、信号生成,到波束形成算法实现和结果可视化,涵盖了关键步骤。文章重点讲解了均匀线性阵列的设计、线性调频信号生成、相位偏移计算等核心技术,并提供了MATLAB代码示例。通过Scope或ArrayPlot模块进行结果分析,最终可导出为嵌入式代码部署。该系统展现了电子扫描波束的技术优势,为雷达系统设计提供了有效的仿真方法。

amy_mhd的博客 212

redis 学习笔记(一)

文章目录redis存储的数据类型redis 关键技术事件循环逐出过期持久化主从复制(异步操作:写入成功即成功)pipelinemgetredis集群:一致性 hash & redis clusterredis 客户端: 服务发现什么是服务发现redis 客户端: failoverredis 延迟删除&双机房删除redis 分布式锁 本笔记主要涉及学习 redis 过程中做的一些笔记,包含最初比较浅显的了解(所以会有一些比较简单的笔记描述),到后面对其应用的逐渐学习和补齐。其中主要参考书籍为

LynnWonder 634

详解大端模式和小端模式

详解大端模式和小端模式 一、大端模式和小端模式的起源         关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令

ce123的技术博客 19万+

【二】MADDPG多智能体算法实现(parl)【追逐游戏复现】

论文全称:Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments 论文原文:https://download.youkuaiyun.com/download/sinat_39620217/16203960 论文翻译:https://blog.youkuaiyun.com/qiusuoxiaozi/article/details/79066612 ...

丨汀、的博客 2万+

文末赠书 | 服务发现的基本原理以及如何实现?


 
 
 
 
 
 
 作者:老钱出处:微信公众号--码洞一、什么是服务发现?服务发现并没有怎样的高深莫测,它的原理再简单不...

Java后端技术 931

【RT-DETR有效改进】利用ASF-YOLO改进特征融合层(附代码 + 详细教程)

本文给大家带来的改进机制是ASF-YOLO(发布于2023.12月份的最新机制),其是特别设计用于细胞实例分割。这个模型通过结合空间和尺度特征,提高了在处理细胞图像时的准确性和速度。在实验中,ASF-YOLO在2018年数据科学竞赛数据集上取得了卓越的分割准确性和速度,达到了0.91的box mAP(平均精度),0.887的mask mAP,以及47.3FPS的推理速度,效果非常的好,这个结构本来是用于分割的,我将其移植到了目标检测的模型上,所以其可以适用于分割和目标检测。

Snu77的博客 2296

Zookeeper(63)Zookeeper如何实现服务发现?

添加依赖:在项目中添加 Zookeeper 的依赖。实现 ZookeeperClient 类:负责连接和关闭 Zookeeper 客户端,并提供获取ZooKeeper实例的方法。实现 ServiceRegistry 类:负责实现服务注册的逻辑。实现 ServiceDiscovery 类:负责实现服务发现的逻辑。测试服务发现:通过运行多个实例来测试服务发现的功能。通过以上方法,可以在 Zookeeper 中实现服务发现,确保其高效稳定地运行。根据实际情况和需求,选择适合你的实现方法并进行实施。

qq_43012298的博客 1159

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Eureka 服务发现原理及实践

Eureka 是 Netflix 的一款服务发现框架,它基于 REST 服务实现,用于定位服务,以实现云端中间层服务发现和故障转移。Eureka 包含两个组件:Eureka Server 和 Eureka Client。:提供服务注册中心的功能。:是一个 Java 客户端,用于简化与 Eureka Server 的交互;客户端同时具备服务提供者和服务消费者的角色。

qq_42072014的博客 1125

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

STM32C5深度评测:CubeMX2工具链与低功耗设计实战

随着物联网设备对能效和集成度的要求不断提高,MCU选型不再只看主频,而是更关注功耗管理、模拟采集链路与工具链的协同效率。STM32C5作为ST新一代高集成度MCU,在时钟树、PLL灵活性和低功耗模式上做了优化,结合CubeMX2引入的中间描述层,让开发者能够以更接近硬件资源的方式配置工程。其内部ADC支持多通道DMA采集,在连续采样下仍能保持出色能效,适合电池供电的传感器节点、电机控制等场景。基于实测数据,C5在深度停止和待机模式下的电流表现接近手册值,但GPIO漏电与调试器连接问题需要留意。整体而言,ST

weixin_34184561的博客 276

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

服务发现思想及原理

头一听这个名词觉得很高级,其实理解了原理思想和他的应用就觉得不是那么高深。下面听我娓娓道来。 没有服务发现情况下 首先看下面这个单服务器模式: 多服务器版: 客户端与服务器连接有一个基本的要求,不管是长连接还是短连接,客户端都需要知道服务器的ip和port。 如果服务器很多,你要把所有的服务器配置都写在配置文件中。 如果增删服务器,那你还要去刷新客户端的配置文件,怎么刷新呢?如果是长连接,那么可以由服务器发送,但是如果是短连接呢? 可以实现,但是很复杂。 加入服务发现 服务发现基本原理: 在客户端和服

Monday__Friday的博客 626

跟我学Spring Cloud(Finchley版)-04-服务注册与服务发现-原理剖析

第2节( 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 )说过: 地址硬编码问题——电影微服务中将用户微服务的地址写死,如果用户微服务地址发生变化,难道要重新上线电影微服务吗? 本节来解决该问题。 不妨先思考一下,怎样才能让服务消费者总能找到服务提供者呢?或者说,怎样才能让服务消费者感知到服务提供者地址的变化呢? TIPS 目前市面上把服务消费者找到服务提供者的这...

ITMuch的专栏 279

SSDP,简单服务发现技术

SSDP,简单服务发现技术 SSDP:Simple Sever Discovery Protocol,简单服务发现协议,此协议为网络客户提供一种无需任何配置、管理和维护网络设备服务的机制。此协议采用基于通知和发现路由的多播发现方式实现。协议客户端在保留的多播地址:239.255.255.250:1900(IPV4)发现服务,(IPv6 是:FF0x::C)同时每个设备服务也在此地

zxh2075的专栏 1363

服务注册与发现的原理和实现

什么是服务注册发现? 对于搞微服务的同学来说,服务注册、服务发现的概念应该不会太陌生。 简单来说,当服务A需要依赖服务B时,我们就需要告诉服务A,哪里可以调用到服务B,这就是服务注册发现要解决的问题。 Service B把自己注册到Service Registry叫做服务注册 Service A从Service Registry发现Service B的节点信息叫做服务发现 服务注册 服务注册是针对服务端的,服务启动后需要注册,分为几个部分: 启动注册 定时续期 退出撤...

java_xiaoo的博客 708

一些基本原理,面试可以用的上

Eureka是Netflix开源的服务发现组件,主要用于AWS云平台上的服务注册和发现。RocketMQ中生产者生产的消息会放置在某个队列中,基于队列先进先出的特性天然的可以保证存入队列的消息顺序和拉取的消息顺序是一致的,因此,我们只需要保证一组相同的消息按照给定的顺序存入同一个队列中,就能保证生产者有序存储。普通发送消息的模式下,生产者会采用轮询的方式将消费均匀的分发到不同的队列中,然后被不同的消费者消费,因为一组消息在不同的队列,此时就无法使用RocketMQ带来的队列有序特性来保证消息有序性。

qq_49224567的博客 276

简单服务发现协议SSDP【转】

来自:https://blog.youkuaiyun.com/wuruixn/article/details/23843877 SSDP:Simple Sever Discovery Protocol,简单服务发现协议是一种应用层协议(常用于寻找upnp设备),此协议为网络客户提供一种无需任何配置、管理和维护网络设备服务的机制。此协议采用基于通知和发现路由的多播发现方式实现。协议客户端在保留的多播地址:23...

shareinfo2018 2665

python netty_RPC基本原理以及如何用Netty来实现RPC

前言在微服务大行其道的今天,分布式系统越来越重要,实现服务化首先就要考虑服务之间的通信问题。这里面涉及序列化、反序列化、寻址、连接等等问题。。不过,有了RPC框架,我们就无需苦恼。一、什么是RPC?RPC(Remote Procedure Call)— 远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。值得注意是,两...

weixin_39757626的博客 551

理解基于 docker 的现代化的服务发现

糙译,[Warning] 继续阅读可能会感到不适 人一生不可能踩到同一滩大便,故而,本文会持续修改。 Understanding Modern Service Discovery with Docker Over the next few posts, I'm going to be exploring the concepts ...

weixin_34228662的博客 142

【服务治理中间件】consul介绍和基本原理

Consul是一个服务网格解决方案,提供了一个功能齐全的控制平面,具有服务发现、配置和分段功能。这些功能中的每一项都可以根据需要单独使用,也可以一起使用来构建一个完整的服务网格。Consul需要一个数据平面,并支持代理和原生集成模型。Consul提供了一个简单的内置代理,因此一切都可以开箱即用,但也支持第三方代理集成,如Envoy。Consul的主要功能有:服务发现: Consul的客户端可以注册一个服务,比如api或mysql,其他客户端可以使用Consul来发现特定服务的提供者。

2509_94088049的博客 545
上一篇: 微服务设计我们需要考虑哪些要点?
下一篇: Java分布式开发不得不知的Dubbo技术详细介绍
JavaAQA
博客等级 码龄7年 1粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值