先贴出错误 "errorMessage": "No provider available from registry localhost:6379 for service xxx.AttachmentService on consumer 172.20.80.1 use dubbo version 2.7.12, please check status of providers(disabled, not registered or in blacklist)."
}
背景:
项目中依赖了attachmentService,本来Attachment在另一个微服务。但是为了少部署一个微服务,把AttachmentServiceImpl实现类也打包到了同一个jar包。
预期结果:
dubboReference默认会走inJvm协议。但是实际运行时报了上面的错误。
解决思路:
看报错注册中心没有相应的提供者,那为什么没有注入呢。一切看着毫无破绽,而且在启动类中配置了相应的componentScan,按道理是能被扫描到的。
困扰了一整晚,苦思冥想,还是没有思路。看来只能使出绝招了。
源码+原理
如何找到入口,springboot+dubbo,以springboot的老套路入手。一般都会在starter项目下的spring.factories找到一些自动配置类
打开源码发现了熟悉的身影,packagesToScan,表示哪些包需要扫描。看到这个,感觉离胜利已经不远了。跟踪断点进来,发现此变量的值果然不对。
启动类上配置的ComponentScan(basePackage=“xxx”)居然没生效!!
看源码中的packagesToScan的值和启动类的根目录是一样的,怀疑是@EnableDubbo惹的货
因为spring如果不配置basePackage的话,默认会以启动类的根目录为basePackage的值。
解决方法, 在@EnableDubbo(scanBasePackages = "")配置具体的包名,或者直接删除@EnableDubbo注解(此注解不需要配置也行)
总结
@EnableDubbo覆盖了ComponentScan(basePackage=“xxx”)里面的basePackage,导致了
attachmentService没有被扫描注册到注册中心,导致了报错。
后续的dubbo启动原理有待研究,今天暂时先解决此问题。