我想使用对象存储预签名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的建筑概念,请告诉我们。