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

Eureka原理与实现详解:从入门到精通! Eureka是一种常用的服务发现框架,广泛应用于分布式系统和微服务架构中。本博客将为你介绍Eureka的工作原理,以及如何使用Eureka实现服务注册和发 学习教程(传送门)本人详解作者:王文峰,参加过 优快云 2020年度博客之星,《Java王大师王天师》公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯转载说明:务必注明来源(注明:作者:王文峰哦)Eureka原理与实现详解:从入门到精通!学习教程(传送门)学习教程(传送门)往期文章Eureka是一种常用的服务发现框架,广泛应用于分布式系统和微服务架构中。 阅读详情

什么是服务注册发现?

对于搞微服务的同学来说,服务注册、服务发现的概念应该不会太陌生。

简单来说,当服务A需要依赖服务B时,我们就需要告诉服务A,哪里可以调用到服务B,这就是服务注册发现要解决的问题。

  • Service B 把自己注册到 Service Registry 叫做 服务注册
  • Service A 从 Service Registry 发现 Service B 的节点信息叫做 服务发现

服务注册

服务注册是针对服务端的,服务启动后需要注册,分为几个部分:

  • 启动注册
  • 定时续期
  • 退出撤销

启动注册

当一个服务节点起来之后,需要把自己注册到 Service Registry 上,便于其它节点来发现自己。注册需要在服务启动完成并可以接受请求时才会去注册自己,并且会设置有效期,防止进程异常退出后依然被访问。

定时续期

定时续期相当于 keep alive,定期告诉 Service Registry 自己还在,能够继续服务。

退出撤销

当进程退出时,我们应该主动去撤销注册信息,便于调用方及时将请求分发到别的节点。同时,go-zero 通过自适应的负载均衡来保证即使节点退出没有主动注销,也能及时摘除该节点。

服务发现

服务发现是针对调用端的,一般分为两类问题:

  • 存量获取
  • 增量侦听

还有一个常见的工程问题是

  • 应对服务发现故障

当服务发现服务(比如 etcd, consul, nacos等)出现问题的时候,我们不要去修改已经获取到的 endpoints 列表,从而可以更好的确保 etcd 等宕机后所依赖的服务依然可以正常交互。

存量获取

当 Service A 启动时,需要从 Service Registry 获取 Service B 的已有节点列表:Service B1, Service B2, Service B3,然后根据自己的负载均衡算法来选择合适的节点发送请求。

增量侦听

上图已经有了 Service B1, Service B2, Service B3,如果此时又启动了 Service B4,那么我们就需要通知 Service A 有个新增的节点。如图:

应对服务发现故障

对于服务调用方来说,我们都会在内存里缓存一个可用节点列表。不管是使用 etcd,consul 或者 nacos 等,我们都可能面临服务发现集群故障,以 etcd 为例,当遇到 etcd 故障时,我们就需要冻结 Service B 的节点信息而不去变更,此时一定不能去清空节点信息,一旦清空就无法获取了,而此时 Service B 的节点很可能都是正常的,并且 go-zero 会自动隔离和恢复故障节点。

服务注册、服务发现的基本原理大致如此,当然实现起来还是比较复杂的,接下来我们一起看看 go-zero 里支持哪些服务发现的方式。

go-zero 之内置服务发现

go-zero 默认支持三种服务发现方式:

  • 直连
  • 基于 etcd 的服务发现
  • 基于 kubernetes endpoints 的服务发现

直连

直连是最简单的方式,当我们的服务足够简单时,比如单机即可承载我们的业务,我们可以直接只用这种方式。

在 rpc 的配置文件里直接指定 endpoints 即可,比如:

Rpc:
  Endpoints:
  - 192.168.0.111:3456
  - 192.168.0.112:3456

zrpc 调用端就会分配负载到这两个节点上,其中一个节点有问题时 zrpc 会自动摘除,等节点恢复时会再次分配负载。

这个方法的缺点是不能动态增加节点,每次新增节点都需要修改调用方配置并重启。

基于 etcd 的服务发现

当我们的服务有一定规模之后,因为一个服务可能会被很多个服务依赖,我们就需要能够动态增减节点,而无需修改很多的调用方配置并重启。

常见的服务发现方案有 etcd, consul, nacos 等。

go-zero内置集成了基于 etcd 的服务发现方案,具体使用方法如下:

Rpc:
  Etcd:
     Hosts:
     - 192.168.0.111:2379
     - 192.168.0.112:2379
     - 192.168.0.113:2379
     Key: user.rpc
  • Hosts 是 etcd 集群地址
  • Key 是服务注册上去的 key

