一.相关版本信息
spring-cloud-starter-dubbo 2.2.6.RELEASE
Dubbo admin 0.3.0
dubbo-api-docs 2.7.8.1
二.dubbo-admin相关
spring-cloud-starter-dubbo使用DubboCloudRegistry 的话是目前版本是不支持sdubbo-admin的,所以本文的方法是排除DubboCloudRegistry,然后配置NacosRegistry(也可以用zookeeper),请知悉
1.首先在dubbo-admin 的 application.properties如下三个都需要配置,否则接口测试和条件路由之类的会查询会有问题
admin.registry.address=nacos://localhost:8848?group=dubbo&namespace=abc admin.config-center=nacos://localhost:8848?group=dubbo&namespace=abc admin.metadata-report.address=nacos://localhost:8848?group=dubbo&namespace=abc
2.然后就是配置NacosRegistry为注册中心,有两种方法
方法1:此方法会保留DubboCloudRegistry的注册中心
在application.yml增加如下配置dubbo: registry: address: localhost protocol: spring-cloud default: false registries: nacos: default: true address: nacos://localhost:8848?group=dubbo&namespace=abc
上面的方法会把DubboCloudRegistry 配置成非默认的注册中心,另外配置一个nacos作为默认注册中心.
方法2:此方法不会创建DubboCloudRegistry的注册中心,也不会暴露DubboMetadataService 服务
(1).首先在在application.yml增加配置
dubbo: registry: address: nacos://localhost:8848?group=dubbo&namespace=abc
(2).然后排除DubboServiceRegistrationAutoConfiguration
@SpringBootApplication(exclude =DubboServiceRegistrationAutoConfiguration.class)
三.dubbo-api-docs
主要讲碰到错误的解决,基本配置可以自行看官网?
错误:Field registry in org.apache.dubbo.apidocs.core.DubboApiDocsAnnotationScanner required a single bean, but 2 were found:
原因:我出现如上错误的原因是因为项目配置了两个RegistryConfig(DubboCloud和Nacos的),而DubboApiDocsAnnotationScanner注入的RegistryConfig不是list.
解决:就是配置一个RegistryConfig为Primary
上面dubbo-admin的第2步的方法1就会产生这种错误,以此为例
1.,删掉一个默认的RegistryConfig配置,既把application.yml的配置由dubbo: registry: address: localhost protocol: spring-cloud default: false registries: nacos: default: true address: nacos://localhost:8848?group=dubbo&namespace=abc
改为
dubbo: registry: address: localhost protocol: spring-cloud default: false
2. 把删掉的默认RegistryConfig用@Bean配置为 Primary
@Bean @Primary public RegistryConfig defaultRegistryConfig() { RegistryConfig registryConfig = new RegistryConfig("nacos://localhost:8848?group=dubbo&namespace=abc"); registryConfig.setDefault(true); return registryConfig; }
错误:Not found exported service: apiDocsGroup/org.apache.dubbo.apidocs.core.providers.IDubboDocProvider:v1:20880 in
原因:因为 dubbo-admin 引用的服务默认 {group=apiDocsGroup,version=v1} , 而项目中暴露的服务默认{group=,version=},所以就导致请求时group和version对应不上
解决:在 dubbo-admin 的配置文件application.properties 增加如下配置
# "=" 号后面就是啥都木有 dubbo.api.docs.version= dubbo.api.docs.group=
猜测可能存在的问题:只是猜测没验证过
假设provider项目中yml有如下配置
dubbo: provider: group: g1 version: 1.0
可能问题1:此时dubbo暴露服务默认{group=g1,version=1.0},而@ApiModule配置的服务如果没指定group和version的话生成的文档应该会是{group=,version=}.这样就对于不上了。
如果存在解决的话可能就需要自己在ApiModule指定group和version.或者自己实现 DubboApiDocsAnnotationScanner 配置默认的group和version为yml中的配置
可能的问题2:和上面的错误2类似的错误.因为group和version对不上所以找不到IDubboDocProvider服务
解决:dubbo admin 的配置文件application.properties可能需要考虑配置#配置和provider的默认group和version一样 dubbo.api.docs.version=1.0 dubbo.api.docs.group=g1
可能的问题3:假设不同的provider配置的默认group和version不一样,那么上面问题而的解决方法就不合适了
解决的话可能就需要考虑自己修改dubbo-admin源码中 ApiDocsController.apiModuleList 方法了
1.比如增加传参group和version,
2.又或者根据ip从订阅的服务url中匹配对应的IDubboDocProvider进行调用
3.还有就是等官方处理