关于微服务之间的流传递问题

关于微服务之间的流传递问题

  • 1 场景问题
  • 2 解决方案
    • 1 通过字节数组
    • 2 通过Response
  • 3 总结

如标题所述,最近楼主有遇到一个场景问题,最初是想在微服务之间传递流,结果发现,传递过程中,流会丢失,即通过普通的方式无法传递流,那么有没有其他替代的方式或办法解决问题呢

1 场景问题

在日常项目中,经常有导入导出Excel的功能. 在一次需求功能中, 功能的设计是: 前端上传Excel到后台,后台解析Excel,并将文件上传到云服务器上,并返回文件fileId. 在页面点击提交按钮后, 后台会根据文件fileId从云服务器上下载文件流.

在最初的设计方案中, 因后端微服务根据不同的功能划分不同的服务,所以操作云服务数据的是一个单独的微服务, 普通的业务微服务模块只通过feign等方式访问, 所以采用的是feign接口调用方式

feign接口调用是直接将文件流当成普通参数在feign接口中传递, feign调用的方式出现了问题,即查询出来的流, 不能返回到业务服务.

业务服务
云相关服务

2 解决方案

查询相关的资料, 发现流不能直接通过feign接口调用, 因为流在传输过程中,不能有效的转换,所以接受流都为空. 对于此问题, 有两种方法, 第一种是把流装换为字节数组传输, 字节数组在feign接口调用中,能够有效的传输 ; 第二种通过response对象传递流 ; 第三种,听大佬说, feign接口调用如果要传递流,需要加额外的配置,添加相关的转换. (未知,待验证)

1 通过字节数组

云服务接口

    @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);

2 通过Response


    @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();

3 总结

通过上述方法可知, 都是通过转换的方式来传递流,并没有直接把流直接传递的方式,对于方式三, 还需要学习探索,也欢迎有懂的学者来补充指正.

你可能感兴趣的:(Java学习,微服务,java,microservices)