文件内部传输
[一]背景
Dante Cloud 默认使用 OSS 作为文件存储介质,并提供了 OSS 服务支持文件的操作和管理。但是,当前模式下,仅支持前端以接口调用的方式来实现文件管理,如果存在服务间传输文件的需求,将无法满足。
为了解决这个问题,同时便于用户使用,在最新版本的 Dante Cloud 中,新增了服务间远程文件传输支持,填补了微服务文件管理的空缺。
[二]使用
[1]引入依赖
自 Dante Cloud 3.3.5.0 版本起,新增了 rpc-client-oss-spring-boot-starter
模块。需要在使用服务间文件传输的服务(非 OSS 服务)中引入该模块后,才能调用文件间传输接口。
rpc-client-oss-spring-boot-starter
模块支持 Openfeign 和 GRPC 两种远程传输模式,会根据当前服务的环境自动判断使用哪种方式。
- 如果当前服务为 Reactive 环境,那么就会自动切换为使用 GPRC 进行传输
- 如果当前服务为 Servlet 环境,那么就会自动切换为使用 Openfeign 进行传输
另外,远程传输还需要服务本地文件管理的支持。利用服务本地文件管理的支持,不仅可以实现服务向 OSS 服务远程上传和下载文件,还可以实现以 OSS 服务为中转,非 OSS 服务间传递文件。
注意
目前,不支持脱离 OSS 服务,实现其它服务间点对点的文件传输。一方面,这种实现比较困难,完全类似于下载软件的需求实现较为复杂,另一方面,这种需求非常小众,应用场景非常有限,特别是在服务于服务之间。
如果确实需要这种需求,建议使用外部的文件同步或者文件共享机制实现。
[2]添加配置
因为需要服务本地文件管理的支持,所以需要添加服务本地文件管理的支持。服务本地文件管理详情参见:【服务本地文件管理】
[3]引入操作Bean
需要在你的代码中,注入 FileTransformer
Bean,然后通过调用其中相应的方法就可以进行文件管理操作。
例如,新建一个 MyFileService
,在这个 Service 代码中注入FileTransformer
Bean,如下例所示:
@Service
public class MyFileService {
private final FileTransformer fileTransformer;
public MyFileService(FileTransformer fileTransformer) {
this.fileTransformer = FileTransformer;
}
}
提示
依赖了 rpc-client-oss-spring-boot-starter
模块后,会自动将 FileTransformer
注入,在自己的代码中直接注入就可以使用。如果当前的操作不满足您的需求,FileTransformer
是一个接口定义,可以按您自己的需求进行扩展。
FileTransformer
支持的操作如下所示:
public interface FileTransformer {
/**
* 文件上传。
* <p>
* 将服务本地文件上传至对象存储服务中
*
* @param bucketName 存储桶名称
* @param directory 本地文件目录
* @param fileName 文件名
* @return true 上传成功;false 上传失败。
*/
boolean upload(String bucketName, String directory, String fileName);
/**
* 文件上传。
* <p>
* 将服务本地文件上传至对象存储服务中
*
* @param bucketName 存储桶名称
* @param fileName 文件名
* @return true 上传成功;false 上传失败。
*/
default boolean upload(String bucketName, String fileName) {
return upload(bucketName, null, fileName);
}
/**
* 文件下载。
* <p>
* 将对象存储服务中文件下载至服务本地
*
* @param bucketName 存储桶名称
* @param directory 本地文件目录
* @param fileName 文件名
* @return true 上传成功;false 上传失败。
*/
boolean download(String bucketName, String directory, String fileName);
/**
* 文件下载。
* <p>
* 将对象存储服务中文件下载至服务本地
*
* @param bucketName 存储桶名称
* @param fileName 文件名
* @return true 上传成功;false 上传失败。
*/
default boolean download(String bucketName, String fileName) {
return download(bucketName, null, fileName);
}
}