目录
- fastdfs概述
- Java程序对接fastDFS
- pom
- 配置java启动类注解
- yaml文件配置
- controller类
- service类
fastdfs概述
什么是分布式文件系统?
是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机与节点相连。
通俗来讲:
- 传统文件系统管理的文件就存储在本机
- 分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论是上传或者访问文件,都需要通过管理中心来访问。
FastDFs是由淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件系统。用纯C语言开发,功能丰富:
- 文件存储·
- 文件同步
- 文件访问(上传、下载)。
- 存取负载均衡。
- 在线扩容
适合有大容量存储需求的应用或系统。同类的分布式文件系统有谷歌的GFS、HDFS(Hadoop)、TFS(淘宝)等。
FastDFS两个主要的角色:TrackerServer和storage Server
- Tracker Server:跟踪服务器,主要负责调度storage节点与cint通信,在访问上起负载均衡的作用,和记录storage节点的运行状态(监控),是连接client和storage节点的枢纽
- Storage Server:存储服务器,保存文件和文件的metadata(元数据),每个storageserver会启动一个单独的线程主动向Tracker cluster中每个trackersever报告状态信息(心跳),包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息
- Group:文件组,多台storageServer的售群。上传一个文件到同组内的一台机器上后,FastDFs会将该文件即时同步到同组内的其它所有机器上,起到备份的作用。不同组的服务器,保存的数据不同,而且相互独立,不进行通信。
- Tracker cluster:跟踪服务器的集群,有一组Tracker Server(跟踪服务器)组成
- storage Cluster:存储集群,有多个Group组成
Java程序对接fastDFS
pom
<!-- fastDFS分布式文件存储 -->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
配置java启动类注解
@Import(FdfsClientConfig.class)---->加此注解就可以拥有带有连接池的Fastdfs java客户端了
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)------->为了解决JMX重复注册bean的问题
@Import(FdfsClientConfig.class)
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
yaml文件配置
fdfs:
so-timeout: 1501
connect-timeout: 601
thumb-image: # 缩略图
width: 60
height: 60
tracker-list: # tracker地址
- 192.168.103.100:22122
view-base-url: http://192.168.103.100:8888 #网页应用配置服务器地址
controller类
@RestController
public class UploadController {
@Autowired
private UploadService uploadService;
@PostMapping("/upload")
public ImageResult create(@RequestBody MultipartFile file){
return uploadService.create(file);
}
@DeleteMapping("/delete")
public boolean delete(@RequestParam("url")String url){
return uploadService.delete(url);
}
}
service类
@Service
@Log4j2
public class UploadServiceImpl implements UploadService {
//fastDFS客户端
@Autowired
FastFileStorageClient fastFileStorageClient;
//读取缩略图
@Autowired
private ThumbImageConfig thumbImageConfig;
@Value("${fdfs.view-base-url}")
private String basePath;
/**
* 图片上传至fastfds上
* @param file
* @return
*/
@Override
public ImageResult create(MultipartFile file) {
// 获取文件后缀名
String extension = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");
//上传
StorePath storePath = null;
InputStream is =null;
try {
// upload上传(任意类型文件都可以)
is=file.getInputStream();
storePath = fastFileStorageClient.uploadImageAndCrtThumbImage(is, file.getSize(), extension,null);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
// 输入流必须关闭,否则无法删除tomcat下的临时文件
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
log.info("正常图片的路径:{}",storePath.getFullPath());
log.info("缩略图片的路径:{}",thumbImageConfig.getThumbImagePath(storePath.getFullPath()));
return new ImageResult()
.setErrno(0)
.setData(new Image()
.setUrl(basePath+"/"+storePath.getFullPath()));
}
//图片删除
@Override
public boolean delete(String url) {
try {
fastFileStorageClient.deleteFile(url);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}