基于 Kubernetes Endpoints 的服务发现

如果我们的服务都是部署在 Kubernetes 集群上的话,Kubernetes 本身是通过自带的 etcd 管理集群状态的,所有的服务都会把自己的节点信息注册到 Endpoints 对象,我们可以直接给 deployment 权限去读取集群的 Endpoints 对象即可获得节点信息。

  • Service B 的每个 Pod 启动时,会将自己注册到集群的 Endpoints 里
  • Service A 的每个 Pod 启动时,可以从集群的 Endpoints 里获取 Service B 的节点信息
  • 当 Service B 的节点发生改变时,Service A 可以通过 watch 集群的 Endpoints 感知到

在这个机制工作之前,我们需要配置好当前 namespace 内 pod 对集群 Endpoints 访问权限,这里有三个概念:

  • ClusterRole
    • 定义集群范围的权限角色,不受 namespace 控制
  • ServiceAccount
    • 定义 namespace 范围内的 service account
  • ClusterRoleBinding
    • 将定义好的 ClusterRole 和不同 namespace 的 ServiceAccount 进行绑定

具体的 Kubernetes 配置文件可以参考 这里,其中 namespace 按需修改。

注意:当启动时报没有权限获取 Endpoints 时记得检查这些配置有没落实 :)

zrpc 的基于 Kubernetes Endpoints 的服务发现使用方法如下:

Rpc:
  Target: k8s://mynamespace/myservice:3456

其中:

  • mynamespace:被调用的 rpc 服务所在的 namespace
  • myservice:被调用的 rpc 服务的名字
  • 3456:被调用的 rpc 服务的端口

在创建 deployment 配置文件时一定要加上 serviceAccountName 来指定使用哪个 ServiceAccount,示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: alpine-deployment
  labels:
    app: alpine
spec:
  replicas: 1
  selector:
    matchLabels:
      app: alpine
  template:
    metadata:
      labels:
        app: alpine
    spec:
      serviceAccountName: endpoints-reader
      containers:
      - name: alpine
        image: alpine
        command:
        - sleep
        - infinity

注意其中 serviceAccountName 指定该 deployment 创建出来的 pod 用哪个 ServiceAccount。

server 和 client 都部署到 Kubernetes 集群里之后可以通过以下命令滚动重启所有 server 节点

kubectl rollout restart deploy -n adhoc server-deployment

利用如下命令查看 client 节点日志:

kubectl -n adhoc logs -f deploy/client-deployment --all-containers=true

可以看到我们的服务发现机制完美跟进了 server 节点的变化,并且在服务更新期间没有出现异常请求。

完整代码示例见 https://github.com/zeromicro/zero-examples/tree/main/discovery/k8s

下一篇文章我将讲解在 go-zero 里如何实现基于 consul, nacos 等的服务注册发现,敬请期待!

Buck电源设计常见的一些问题(一)半桥栅极驱动芯片共性失效问题 半桥驱动芯片主要用在器件可应用于电信,数据通信,便携式存储或更低电压系统中的电源转换器,半桥、全桥、推挽、同步降压,正激变换器和同步整流器等方面。当然难免会遇到不少问题。基本上我们在产品开发的过程中都遇到过栅极驱动芯片坏掉的情况,所以找了一些资料,学习学习。也查找查找原因。 阅读详情

相关推荐

华为HCIP-001:PPPOE配置模拟实验

华为HCIP01:PPPOE配置模拟实验 实验环境 pppoe-client上面的接口信息 [AR1]dis ip interface brief *down: administratively down ^down: standby (l): loopback (s): spoofing The number of interface that is UP in Physical is 2 The number of interface that is DOWN in Physical is 1 Th

兔子乖乖 1798

服务注册与发现原理

服务注册与发现

leo_jk的博客 1123

医学图像处理入门:如何用Python将CT灰度图转换为伪彩色图像(附代码)

本文详细介绍了如何使用Python将CT灰度图转换为伪彩色图像,提升医学图像的可读性和诊断效率。通过OpenCV和Matplotlib等工具,实现灰度值到彩色空间的映射,特别适用于突出显示特定组织密度差异。文章包含完整代码示例和临床实用技巧,适合医学影像分析初学者和Python开发者。

gitlab7runner的博客 326

深入了解服务注册与服务发现

1. 什么是服务注册与发现 我们先来看下什么是服务注册与服务发现? 服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul)。 服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。 你可以理解为: //服务注册 NameServer->register(ne...

mmgithub123的博客 8632

I-Cache 和 D-Cache

I-Cache 和 D-Cache

liuyuanbin9001 7022

一种基于因果干预的少样本学习的故障诊断模型

