一 介绍
Dubbo支持多种服务调用方法,包括远程过程调用、负载均衡和容错等,并且提供可视化的服务管理和监控功能。
Dubbo的核心组件之一就是注册中心。在Dubbo的体系架构中,服务提供者在启动时向注册中心注册其提供的服务,并且服务消费者在启动时向注册中心订阅其需要的服务。
而在服务提供者或消费者宕机、网络分隔、或者其他出现故障时,注册中心可以感知并通知相应的消费者或者提供者。 注册中心在Dubbo系统中占据了重要的地位,它实现了服务的动态发布和引用,使得系统可以在运行时对服务进行灵活的扩展和削减。
此外,通过注册中心,可以对系统的运行状态进行集中式的监控和管理。 ZooKeeper常被用作Dubbo的注册中心,它是一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,可以提供基于类似于文件系统的目录节点树方式的数据存储。ZooKeeper中的数据模型允许Dubbo的服务提供者和消费者以树形结构的形式进行数据的注册和订阅,从而完成服务的动态发现和使用。
有什么用
在Dubbo微服务架构中,注册中心扮演着至关重要的角色。它主要负责服务的注册、发现以及服务元数据的存储,承担着整个系统中的"信息中枢"角色。
以下是注册中心在Dubbo中的核心作用:
- 服务注册:Dubbo提供的所有服务,在启动时都会先在注册中心进行注册。每个服务都会提供一些元信息,如服务IP、端口号、服务版本、服务分组等。
- 服务发现:当服务消费者需要调用某个服务时,会向注册中心询问所需服务的相关信息,注册中心根据服务名找到对应的提供者列表并返回,从而使得服务消费者能够根据这些信息进行服务调用。
- 服务元数据存储:注册中心会保存所有注册服务的元信息,包括服务提供者信息、服务消费者信息以及每个服务的调用关系等。
- 服务健康检查:注册中心时刻监控注册在其上的服务,一旦服务提供者出现故障或失去联系,注册中心会立即从提供者列表中移除,防止消费者调用已经失效的服务。
- 负载均衡: 注册中心还会根据各服务提供方的压力情况,为服务消费者提供负载均衡的建议,帮助消费者更好地选择合适的服务提供者。
- 配置管理: 注册中心还可以实现一些动态配置的管理,如动态路由、动态配置等。
通过以上作用,注册中心提供了一种机制,使得微服务之间能够相互发现、管理以及协同工作,极大地提升了整个微服务体系的灵活性和可靠性。
到底存了什么
本篇来带大家分析一下,dubbo使用注册中心,到底存了什么东西,作用是什么?
我们怎么分析呢,很简单,我们本地启动一个zookeeper,然后启动一个demo服务的dubbo provider看看到底有哪些信息存储进去了。
我们可以启动我们demo项目里面的provider,然后我们启动本地的zk,如果没有zookeeper,可以去官网下载一个。修改conf的zoo_sample.cfg改成zoo.cfg,再把里面data.dir修改一下,启动即可。
启动并且运行provider和consumer后,dubbo生成了一下目录,请看图。
下面我们来对图进行分析,形成了一张表格:
路径(/dubbo/) | 描述 | dubbo3新增 |
---|---|---|
org.apache.xxxService | 之前就有的2.x的,里面有providers的信息,consumer的信息、路由信息等等。providers如果断开,则会删除对应的节点。 | 否 |
config | 在Dubbo 3中,增加了全局/共享的配置管理。dubbo/config路径下主要存储一些服务消费者和服务提供者共享的配置信息,例如一些全局参数,提供者的策略,路由规则等。这些配置信息将被所有的服务消费者和服务提供者共享。 | 是 |
mapping | dubbo/mapping在Dubbo 3中扮演了一个关键的角色,特别是在支持多语言服务调用和精细化服务治理方面。这个注册中心路径用于存储服务接口方法与其对应的唯一标识之间的映射关系,这种设计使得Dubbo能够在多语言环境中进行高效的服务调用,同时也便于服务的管理和配置。 | 是 |
metadata | Dubbo 3引入了元数据中心概念,元数据的主要职责是存储每个服务的详细信息,例如接口定义,方法信息等。dubbo/metadata路径就是元数据中心的实现,它提供了元数据的存储,查询等操作。 | 是 |
注册中心抽象及实现
我们看我们的公共api包,dubbo-register-api这个包。
看上面的图,我们可以看到,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。
我们看图,根据继承关系,我们看FailbackRegistry,实际上,这个类实现了Failback的逻辑,然后暴露出四个抽象方法让后续的继承者去实现。
我们看其真正代码,实际上,Failback帮我们做了重试的逻辑,我们仅需要在do方法中,做真正的逻辑即可。
我们简单看个方法的实现。
这里可以看到,失败后,最后会在时间轮里面去做重试。关于时间轮的这个东西,后面会讲到。
事实上,FailbackRegistry这种模就是一种模版方法的设计模式,大家可以对照着学习类似的设计模式来设计自己的代码。
ok,看完了FailbackRegistry,我们看ZKRegisry是怎么实现这些do方法的呢?
实际上,很简单,注册就是把对应的path写入到zk,取消注册就把这个path移除掉。
我们看doSubscribe方法,实际上就是当zk变动的时候,通知我们的notifyListener去更新数据。
我们可以把断点卡在这里,看看notifyListener到底是什么。
服务端的notifyListener是RegistryProtocol的内部类OverrideListener。
客户端通知的就是RegistryDirectory。RegistryDirectory里面存的invokers就是可以提供服务的服务端地址。url是注册中心的地址。
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