Java负负载载均均衡衡服服务务器器实实现现上上传传文文件件同同步步
负载服务器Z ,应用服务器A 和B ,从A 上传的附件,如何在B上下载下来?
这个问 我的解决思路如下 (后来被一个装逼的面试官给批评了这种做法,不过我瞧不起他)
服务器A 、B 上传附件的时候,将这个附件备份到服务器Z ,当A 、B下载文件的时候,首先会在自己服务器的目录下寻找,如果
找不到,就会从服务器Z 上下载一份到当前服务器。
服务器之间的文件备份通过sftp,参考:https://www .j /article/ 196008.htm (下文中的SftpC stom 类就是这个链接里的
“SFT P上传下载文件例子” 中的类)
这里主要介绍一下重写上传、下载的方法时应该添加的代码
上传文件,异步操作
new Thread(() -> {
SftpCustom fu = new SftpCustom();
fu.upload(file.getAbsolute ath(), getFileName(fileDescr));
fu.closeChannel();
}).start();
下载文件,先从当前服务器寻找
String tmp ath = roots[0].get ath() + '/' + getFileName(fileDescr);
File file2 = new File(tmp ath);
if (file2.exists()) {
return FileUtils.openInputStream(file2);
}
SftpCustom fu = new SftpCustom();
fu.download(getFileName(fileDescr), tmp ath);
file2 = new File(tmp ath);
inputStream = FileUtils.openInputStream(file2);
fu.closeChannel();
return inputStream;
c ba 框架中重写上传文件类FileStorage.j ava 的代码如下:
package com.haulmont.cuba.core.app.custom;
import mon.util.concurrent.ThreadFactoryBuilder;
import com.haulmont.cuba.core.app.FileStorageA I;
import com.haulmont.cuba.core.app.ServerConfig;
import com.haulmont.cuba.core.entity.FileDescriptor;
import com.haulmont.cuba.core.global.*;
import com.haulmont.cuba.core.sys.AppContext;
import com.haulmont.cuba.core.sys.SecurityContext;
import mons.io.FileUtils;
import mons.io.IOUtils;
import mons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation. ostConstruct;
import javax.annotation. reDestroy;
import javax.inject.Inject;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.uti