任务
跑通alibaba-dubbo, apache-dubbo插件,研究底层原理
apache-dubbo 插件
nacos + dubbo
之前都是用 zookeeper 作为 dubbo 的注册中心,现在用 nacos 作为 dubbo 的注册中心。
- admin:打开 dubbo 插件的配置,更改配置项为 nacos 注册中心。

- 服务提供方:添加 maven 依赖,在 spring-dubbo.xml 中更改 dubbo 注册中心的配置。
1 | <!-- Dubbo Nacos registry dependency --> |
1 | <dubbo:registry address="nacos://localhost:8848"/> |
启动服务,可以看到 nacos 的服务列表中,注册了服务。


同时可以观察到 nacos 配置中心中新增了关于 dubbo 的配置项。
- 网关:启动网关报错,大致错误如下,猜测是由于重复引入了相同的配置项。排查发现,原来是 maven 依赖重复引入了 apache dubbo 和 alibaba dubbo。
1 | Caused by: java.lang.IllegalStateException: Duplicate key org.dromara.soul.plugin.apache.dubbo.handler.ApacheDubboPluginDataHandler@9b21bd3 |
删除重复依赖,成功启动网关,发现调用时出现 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 数据进行修改,后续可以研究下这一块的数据同步逻辑。

1 | final List<RuleData> rules = BaseDataCache.getInstance().obtainRuleData(selectorData.getId()); |
此时,在 nacos 中删除 id 为 1355538588530810880 的 selectordata 数据后,重启网关,发现 basedatacache 只取到了最新的的 selectordata 数据,也找到了绑定它的 ruledata 数据,请求成功调用。

待办事项
- nacos 的选择器数据同步逻辑
- apache dubbo 的底层原理
Link
- dubbo接入soul网关
:https://dromara.org/zh/projects/soul/dubbo-proxy/