开发者社区 > 云原生 > 正文

如果正确的使用dubbo3的triple协议上传文件/图片

grpc有流式服务和非流式服务,上传文件使用triple协议应该怎么选择呢?选择流式服务肯定是没问题的,但是调用方用起来太难受。下面是例子 proto定义

syntax = "proto3";

option java_multiple_files = true; option java_package = "com.nct.player.upload"; option java_outer_classname = "NctFileUpload"; option objc_class_prefix = "HLW";

package com.nct.player.upload;

service NctFileUploadRpc { rpc upload(stream NctFileUploadParam) returns (NctFileUploadDto); rpc upload1(NctFileUploadParam) returns (NctFileUploadDto); }

//Upload message NctFileUploadParam { string fileName = 1; bytes stream = 2; }

message NctFileUploadDto { string filePath = 1; }

实现类:

@DubboService public class NctFileUploadService implements NctFileUploadRpc { @Override public NctFileUploadDto upload1(NctFileUploadParam nctFileUploadParam) { ByteString byteString = nctFileUploadParam.getStream(); byte[] bytes = byteString.toByteArray(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); MkFileUtil.writeFromStream(byteArrayInputStream, "c:/a.jpg"); return NctFileUploadDto.newBuilder().build(); }

@Override
public CompletableFuture<NctFileUploadDto> upload1Async(NctFileUploadParam request) {
    return NctFileUploadRpc.super.upload1Async(request);
}

@Override
public void upload1(NctFileUploadParam request, StreamObserver<NctFileUploadDto> responseObserver) {
    NctFileUploadRpc.super.upload1(request, responseObserver);
}

@Override
public StreamObserver<NctFileUploadParam> upload(StreamObserver<NctFileUploadDto> responseObserver) {
    return new StreamObserver<NctFileUploadParam>() {
        @Override
        public void onNext(NctFileUploadParam nctFileUploadParam) {
            ByteString byteString = nctFileUploadParam.getStream();
            byte[] bytes = byteString.toByteArray();
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
            MkFileUtil.writeFromStream(byteArrayInputStream, "c:/a.jpg");

        }

        @Override
        public void onError(Throwable t) {
            MkLogUtil.error(t);
        }

        @Override
        public void onCompleted() {
            responseObserver.onNext(NctFileUploadDto.newBuilder()
                    .setFilePath("test")
                    .build());
            responseObserver.onCompleted();
        }
    };
}

}

下面说一下我的问题。 如果调用upload的话需要构建StreamObserver对象,对调用方特别不友好。 如果调用upload1的话通过NctFileUploadParam传参即可,但是不确定有没有性能问题。 请指教。

原提问者GitHub用户luger1990

展开
收起
大圣东游 2023-05-11 16:39:35 88 0
1 条回答
写回答
取消 提交回答
  • 如果 dubbo 帮用户对大对象自动拆成多个小对象,那在接收端合并的规则又是什么呢 ,框架很难帮用户决定怎么拆分 怎么合并,这类场景还是倾向用户自己使用 stream 进行包装

    原回答者GitHub用户EarthChen

    2023-05-12 10:24:44
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
Dubbo开源现状与2.7规划 立即下载
Dubbo分布式服务治理实战 立即下载
《Dubbo 3.0 前瞻》 立即下载