spring-cloud-alibaba SCA-Dubbo与Dubbo3互相调用

jobtbby3  于 2022-12-31  发布在  Spring
关注(0)|答案(1)|浏览(179)

背景

Dubbo本身是一个RPC调用框架,默认使用服务级地址,与Spring Cloud的应用级地址发现不搭。所以SCA-Dubbo自己实现了一套元应用级和服务级地址转换的能力--MetadataService。最近这种情况出现了改变,Dubbo3引入了自己的应用级服务发现,并且有着自有的应用级服务级地址转换服务DubboMetadataService,两者在方案上十分相近,于是,整合两者,使SCA-Dubbo与Dubbo直接相互调用成为了可能。
经过对源码和SCA-Dubbo、Dubbo地址注册行为的分析对比,我发现两者不能相互调用的原因,并给出了几种实现SCA-Dubbo和Dubbo相互调用能力的方案。

SCA-Dubbo和Dubbo的地址注册行为概述

SCA-Dubbo的应用及级地址

SCA-Dubbo在注册中心中注册的地址和原数据为下面的代码框内的内容。其本质为一个应用级地址,其元数据部分包含DubboMetadataService接口级地址的信息。地址路径如下。
/services/spring-cloud-alibaba-dubbo-provider/379f4e58-9313-465b-ba65-9f31f19580f9

Dubbo3应用级地址

`/dubbo/config/mapping/com.alibaba.cloud.dubbo.service.EchoService/zookeeper-dubbo-provider

/dubbo/metadata/zookeeper-dubbo-provider/26AB712A7EAB39331D5119B1D53F6188

/services/zookeeper-dubbo-provider/30.225.20.119:20882`

异同

对比发现,Dubbo3和SCA-Dubbo都在“services/application/"下面注册了应用级地址,但是两者采用了不同的类,分别是“org.apache.dubbo.registry.zookeeper.ZookeeperInstance”与 “org.springframework.cloud.zookeeper.discovery.ZookeeperInstance”。两者任何一个去订阅对方的地址时,会出现类转换错误。导致两者无法直接调用对方。
同时两者注册在同一个注册中心时,消费者订阅地址时会报错。

可选互调方案

双注册中心

双注册中心,同时给SCA-Dubbo配置两个注册中心,两个地址用于注册不同的应用级地址。这方案下,Dubbo可以通过Dubbo3应用级地址来调用SCA-Dubbo的Provider。

改SCA-Dubbo应用级地址注册发现行为

SCA的角色是一个整合工具,所以默认不改变Dubbo的地址注册发现行为。之所以SCA-Dubbo和Dubbo无法相互调用,说到底是因为应用级地址发现的方式不同导致,因此我们可以把SCA-Dubbo的应用级地址发现向Dubbo3靠拢,甚至完全使用Dubbo3的应用级地址发现。

两种方案的对比

方案名方案详情SCA-Dubbo Provider的影响SCA-Dubbo Consumer的影响能否兼容旧版本SCA与Dubbo3无缝调用能否兼容旧版Dubbo
双注册中心SCA注册两种应用级地址在两个注册中心小,仅需多一项配置开启Dubbo3的注册行为,即可注册双份地址大,Consumer需要订阅两个注册中心的地址,并且订阅、整合。复杂度高。能。两份地址。能。能。两份地址。
SCA-Dubbo向Dubbo3靠拢SCA-Dubbo向Dubbo3应用级地址靠拢适中。需要修改SCA-Dubbo的应用级地址注册行为。中。Consumer需要区分地址类型。不能。改变了地址注册行为后,旧版SCA无法适配。能。不能。

两种方案的对比已经列在了上面。

请求意见

设想了两种方案,希望大家能给出意见,不吝指教,多批评,提出自己的意见、或者新方案。在本文下面回复就可以了。

omhiaaxx

omhiaaxx1#

本文双注册中心方案的部分代码

前置操作

安装Dubbo3.0.0.preview

安装修改后Dubbo3.0.0.preview到本地仓库。这个版本的Dubbo3基于Dubbo官方发布的3.0.0.preview版本,因为Dubbo3.0.0.preview版没有发布dubbo-spring相关库,为了适配2.7.10的dubbo-spring库,做了一些适配。同时Dubbo3.0.0.preview版本中缺少2.7.10中的一些事件和机制,也添加到了这个仓库中。
https://github.com/ppzzyy11/dubbo3.0.0.preview

运行SCA

SCA请使用下面这个仓库下的dubbo3分支。
git@github.com:ppzzyy11/spring-cloud-alibaba.git branch dubbo3

SCA-Dubbo作为Provider被SCA-Dubbo和Dubbo调用

启动Provider

我们现在使用双注册中心方案验证SCA-Dubbo被调用,不使用单注册中心的原因会在后面说明。Nacos作为SCA-Dubbo应用级地址注册中心,Zookeeper作用Dubbo应用级和服务级地址注册中心。Provider侧的配置如下。

