spring-cloud-starter-dubbo使用dubbo-admin并集成dubbo-api-docs

於意蕴
2023-12-01

一.相关版本信息

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

主要讲碰到错误的解决,基本配置可以自行看 官网链接 

错误1: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;
}

错误2:Not found exported service: apiDocsGroup/org.apache.dubbo.apidocs.core.providers.IDubboDocProvider:v1:20880 in

原因:因为 dubbo-admin 引用的服务默认 {group=apiDocsGroup,version=v1} , 而provider项目中暴露的服务默认{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},和上面的错误2类似.然后group和version会对不上。


解决方法1:需要自己在provider 项目中的 ApiModule指定group和version

解决方法2:在provider项目中实现 DubboApiDocsAnnotationScanner 并配置ApiModeule默认的group和version和yml中的配置一样

解决方法3:dubbo admin 的配置文件application.properties考虑配置

#配置和provider的默认group和version一样
dubbo.api.docs.version=1.0
dubbo.api.docs.group=g1

可能的问题2:假设不同的provider配置的默认group和version不一样,那么上面问题的解决方法就不合适了
解决的话可能就需要考虑自己修改dubbo-admin源码中 ApiDocsController.apiModuleList 方法了
1.比如增加传参group和version,
2.又或者根据ip从订阅的服务url中匹配对应的IDubboDocProvider进行调用
3.还有就是等官方处理

 类似资料: