如何在Docker Swarm中将minio的预签名URL与其他微服务一起使用,以通过Java客户端API上传文件?

时间:2019-11-18 15:40:46

标签: java docker docker-swarm minio

我想使用对象存储预签名URL在docker swarm集群上的集群上与其他微服务一起上传文件。

我的设置是一个docker swarm集群,在该集群上,我运行了多个mirco服务,例如数据库,后端,前端以及对象存储。我初始化为服务

docker service create --name=backend --publish=8080:8080 --with-registry-auth  <backendDockerImage or other images variable ports  >

现在,我的一个微服务从后端获取了一个生成的预签名URL,并应该上传一个文件。以下功能通常会上传文件。它获取文件路径和presignedURL,并返回包含更多元数据的FileMetaData对象。

public FileMetaData uploadPresign(String filePath, String presignedURL) {
    URLConnection urlconnection;
    try {
      String contentType = Files.probeContentType(Paths.get(filePath));
      URL url = new URL(presignedURL);

      urlconnection = url.openConnection();
      urlconnection.setDoOutput(true);
      urlconnection.setDoInput(true);

      if (urlconnection instanceof HttpURLConnection) {
        try {
          ((HttpURLConnection) urlconnection).setRequestMethod("PUT");
          urlconnection.setRequestProperty("Content-Type", contentType);
          urlconnection.connect();
        } catch (ProtocolException e) {
          LOGGER.error("ProtocolException");
          LOGGER.error(e.toString());
          throw new BadRequestException("Internal server Error");
        }
      }
      BufferedOutputStream bos = new BufferedOutputStream(urlconnection.getOutputStream());
      BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(filePath)));
      int i;
      // read byte by byte until end of stream
      while ((i = bis.read()) >= 0) {
        bos.write(i);
      }
      bos.close();
      // Getting error here (Bad request).
      LOGGER.info(
          "Check the response message: "
              + ((HttpURLConnection) urlconnection).getResponseMessage());

    } catch (Exception e) {
      String[] allfiles = {TEMP_HMM_PROFILE, TEMP_DATABASE, TEMP_OUTPUTFILE};
      deleteFiles(allfiles);
      LOGGER.error("Exception");
      LOGGER.error(e.getMessage());
      throw new BadRequestException("Internal server Error");
    }
    return updateData(urlconnection, presignedURL);
  }

当我在本地使用此功能启动worker并连接到docker swarm集群时,文件已正确上传。

但是,当我在集群上部署工作服务器并使用上述功能上传文件时,会收到400: Bad Request响应。而且没有文件上传。

如果我错过了docker swarm的建筑概念,请告诉我们。

0 个答案:

没有答案