Feign实现微服务间文件下载

作者: AaronSimon | 来源:发表于2018-08-21 11:40 被阅读59次

    在使用Feign做服务间调用的时候,当下载大的文件会出现堆栈溢出的情况。另外,文件管理服务(服务提供者)文件下载接口无返回值,是通过HttpServletRespoonse传输的流数据来响应,那么服务消费者该如何接受下载的数据呢?

    一. 示例介绍

    服务名 端口号 角色
    feign_upload_first 8100 feign服务提供者
    feign_upload_second 8101 feign服务消费者

    我们调用feign_upload_second的下载文件接口下载文件,feign_upload_second内部使用feign调用feign_upload_first实现文件下载。

    二、feign_upload_first服务提供者

    • 服务提供者下载文件接口
    @RequestMapping(value = "/downloadFile",method = RequestMethod.GET,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
        public void downloadFile(HttpServletResponse response){
          String filePath = "D://1.txt";
          File file = new File(filePath);
          InputStream in = null;
          if(file.exists()){
            try {
              OutputStream out = response.getOutputStream();
              in = new FileInputStream(file);
              byte buffer[] = new byte[1024];
              int length = 0;
              while ((length = in.read(buffer)) >= 0){
                out.write(buffer,0,length);
              }
            } catch (IOException e) {
              e.printStackTrace();
            } finally {
              if(in != null){
                try {
                  in.close();
                } catch (IOException e) {
                  e.printStackTrace();
                }
              }
            }
          }
        }
    

    三、feign_upload_second服务消费者

    • 服务提供者远程调用接口
    @RequestMapping(value = "/downloadFile",method = RequestMethod.GET,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
      Response downloadFile();
    

    用feign.Response来接收

    • 服务提供者下载文件接口
    @RequestMapping(value = "/download",method = RequestMethod.GET)
      public ResponseEntity<byte[]> downFile(){
        ResponseEntity<byte[]> result=null ;
        InputStream inputStream = null;
        try {
          // feign文件下载
          Response response = uploadService.downloadFile();
          Response.Body body = response.body();
          inputStream = body.asInputStream();
          byte[] b = new byte[inputStream.available()];
          inputStream.read(b);
          HttpHeaders heads = new HttpHeaders();
          heads.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=123.txt");
          heads.add(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_VALUE);
    
          result = new ResponseEntity <byte[]>(b,heads, HttpStatus.OK);
        } catch (IOException e) {
          e.printStackTrace();
        } finally {
          if(inputStream != null){
            try {
              inputStream.close();
            } catch (IOException e) {
              e.printStackTrace();
            }
          }
        }
        return result;
      }
    

    相关文章

      网友评论

        本文标题:Feign实现微服务间文件下载

        本文链接:https://www.haomeiwen.com/subject/xnvdiftx.html