问题描述:

如题,升级dubbo3.3.0,使用dubbo和tri双协议注册,报错

.r.p.t.h.AbstractServerTransportListener :  [DUBBO] An error occurred while processing the http request with GrpcHttp2ServerTransportListener, Http2MetadataFrame{method='POST', path='/org.apache.dubbo.metadata.MetadataService/getMetadataInfo', contentType='application/grpc+proto', streamId=3, endStream=false}, dubbo version: 3.3.0, current host: 

org.apache.dubbo.remoting.http12.exception.HttpStatusException: Invoker for gRPC not found

.....

过程:

折磨了很久没有发现原因,只好一点点查日志,最后发现注册元信息的时候org.apache.dubbo.metadata.MetadataService注册到dubbo的端口20880,org.apache.dubbo.metadata.MetadataServiceV2注册到tri的端口50051,导致查询元信息的时候这个方法找不到MetadataService/getMetadataInfo,因为这里是默认的tri协议走的50051端口,

源码中针对MetadataService的选择有做说明,如下,大意是:

如果设置为 false(默认),MetadataServiceV2 与其他语言的 dubbo 实现(dubbo-go)具有更好的兼容性。:
1. 如果您的服务使用tri协议且未设置 metadataServiceProtocol
- Dubbo 将使用tri协议暴露 MetadataService 和 MetadataServiceV2服务
2. 设置 metadataServiceProtocol = tri
- Dubbo 将使用tri协议暴露 MetadataService 和 MetadataServiceV2服务
3. 设置 metadataServiceProtocol != tri
- Dubbo 只会暴露 MetadataService 服务
4. 您的服务没有使用tri协议,并且未设置 metadataServiceProtocol
- Dubbo 只会暴露 MetadataService 服务
如果设置为 true,dubbo 将尝试仅使用 MetadataServiceV2。
仅当满足以下至少一种情况时才会激活:
1. 手动设置 metadataServiceProtocol = tri
2. 您的服务使用tri协议

前置知识:MetadataService 和 MetadataServiceV2都是一个dubbo服务,用来提供元数据的;

结论:

针对private Boolean onlyUseMetadataV2;这个配置,默认是false,

1、如果设置为true,将仅使用新版本的metadataService (MetadataServiceV2);

2、如果设置为false,会根据暴露服务使用的协议来判断,

(1)如果dubbo服务中使用tri协议,并且未设置metadataServiceProtocol,那么将会以tri协议暴露MetadataService 和 MetadataServiceV2

(2)如果设置metadataServiceProtocol=tri,那么将会以tri协议暴露MetadataService 和 MetadataServiceV2

(3)如果设置metadataServiceProtocol不是tri,那么仅会暴露MetadataService

(4)如果工程中未使用tri协议,并且metadataServiceProtocol未设置,那么仅会暴露MetadataService
特别的:如果onlyUseMetadataV2设置为true,并且metadataServiceProtoco设置为true或工程仅使用tri协议(这两个条件满足一条),那么将仅会暴露MetadataServiceV2

-------------------------------------

现象是有客户端通过50051tri的端口调用MetadataService获取元信息;

出现本次报错的原因:根据ai(qwen3max)总结,3.1或之前的版本使用的是MetadataService,当注册中心中同时注册了 dubbo 协议地址 和 tri 协议地址,消费者错误地 优先选择了 tri 地址 来调用元数据接口,导致报错。

解决方案:

元数据放在remote,配置远程配置中心地址
dubbo.application.metadata-type=remote

dubbo.metadata-report=

综上:只需要将metadata-service-protocol: dubbo指定为dubbo(非tri),就可以全部按MetadataService暴露而不是V2。

    /**
     * Only use the new version of metadataService (MetadataServiceV2).
     * <br> MetadataServiceV2 have better compatibility with other language's dubbo implement (dubbo-go).
     * <br> If set to false (default):
     * <br>  1. If your services are using triple protocol and {@link #metadataServiceProtocol} is not set
     * <br>     - Dubbo will export both MetadataService and MetadataServiceV2 with triple
     * <br>  2. Set {@link #metadataServiceProtocol} = tri
     * <br>     - Dubbo will export both MetadataService and MetadataServiceV2 with triple
     * <br>  3. Set {@link #metadataServiceProtocol} != tri
     * <br>     - Dubbo will only export MetadataService
     * <br>  4. Your services are not using triple protocol, and {@link #metadataServiceProtocol} is not set
     * <br>     - Dubbo will only export MetadataService
     * <br>
     * <br>  If set to true, dubbo will try to only use MetadataServiceV2.
     * <br>  It only activates when meet at least one of the following cases:
     * <br>     1. Manually set {@link #metadataServiceProtocol} = tri
     * <br>     2. Your services are using triple protocol
     * <br>
     */
    private Boolean onlyUseMetadataV2;

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