本文提出CIRNet,一种融合元学习与因果干预的少样本故障诊断框架。针对传统方法易学习伪相关特征的问题,CIRNet通过构建结构因果模型,采用类级和特征级双调整策略消除先验知识干扰。实验在多个轴承/齿轮数据集上验证其有效性,在跨组件任务中准确率最高达93.41%,特征可视化显示更好的类可分性。相比现有方法,CIRNet显著提升了模型泛化能力和可解释性。

hasakie的博客 956

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

服务注册: 当provider启动的时候,连接zk集群,便会在zk集群中创建瞬时节点。将自己的url保存到瞬时节点中。 当provider出现宕机,某个服务器的url就会减少,瞬时节点就会自动减少。该服务器重启回复正常,便会重新生成瞬时节点,将该服务器存储的url又重新添加到zk集群中。 服务发现: 当consumer启动的时候,连接zk集群,会获...

刘刘刘刘刘牛皮的博客 428

拆解歌尔2718硅麦:2.75mm超小封装背后的MEMS技术解析

本文深度解析歌尔2718硅麦的2.75mm超小封装技术,探讨MEMS麦克风在微型化过程中的声学性能与结构可靠性平衡。通过ASIC芯片堆叠、纳米级应力控制等创新技术,歌尔2718在TWS耳机和智能手机中实现卓越性能,同时克服微型化带来的声学挑战。

weixin_28292761的博客 610

服务注册与发现-全搞懂

本文从原理和实现角度详细介绍服务发现

高性能架构探索 8623

晶闸管选型参数,结构原理,工艺与注意问题总结

闸管(Thyristor)是一种半导体开关器件,也被称为可控硅整流器(SCR, Silicon Controlled Rectifier)。它可以在高电压和大电流条件下工作,常被用于交流电的控制和整流。本文对晶闸管的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1284

Simulink智能驾驶场景探索:自动泊车系统设计与验证

自动泊车系统(APS)传感器模块:用于检测车辆周围的障碍物和其他车辆的位置。路径规划模块:根据传感器数据生成最优的泊车路径。控制器模块:根据路径规划结果生成转向角、速度等控制信号。执行器模块:根据控制器生成的信号调整车辆的方向盘、油门和刹车。在本实例中,我们将使用超声波传感器和摄像头来检测车辆周围的环境,并使用PID控制器实现自动泊车功能。通过本教程,我们介绍了如何使用 Simulink 进行自动泊车系统的仿真。背景介绍:理解自动泊车系统及其在智能驾驶中的应用。所需工具和环境。

MHD0815的博客 506

nacos服务注册和发现原理简单实现案例

Nacos(Naming and Configuration Service)是阿里巴巴开源的服务发现和配置管理平台。下面将介绍Nacos服务注册和发现的原理,并进行简单的源码分析。

猿脑2.0的博客 1264

FastAPI 高级特性:同异步路由函数、依赖注入与后台任务

在现代 Web 开发中,高效的性能和简洁的代码结构是至关重要的。FastAPI 作为一个现代、快速(高性能)的 Web 框架,凭借其对异步编程的原生支持和直观的依赖注入系统,迅速成为开发者的热门选择。在本文中,将深入探讨 `FastAPI` 中的几个核心概念:同异步函数的区别、`Depends` 依赖以及后台任务。

qq_43629857的博客 203

JAVA面试题分享一百六十九:Nacos的原理是什么?它是如何实现服务注册和发现的?

再讲Nacos之前,先来讲一下服务注册和发现。我们知道,现在微服务架构是目前开发的一个趋势。服务消费者要去调用多个服务提供者组成的集群。服务消费者需要在本地配置文件中维护服务提供者集群的每个节点的请求地址。服务提供者集群中如果某个节点宕机,服务消费者的本地配置中需要同步删除这个节点的请求地址,防止请求发送到已经宕机的节点上造成请求失败。服务地址的管理。服务注册。服务动态感知。而Nacos致力于解决微服务中的统一配置,服务注册和发现等问题。Nacos集成了注册中心和配置中心。

之乎者也·的博客 2451

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机控制技术及应用

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

Spring Cloud 实现服务注册和发现的原理是什么

通过上述机制,Spring Cloud构建了一个健壮且灵活的服务治理体系,实现了服务注册与发现的核心功能,在微服务架构中保证了服务间的高可用性和可扩展性。

qq_33240556的博客 903

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

服务注册与发现的原理和实现,java面试实录

当一个服务节点起来之后,需要把自己注册到上,便于其它节点来发现自己。注册需要在服务启动完成并可以接受请求时才会去注册自己,并且会设置有效期,防止进程异常退出后依然被访问。

