如标题所述,最近楼主有遇到一个场景问题,最初是想在微服务之间传递流,结果发现,传递过程中,流会丢失,即通过普通的方式无法传递流,那么有没有其他替代的方式或办法解决问题呢
在日常项目中,经常有导入导出Excel的功能. 在一次需求功能中, 功能的设计是: 前端上传Excel到后台,后台解析Excel,并将文件上传到云服务器上,并返回文件fileId. 在页面点击提交按钮后, 后台会根据文件fileId从云服务器上下载文件流.
在最初的设计方案中, 因后端微服务根据不同的功能划分不同的服务,所以操作云服务数据的是一个单独的微服务, 普通的业务微服务模块只通过feign等方式访问, 所以采用的是feign接口调用方式
feign接口调用是直接将文件流当成普通参数在feign接口中传递, feign调用的方式出现了问题,即查询出来的流, 不能返回到业务服务.
查询相关的资料, 发现流不能直接通过feign接口调用, 因为流在传输过程中,不能有效的转换,所以接受流都为空. 对于此问题, 有两种方法, 第一种是把流装换为字节数组传输, 字节数组在feign接口调用中,能够有效的传输 ; 第二种通过response对象传递流 ; 第三种,听大佬说, feign接口调用如果要传递流,需要加额外的配置,添加相关的转换. (未知,待验证)
云服务接口
@PostMapping("/upload")
@ResponseBody
public byte[] upload() throws IOException {
// 模拟从云服务获取文件流
InputStream is = new ZipInputStream(null);
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = is.read(buffer)) != -1) {
bos.write(buffer,0,len);
}
bos.flush();
return bos.toByteArray();
}
feign接口
@PostMapping("/upload")
@ResponseBody
byte[] upload();
业务服务
byte[] bytes = ossClient.upload();
InputStream is = new ByteArrayInputputStream(bytes);
@PostMapping("/upload")
@ResponseBody
public void upload(HttpServletResponse resp) throws IOException {
// 模拟从云服务获取文件流
InputStream is = new ZipInputStream(null)
OutputStream os = response.getOutputStream();
byte[] bytes = new byte[1024];
int len = 0;
while ((len = is.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
is.close();
os.flush();
os.close();
}
feign接口
@PostMapping("/upload")
@ResponseBody
feign.Response upload(HttpServletResponse resp);
业务服务
Response response = ossClient.upload();
InputStream is = response.body().asInputStream();
通过上述方法可知, 都是通过转换的方式来传递流,并没有直接把流直接传递的方式,对于方式三, 还需要学习探索,也欢迎有懂的学者来补充指正.