RustFS安装与使用
由于MinIO的控制台屏蔽了很多之前已有的功能,就剩下查看的功能。今天分享一款最近刚开源的分布式文件系统RustFS,自带管理控制台,功能很强大!RustFS是一个基于Rust语言开发的高性能分布式对象存储软件,与MinIO一样,它具有使用简单、兼容AWS S3协议、开源等优势,它采用Apache开源协议。
1. RustFS介绍
RustFS的主要特效如下:
- 高性能:基于Rust构建,具有较高的性能和响应速度。
- 分布式架构:可扩展且容错的设计,适用于大规模部署。
- AWS S3 兼容性:可使用AWS S3 SDK来管理它。
数据湖支持:针对大数据和AI工作负载进行了优化。 - 开源:采用Apache 2.0许可证,鼓励社区贡献和透明度。
- 用户友好:具有可视化管理控制台,方便管理。
2. RustFS下载
官网:
https://rustfs.com/download/?platform=windows下面是RustFS使用过程中的效果图,功能还是很强大的!
下载安装后,运行访问RustFS的管理控制台了,默认账号密码为rustfsadmin:rustfsadmin,访问地址:http://127.0.0.1:9000
3. RustFS使用
3.1. 引入依赖
<!-- S3 SDK 依赖 --><dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>2.20.161</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId><version>5.8.22</version></dependency>3.2. yaml配置
rustfs:endpoint:http://127.0.0.1:9000bucketName:simpleaccessKey:rustfsadminsecretKey:rustfsadmin3.3. RustFS配置类
@ConfigurationpublicclassRustFSConfig{@Value("${rustfs.endpoint}")privateStringENDPOINT;@Value("${rustfs.accessKey}")privateStringACCESS_KEY;@Value("${rustfs.secretKey}")privateStringSECRET_KEY;@BeanpublicS3Clients3Client(){// 初始化 S3 客户端returnS3Client.builder().endpointOverride(URI.create(ENDPOINT))// RustFS 地址.region(Region.US_EAST_1)// 可写死,RustFS 不校验 region.credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(ACCESS_KEY,SECRET_KEY))).forcePathStyle(true)// 关键配置!RustFS 需启用 Path-Style.build();}}3.4. 实体类
/** * @description RustFS Bucket访问策略配置 */@Data@EqualsAndHashCode@BuilderpublicclassBucketPolicyConfigDto{privateStringID;privateStringVersion;privateList<Statement>Statement;@Data@EqualsAndHashCode@BuilderpublicstaticclassStatement{privateStringEffect;privatePrincipalPrincipal;privateString[]Action;privateString[]Resource;}@Data@EqualsAndHashCode@BuilderpublicstaticclassPrincipal{privateString[]AWS;}}/** * @description RustFS文件上传返回结果 */@DatapublicclassRustFSUploadResult{//"文件访问URL")privateStringurl;//@Schema(title = "文件名称")privateStringname;}3.5. 实现文件上传和删除功能
- 当Bucket不存在时先创建并设置访问策略为公开只读
- 代码中添加Bucket的访问策略的逻辑,主要是通过实体类BucketPolicyConfigDto生成了策略对应的JSON配置
@Slf4j@Controller@RequestMapping("/rustfs")publicclassRustFSController{@AutowiredprivateS3Clients3Client;@Value("${rustfs.bucketName}")privateStringBUCKET_NAME;@Value("${rustfs.endpoint}")privateStringENDPOINT;/** * 文件上传 */@PostMapping(value="/upload",consumes=MediaType.MULTIPART_FORM_DATA_VALUE)@ResponseBodypublicResponseEntity<RustFSUploadResult>upload(@RequestPart("file")MultipartFilefile){// 判断Bucket是否存在if(!bucketExists(BUCKET_NAME)){// 创建Buckets3Client.createBucket(CreateBucketRequest.builder().bucket(BUCKET_NAME).build());log.info("Bucket created: {}",BUCKET_NAME);// 添加Bucket的访问策略//String policy = JSONUtil.toJsonStr(createBucketPolicyConfigDto(BUCKET_NAME));Stringpolicy=JSON.toJSONString(createBucketPolicyConfigDto(BUCKET_NAME));log.info(policy);PutBucketPolicyRequestpolicyReq=PutBucketPolicyRequest.builder().bucket(BUCKET_NAME).policy(policy).build();s3Client.putBucketPolicy(policyReq);}else{log.info("Bucket already exists.");}// 上传文件try{s3Client.putObject(PutObjectRequest.builder().bucket(BUCKET_NAME).key(file.getOriginalFilename()).contentType(file.getContentType()).build(),RequestBody.fromInputStream(file.getInputStream(),file.getSize()));RustFSUploadResultuploadResult=newRustFSUploadResult();uploadResult.setName(file.getOriginalFilename());uploadResult.setUrl(ENDPOINT+"/"+BUCKET_NAME+"/"+file.getOriginalFilename());returnResponseEntity.ok(uploadResult);}catch(IOExceptione){e.printStackTrace();}returnResponseEntity.ok(null);}/** * 文件删除 */@PostMapping(value="/delete")@ResponseBodypublicResponseEntity<String>delete(@RequestParam("objectName")StringobjectName){// 删除对象s3Client.deleteObject(DeleteObjectRequest.builder().bucket(BUCKET_NAME).key(objectName).build());returnResponseEntity.ok(null);}/** * 判断Bucket是否存在 */privatebooleanbucketExists(StringbucketName){try{s3Client.headBucket(request->request.bucket(bucketName));returntrue;}catch(NoSuchBucketExceptionexception){returnfalse;}}/** * 创建存储桶的访问策略,设置为只读权限 */privateBucketPolicyConfigDtocreateBucketPolicyConfigDto(StringbucketName){BucketPolicyConfigDto.Statementstatement=BucketPolicyConfigDto.Statement.builder().Effect("Allow").Principal(BucketPolicyConfigDto.Principal.builder().AWS(newString[]{"*"}).build()).Action(newString[]{"s3:GetObject"}).Resource(newString[]{"arn:aws:s3:::"+bucketName+"/*"}).build();returnBucketPolicyConfigDto.builder().Version("2012-10-17").Statement(CollUtil.toList(statement)).build();}}