
由于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/?platformwindows下面是RustFS使用过程中的效果图功能还是很强大的下载安装后运行访问RustFS的管理控制台了默认账号密码为rustfsadmin:rustfsadmin访问地址http://127.0.0.1:90003. RustFS使用3.1. 引入依赖!-- S3 SDK 依赖 --dependencygroupIdsoftware.amazon.awssdk/groupIdartifactIds3/artifactIdversion2.20.161/version/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-core/artifactIdversion5.8.22/version/dependency3.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访问策略配置 */DataEqualsAndHashCodeBuilderpublicclassBucketPolicyConfigDto{privateStringID;privateStringVersion;privateListStatementStatement;DataEqualsAndHashCodeBuilderpublicstaticclassStatement{privateStringEffect;privatePrincipalPrincipal;privateString[]Action;privateString[]Resource;}DataEqualsAndHashCodeBuilderpublicstaticclassPrincipal{privateString[]AWS;}}/** * description RustFS文件上传返回结果 */DatapublicclassRustFSUploadResult{//文件访问URL)privateStringurl;//Schema(title 文件名称)privateStringname;}3.5. 实现文件上传和删除功能当Bucket不存在时先创建并设置访问策略为公开只读代码中添加Bucket的访问策略的逻辑主要是通过实体类BucketPolicyConfigDto生成了策略对应的JSON配置Slf4jControllerRequestMapping(/rustfs)publicclassRustFSController{AutowiredprivateS3Clients3Client;Value(${rustfs.bucketName})privateStringBUCKET_NAME;Value(${rustfs.endpoint})privateStringENDPOINT;/** * 文件上传 */PostMapping(value/upload,consumesMediaType.MULTIPART_FORM_DATA_VALUE)ResponseBodypublicResponseEntityRustFSUploadResultupload(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));StringpolicyJSON.toJSONString(createBucketPolicyConfigDto(BUCKET_NAME));log.info(policy);PutBucketPolicyRequestpolicyReqPutBucketPolicyRequest.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()));RustFSUploadResultuploadResultnewRustFSUploadResult();uploadResult.setName(file.getOriginalFilename());uploadResult.setUrl(ENDPOINT/BUCKET_NAME/file.getOriginalFilename());returnResponseEntity.ok(uploadResult);}catch(IOExceptione){e.printStackTrace();}returnResponseEntity.ok(null);}/** * 文件删除 */PostMapping(value/delete)ResponseBodypublicResponseEntityStringdelete(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.StatementstatementBucketPolicyConfigDto.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();}}