首页 > 其他分享 >dubbo3.2注册中心注册逻辑

dubbo3.2注册中心注册逻辑

时间:2024-03-28 15:31:10浏览次数:22  
标签:Dubbo 逻辑 dubbo3.2 服务 中心 dubbo 注册 我们

一 介绍

Dubbo支持多种服务调用方法,包括远程过程调用、负载均衡和容错等,并且提供可视化的服务管理和监控功能。
Dubbo的核心组件之一就是注册中心。在Dubbo的体系架构中,服务提供者在启动时向注册中心注册其提供的服务,并且服务消费者在启动时向注册中心订阅其需要的服务。
而在服务提供者或消费者宕机、网络分隔、或者其他出现故障时,注册中心可以感知并通知相应的消费者或者提供者。 注册中心在Dubbo系统中占据了重要的地位,它实现了服务的动态发布和引用,使得系统可以在运行时对服务进行灵活的扩展和削减。
此外,通过注册中心,可以对系统的运行状态进行集中式的监控和管理。 ZooKeeper常被用作Dubbo的注册中心,它是一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,可以提供基于类似于文件系统的目录节点树方式的数据存储。ZooKeeper中的数据模型允许Dubbo的服务提供者和消费者以树形结构的形式进行数据的注册和订阅,从而完成服务的动态发现和使用。

有什么用

在Dubbo微服务架构中,注册中心扮演着至关重要的角色。它主要负责服务的注册、发现以及服务元数据的存储,承担着整个系统中的"信息中枢"角色。
以下是注册中心在Dubbo中的核心作用:

  1. 服务注册:Dubbo提供的所有服务,在启动时都会先在注册中心进行注册。每个服务都会提供一些元信息,如服务IP、端口号、服务版本、服务分组等。
  2. 服务发现:当服务消费者需要调用某个服务时,会向注册中心询问所需服务的相关信息,注册中心根据服务名找到对应的提供者列表并返回,从而使得服务消费者能够根据这些信息进行服务调用。
  3. 服务元数据存储:注册中心会保存所有注册服务的元信息,包括服务提供者信息、服务消费者信息以及每个服务的调用关系等。
  4. 服务健康检查:注册中心时刻监控注册在其上的服务,一旦服务提供者出现故障或失去联系,注册中心会立即从提供者列表中移除,防止消费者调用已经失效的服务。
  5. 负载均衡: 注册中心还会根据各服务提供方的压力情况,为服务消费者提供负载均衡的建议,帮助消费者更好地选择合适的服务提供者。
  6. 配置管理: 注册中心还可以实现一些动态配置的管理,如动态路由、动态配置等。

通过以上作用,注册中心提供了一种机制,使得微服务之间能够相互发现、管理以及协同工作,极大地提升了整个微服务体系的灵活性和可靠性。

到底存了什么

本篇来带大家分析一下,dubbo使用注册中心,到底存了什么东西,作用是什么?
我们怎么分析呢,很简单,我们本地启动一个zookeeper,然后启动一个demo服务的dubbo provider看看到底有哪些信息存储进去了。
我们可以启动我们demo项目里面的provider,然后我们启动本地的zk,如果没有zookeeper,可以去官网下载一个。修改conf的zoo_sample.cfg改成zoo.cfg,再把里面data.dir修改一下,启动即可。
启动并且运行provider和consumer后,dubbo生成了一下目录,请看图。
image.png
下面我们来对图进行分析,形成了一张表格:

路径(/dubbo/)描述dubbo3新增
org.apache.xxxService之前就有的2.x的,里面有providers的信息,consumer的信息、路由信息等等。providers如果断开,则会删除对应的节点。
config在Dubbo 3中,增加了全局/共享的配置管理。dubbo/config路径下主要存储一些服务消费者和服务提供者共享的配置信息,例如一些全局参数,提供者的策略,路由规则等。这些配置信息将被所有的服务消费者和服务提供者共享。
mappingdubbo/mapping在Dubbo 3中扮演了一个关键的角色,特别是在支持多语言服务调用和精细化服务治理方面。这个注册中心路径用于存储服务接口方法与其对应的唯一标识之间的映射关系,这种设计使得Dubbo能够在多语言环境中进行高效的服务调用,同时也便于服务的管理和配置。
metadataDubbo 3引入了元数据中心概念,元数据的主要职责是存储每个服务的详细信息,例如接口定义,方法信息等。dubbo/metadata路径就是元数据中心的实现,它提供了元数据的存储,查询等操作。

注册中心抽象及实现

我们看我们的公共api包,dubbo-register-api这个包。
image.png
看上面的图,我们可以看到,Zk和Nacos的Registry都实现了Register接口,而在其中有个抽象类抽出来了公共的东西。

ok,下面我们看,Registry。这个接口,必须实现的方法的作用。
要看Registry,我们可以看它的父接口,RegistryService,这里是关于注册中心要做的事情。
我们总结出一个RegistryService的表格。

