Feign实现微服务间文件下载

在使用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;
  }

你可能感兴趣的:(Spring,Cloud,Spring,Cloud)