`
com.alibaba.cloud.dubbo.bootstrap.DubboSpringCloudProviderBootstrap

//我们选择nacos profile
public static void main(String[] args) {
new SpringApplicationBuilder(DubboSpringCloudProviderBootstrap.class)
.properties("spring.profiles.active=nacos")
.web(WebApplicationType.NONE).run(args);
}

//我们在配置中心中添加注册中心,作为Dubbo地址的注册中心。
dubbo:
registry:
address: zookeeper://127.0.0.1:2181
`

此时查看ZK和Nacos中的注册内容,发现两者都正常。Nacos中的地址为SCA-Dubbo应用级地址,ZK中的地址为Dubbbo的应用级和服务级地址。
//Nacos中的内容 30.225.12.224 9090 false 1 true dubbo.metadata-service.urls=[ "dubbo://30.225.12.224:20880/com.alibaba.cloud.dubbo.service.DubboMetadataService?anyhost=true&application=spring-cloud-alibaba-dubbo-provider&bind.ip=30.225.12.224&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=spring-cloud-alibaba-dubbo-provider&interface=com.alibaba.cloud.dubbo.service.DubboMetadataService&metadata-type=remote&methods=getAllServiceKeys,getServiceRestMetadata,getExportedURLs,getAllExportedURLs&pid=7568&publish-instance=true&publish-interface=true&qos.enable=false&release=3.0.0.preview&revision=1.0.0&side=provider&timestamp=1620458449963&version=1.0.0" ] preserved.register.source=SPRING_CLOUD dubbo.protocols.dubbo.port=20880 dubbo.protocols.rest.port=9090
//ZK中内容 /dubbo/metadata/com.alibaba.cloud.dubbo.service.EchoService /dubbo/metadata/com.alibaba.cloud.dubbo.service.RestService /dubbo/metadata/com.alibaba.cloud.dubbo.service.UserService /dubbo/metadata/org.apache.dubbo.metadata.MetadataService /dubbo/metadata/spring-cloud-alibaba-dubbo-provider /dubbo/metadata/com.alibaba.cloud.dubbo.service.DubboMetadataService/1.0.0 /dubbo/metadata/com.alibaba.cloud.dubbo.service.DubboMetadataService/1.0.0/spring-cloud-alibaba-dubbo-provider /dubbo/metadata/com.alibaba.cloud.dubbo.service.DubboMetadataService/1.0.0/spring-cloud-alibaba-dubbo-provider/provider /dubbo/metadata/com.alibaba.cloud.dubbo.service.DubboMetadataService/1.0.0/spring-cloud-alibaba-dubbo-provider/provider/spring-cloud-alibaba-dubbo-provider /dubbo/metadata/com.alibaba.cloud.dubbo.service.EchoService/provider /dubbo/metadata/com.alibaba.cloud.dubbo.service.EchoService/provider/spring-cloud-alibaba-dubbo-provider /dubbo/metadata/com.alibaba.cloud.dubbo.service.RestService/1.0.0 /dubbo/metadata/com.alibaba.cloud.dubbo.service.RestService/1.0.0/provider /dubbo/metadata/com.alibaba.cloud.dubbo.service.RestService/1.0.0/provider/spring-cloud-alibaba-dubbo-provider /dubbo/metadata/com.alibaba.cloud.dubbo.service.UserService/provider /dubbo/metadata/com.alibaba.cloud.dubbo.service.UserService/provider/spring-cloud-alibaba-dubbo-provider /dubbo/metadata/org.apache.dubbo.metadata.MetadataService/1.0.0 /dubbo/metadata/org.apache.dubbo.metadata.MetadataService/1.0.0/spring-cloud-alibaba-dubbo-provider /dubbo/metadata/org.apache.dubbo.metadata.MetadataService/1.0.0/spring-cloud-alibaba-dubbo-provider/provider /dubbo/metadata/org.apache.dubbo.metadata.MetadataService/1.0.0/spring-cloud-alibaba-dubbo-provider/provider/spring-cloud-alibaba-dubbo-provider /dubbo/metadata/spring-cloud-alibaba-dubbo-provider/396B6C1ECA0A9964BC7C38703D53A0A0 /dubbo/metadata/spring-cloud-alibaba-dubbo-provider/E523BC2F51318AE723626647815D3C30 /services/spring-cloud-alibaba-dubbo-provider /services/spring-cloud-alibaba-dubbo-provider/30.225.12.224:20880
Provider侧注册完成。

启动Consumer

SCA-Consumer

启动入口,发现调用成功。SCA-Consumer向Nacos请求SCA-Dubbo应用级地址。
com.alibaba.cloud.dubbo.bootstrap.DubboSpringCloudConsumerBootstrap#main

Dubbo-Consumer

Dubbo-Consumer订阅Dubbo应用级地址
org.apache.dubbo.config.bootstrap.ZookeeperDubboServiceConsumerBootstrap#main Haidian Road

SCA-Consumer

SCA-Consumer开发工作量大,没有完成。

相关问题