方法作用
register注册信息,比如说provider注册
unregister取消注册信息,比如说provider取消
subscribe订阅变动
unsubscribe取消订阅变动

ok,我们来分析一个注册的实现,看看dubbo怎么来实现这些接口的呢。下面我们以zookeeper为例,来看看dubbo的实现,后面会再教大家来自己实现一个注册类。

大家可以打开ZookeeperRegistry这个类,跟着我一起看。
诶,这个时候大家会发现,怎么没有实现上面的接口,取而代之的是以do开头的doRegisrty等方法。我们来分析一下,其实可以看到,ZookeeperRegistry实际上是继承了我们的CacheableFailbackRegistry类,而CacheableFailbackRegistry继承了FailbackRegistry。
image.png
我们看图,根据继承关系,我们看FailbackRegistry,实际上,这个类实现了Failback的逻辑,然后暴露出四个抽象方法让后续的继承者去实现。
image.png

我们看其真正代码,实际上,Failback帮我们做了重试的逻辑,我们仅需要在do方法中,做真正的逻辑即可。
我们简单看个方法的实现。
image.png
image.png
这里可以看到,失败后,最后会在时间轮里面去做重试。关于时间轮的这个东西,后面会讲到。
事实上,FailbackRegistry这种模就是一种模版方法的设计模式,大家可以对照着学习类似的设计模式来设计自己的代码。

ok,看完了FailbackRegistry,我们看ZKRegisry是怎么实现这些do方法的呢?

image.png
实际上,很简单,注册就是把对应的path写入到zk,取消注册就把这个path移除掉。

我们看doSubscribe方法,实际上就是当zk变动的时候,通知我们的notifyListener去更新数据。
我们可以把断点卡在这里,看看notifyListener到底是什么。
服务端的notifyListener是RegistryProtocol的内部类OverrideListener。
客户端通知的就是RegistryDirectory。RegistryDirectory里面存的invokers就是可以提供服务的服务端地址。url是注册中心的地址。
image.png
doUnSubscribe的逻辑类似,我们就不一一赘述了。

这里其实通知机制,我们又学习到了一种设计模式。

自己实现Registry

ok,如果我们想自己实现一个注册到某个注册中心的逻辑呢,其实很简单,我们需要两个类,一个就是实现我们的Registry,然后再实现一个RegistryFactory即可,我们可以通过dubbo的spi机制,添加我们自己实现的注册逻辑。
我们可以直接看官方文档上面有这方面的逻辑,我就不重复赘述了:
注册中心扩展

吸收经验

在这里我们可以学习到什么呢?

首先,深入理解Dubbo的设计理念是至关重要的。Dubbo通过对连接注册中心的逻辑层进行封装,实现了通过Dubbo Registry API层直接抽象调用注册中心的功能,从而分离了具体实现层。此外,利用SPI(Service Provider Interface)机制,Dubbo能够根据需求动态加载相应的注册逻辑。
那么,这种设计逻辑带来的好处有哪些呢?
首先,它显著减少了核心包的代码量,有效避免了核心包变得臃肿。
其次,它为用户提供了便利,使得用户能够快速实现自定义的注册逻辑,例如接入自研的注册中心。
目前,Dubbo核心包仅包含了对Zookeeper(ZK)和Nacos注册中心的连接逻辑,而其他注册中心的逻辑则被移到了扩展库dubbo-spi-extension中。因此,如果您使用的是其他注册中心,可以在那里进行查找。
Dubbo的这种设计理念非常值得我们学习。当然,这只是一个宏观的观点,其中涉及的各个细节,如通知机制、模板方法机制等,也都值得深入探讨。我们可以在后续的学习中一起探讨这些内容。

如何实现多注册中心

在springboot中使用:
服务端:

dubbo:
  application:
    name: ${spring.application.name}
  protocol:
    name: dubbo
    port: -1
  registries:
    zk-registry1:
      address: zookeeper://127.0.0.1:2181
      default: true
    zk-registry2:
      address: zookeeper://127.0.0.1:2182

客户端:

dubbo:
  application:
    name: ${spring.application.name}
  consumer:
    registries:
      - zk-registry1
      - zk-registry2
  registries:
    zk-registry1:
      address: zookeeper://127.0.0.1:2181
    zk-registry2:
      address: zookeeper://127.0.0.1:2182

dubbo官方提供了一个多注册中心的例子,我这里直接copy过来。
多注册中心

多注册中心注册例子

比如:中文站有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="world"  />
    <!-- 多注册中心配置 -->
    <dubbo:registry id="hangzhouRegistry" address="10.20.141.150:9090" />
    <dubbo:registry id="qingdaoRegistry" address="10.20.141.151:9010" default="false" />
    <!-- 向多个注册中心注册 -->
    <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="hangzhouRegistry,qingdaoRegistry" />
</beans>

不同服务使用不同注册中心

