任务

跑通alibaba-dubbo, apache-dubbo插件,研究底层原理

apache-dubbo 插件

nacos + dubbo

之前都是用 zookeeper 作为 dubbo 的注册中心,现在用 nacos 作为 dubbo 的注册中心。

  • admin:打开 dubbo 插件的配置,更改配置项为 nacos 注册中心。

image.png

  • 服务提供方:添加 maven 依赖,在 spring-dubbo.xml 中更改 dubbo 注册中心的配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- Dubbo Nacos registry dependency -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>${apache.dubbo.version}</version>
</dependency>

<!-- Keep latest Nacos client version -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos-client.version}</version>
</dependency>
1
<dubbo:registry address="nacos://localhost:8848"/>

启动服务,可以看到 nacos 的服务列表中,注册了服务。

image.png

image.png

同时可以观察到 nacos 配置中心中新增了关于 dubbo 的配置项。

  • 网关:启动网关报错,大致错误如下,猜测是由于重复引入了相同的配置项。排查发现,原来是 maven 依赖重复引入了 apache dubbo 和 alibaba dubbo。
1
2
3
4
5
Caused by: java.lang.IllegalStateException: Duplicate key org.dromara.soul.plugin.apache.dubbo.handler.ApacheDubboPluginDataHandler@9b21bd3
...
at org.dromara.soul.plugin.base.cache.CommonPluginDataSubscriber.<init>(CommonPluginDataSubscriber.java:47) ~[classes/:na]
at org.dromara.soul.web.configuration.SoulConfiguration.pluginDataSubscriber(SoulConfiguration.java:97) ~[classes/:na]
...

删除重复依赖,成功启动网关,发现调用时出现 can not match rule data 异常,检查的类是 CheckUtils。回溯发现,主要原因是在 AbstractSoulPlugin 中的 execute 方法中。

而 AbstractSoulPlugin 的调用链的本质就是 pluginData-->SelectorDataRuleData-->RuleData,当 plugin 定位到所要调用的插件是 dubbo 时,就会去找 dubbo 相关的 selectordata 和 ruledata 数据。但是,当 selectordata 的数据存在垃圾数据(可能是由于错误加载 dubbo 插件导致)时,如下图所示,id 为 1355538588530810880 的 selectordata 为垃圾数据,会导致其优先被请求命中,然后找不到其下的 ruledata,从而导致报can not match rule data异常。

测试中发现,此时进行选择器界面的数据同步操作时,并不会将 selectordata 中的 dubbo 数据进行修改,后续可以研究下这一块的数据同步逻辑。

image.png

1
2
3
4
5
final List<RuleData> rules = BaseDataCache.getInstance().obtainRuleData(selectorData.getId());
//这里获取到的 rules 为空,就会抛出未找到 rule 的异常
if (CollectionUtils.isEmpty(rules)) {
return handleRuleIsNull(pluginName, exchange, chain);
}

此时,在 nacos 中删除 id 为 1355538588530810880 的 selectordata 数据后,重启网关,发现 basedatacache 只取到了最新的的 selectordata 数据,也找到了绑定它的 ruledata 数据,请求成功调用。

image.png

待办事项

  • nacos 的选择器数据同步逻辑
  • apache dubbo 的底层原理

Link