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
如果 dubbo 帮用户对大对象自动拆成多个小对象,那在接收端合并的规则又是什么呢 ,框架很难帮用户决定怎么拆分 怎么合并,这类场景还是倾向用户自己使用 stream 进行包装
原回答者GitHub用户EarthChen
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。