2401_87555310的博客 900

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️

Eureka是Spring Cloud中的一个服务注册和发现组件,它采用了客户端-服务器的架构设计。 Eureka的核心概念 Eureka Server(注册中心):它是服务注册中心,负责接收和存储服务实例的注册信息,并提供服务发现的功能。 Eureka Client(服务实例):它是一个运行在各个服务实例中的客户端,用于将自身的服务注册到Eureka Server,并定期向Eureka Server发送心跳信息以保持注册状态。

终于等到你啦~欢迎来到我的知识空间 这里是苏泽的成神之路 6295

aws-cli服务发现机制:动态加载和注册AWS服务的实现原理

AWS CLI(Command Line Interface)作为Amazon Web Services的统一命令行工具,其核心能力之一就是能够动态发现、加载和注册数百个AWS服务。这种服务发现机制使得开发者无需手动配置即可访问所有AWS服务,大大提升了开发效率和用户体验。 本文将深入解析aws-cli的服务发现机制,重点探讨其动态加载和注册AWS服务的实现原理。 ## 核心架构设计 aws...

gitblog_00892的博客 919

zookeeper实现服务注册与发现、分布式锁、配置中心以及集群选举的原理和实践

服务注册与发现: 所谓的服务注册与发现,就是提供服务的服务进行注册,使用服务的服务进行发现。 例如一个应用有两个模块,订单和产品,做成分布式的两个服务,订单需要获取产品中的服务 这个时候,产品服务需要将自身的信息(ip和port)添加到zk中去,这个过程就叫做服务注册。 实现: 首先,一个产品服务在启动的时候,会获取自身的IP地址和服务的port,然后连接zk服务端,在某个特定的目录下,...

超域的博客 706

Nacos 服务注册与发现原理分析

转载:https://www.jianshu.com/p/61608ff86344 2020博客地址汇总 2019年博客汇总 Nacos 另一个非常重要的特性就是服务注册与发现,说到服务的注册与发现相信大家应该都不陌生,在微服务盛行的今天,服务是非常重要的,而在 Nacos 中服务更被称为他的一等公民。 Nacos 支持几乎所有主流类型的 “服务” 的发现、配置和管理。 了解过 Dubbo 的同学,应该对 Dubbo 的架构非常熟悉,最经典的一张架构图如下所示: dubbo-arch..

架构师的成长之路的博客 3257

Java中的服务注册与发现原理与实现

通过本文,我们详细介绍了Java中服务注册与发现的原理和实现方式,以及常用的开源框架如Netflix Eureka和Consul。在微服务架构中,服务通常以多个小型服务的形式部署,每个服务都有一个动态的网络地址。服务注册与发现机制允许服务在启动时向注册中心注册自己的网络位置(IP地址和端口),并且其他服务可以通过查询注册中心来发现和通信。Netflix Eureka是一个开源的服务发现框架,它提供了服务注册和发现的能力,是Spring Cloud架构中的核心组件之一。

微赚淘客系统开发者博客 636

服务注册和发现是什么意思?Spring Cloud 如何实现?

服务注册与发现是一种用于管理微服务架构中众多服务实例的机制。在微服务架构中,一个应用通常由多个小型服务组成,这些服务可能会动态地启动、停止或扩展。服务注册和发现的目的就是让各个服务能够及时了解其他服务的存在和位置,以便进行相互通信和协作。服务注册和发现是微服务架构中的关键环节,它使得服务之间能够动态地发现和调用彼此。Spring Cloud 通过 Netflix Eureka 等组件提供了强大的服务注册与发现功能,大大简化了微服务架构的开发和管理。

我爱娃哈哈的专栏 1127

【Spring Cloud】深入理解 Eureka 注册中心的原理、服务的注册与发现

在微服务架构中,服务的注册与发现是至关重要的一环。为了实现这一目标,Eureka 注册中心应运而生。在本篇文章中,我们将深入理解 Eureka 注册中心的原理,以及探讨服务的注册与发现机制。在微服务的协作中,服务之间的远程调用是常见的需求。然而,使用传统的 RestTemplate 远程调用方式存在一些问题,例如耦合度高、维护困难等。为了解决这些问题,我们将探讨如何利用 Eureka 注册中心来优雅地进行服务的注册与发现,从而更好地构建微服务架构。

qq_61635026的博客 2732
上一篇: 小白也能看懂的dubbo3应用级服务发现详解
下一篇: 亿级流量架构怎么做资源隔离?写得太好了!
在酒吧写代码
博客等级 码龄7年 210粉丝 330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值