比如:CRM 有些服务是专门为国际站设计的,有些服务是专门为中文站设计的。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="world"  />
    <!-- 多注册中心配置 -->
    <dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />
    <dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />
    <!-- 向中文站注册中心注册 -->
    <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="chinaRegistry" />
    <!-- 向国际站注册中心注册 -->
    <dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" registry="intlRegistry" />
</beans>

多注册中心引用

比如:CRM 需同时调用中文站和国际站的 PC2 服务,PC2 在中文站和国际站均有部署,接口及版本号都一样,但连的数据库不一样。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="world"  />
    <!-- 多注册中心配置 -->
    <dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />
    <dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />
    <!-- 引用中文站服务 -->
    <dubbo:reference id="chinaHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="chinaRegistry" />
    <!-- 引用国际站服务 -->
    <dubbo:reference id="intlHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="intlRegistry" />
</beans>

如果只是测试环境临时需要连接两个不同注册中心,使用竖号分隔多个不同注册中心地址:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="world"  />
    <!-- 多注册中心配置,竖号分隔表示同时连接多个不同注册中心,同一注册中心的多个集群地址用逗号分隔 -->
    <dubbo:registry address="10.20.141.150:9090|10.20.154.177:9010" />
    <!-- 引用服务 -->
    <dubbo:reference id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" />
</beans>

标签:Dubbo,逻辑,dubbo3.2,服务,中心,dubbo,注册,我们
From: https://blog.csdn.net/qq_41057813/article/details/137113594

相关文章

  • 逻辑链路控制与适配协议(L2CAP)
    逻辑链路控制与适配协议通常简称为L2CAP(LogicalLinkControlandAdaptationProtocol),它向上连接应用层,向下连接控制器层,发挥主机与控制器之间的适配器的作用,使上层应用操作无需关心控制器的数据处理细节。经典蓝牙的L2CAP层比较复杂,它实现了协议复用、数据分段与重组、封装......
  • openGauss 并行逻辑解码
    并行逻辑解码可获得性本特性自openGauss3.0.0版本开始引入。特性简介支持多线程并行解码。客户价值大幅提升逻辑解码性能,解码速度由3~5MBps可提升到标准场景(16核CPU、内存128G、网络带宽>200MBps、表的列数为10~100、单行数据量0.1KB~1KB、DML操作以insert为主、不涉及落......
  • SpringBoot整合Redis:面试必考题-缓存击穿--逻辑过期解决
    ......
  • springboot关于注册条件相关内容
    核心注解为@Condition//如果配置文件中存在了指定信息,才会注入,否则不注入@ConditionalOnProperty(prefix="country",name={"name","system"})此时因为配置文件中没有指定信息,所以没有注入到ioc池中,Countrycountry=context.getBean(Country.class);所以在启动类中无法......
  • 20240320-2-线性回归+逻辑回归
    线性回归于逻辑回归面试题1.简单介绍一下线性回归。**线性回归(LinearRegression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。**这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称......
  • Spring整合Mybatis方式一 - 常规整合 - 注册映射器
    前置工作导包(mybatis-spring、mysql-connector-java、mybatis、spring-webmvc等)实体类DAO层两个文件(接口、xml文件);Service层的接口编写Spring管理mybatis的xml-spring-dao.xml核心代码(两种方式实现)第一种:xml<!--将会话工厂对象托管给spring--><beanid="sqlSess......
  • FebHost:什么是韩国.KR域名,注册有什么优势?
    在互联网时代,国家顶级域名已成为一个国家在网络世界的重要标识。其中,.KR域名就是韩国在互联网上的独有国家标识,在推动韩国网络事业发展中发挥着重要作用。.KR域名的历史可以追溯到1986年,当时韩国互联网振兴院首次推出了这一国家顶级域名。自此,.KR域名成为了韩国在......
  • Xilinx ZYNQ 7000+Vivado2015.2系列(二)之奇数分频和逻辑分析仪(ILA)的使用
    前言:偶数分频容易得到:N倍偶数分频,可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。奇数分频如何得到呢?第一部分 奇数分频奇数分频方法:N倍奇数分频,首先进行上升沿触发进行......
  • Nacos2.x 服务注册成功,但服务列表查询失败
    Nacos2.x服务注册成功,但服务列表查询失败-知乎(zhihu.com)这个问题的来源是Nacos的一个BUG,创建命名空间的时候,命名空间ID不能让其自动生成,自动生成的ID是没法用的,注册服务会失败,就是上面的这个问题。再创建一个命名空间test:指定命名空间ID和命名空间名称一致修改bo......
  • [AGE] Eushully 过注册检查弹窗
    Eushully(AGE)过注册检查Eushully的AGE引擎(ARCGameEngine)有一种类似于CatSystem2的本机安装标识文件,也就防止你直接拷贝游戏到别的机器上运行,区别在于CatSystem2的检查是直接不让你运行,而AGE则是运行后随机弹窗来恶心你需要先脱壳,请参考[AGE引擎]EushullyASProtect脱壳......