免费建站网站seo,东营网站建设方案策划,实事新闻热点,石家庄网站推广方案类似于FastDFS/HDFS的一个文件存储服务#xff01; SpringBoot整合MinIO实现分布式文件服务#xff01; #MinIO简介#xff1f;
Minio 是个基于 Golang 编写的开源对象存储套件#xff0c;基于Apache License v2.0开源协议#xff0c;虽然轻量#xff0c;却拥有着不错的… 类似于FastDFS/HDFS的一个文件存储服务 SpringBoot整合MinIO实现分布式文件服务 #MinIO简介
Minio 是个基于 Golang 编写的开源对象存储套件基于Apache License v2.0开源协议虽然轻量却拥有着不错的性能。它兼容亚马逊S3云存储服务接口。可以很简单的和其他应用结合使用例如 NodeJS、Redis、MySQL等。
#1. 应用场景
MinIO 的应用场景除了可以作为私有云的对象存储服务来使用也可以作为云对象存储的网关层无缝对接 Amazon S3 或者 MicroSoft Azure #2. 特点 高性能作为一款高性能存储在标准硬件条件下其读写速率分别可以达到 55Gb/s 和 35Gb/s。并且MinIO 支持一个对象文件可以是任意大小从几kb到最大5T不等。 可扩展不同MinIO集群可以组成联邦并形成一个全局的命名空间并且支持跨越多个数据中心。 云原生容器化、基于K8S的编排、多租户支持。 Amazon S3兼容使用 Amazon S3 v2 / v4 API。可以使用Minio SDKMinio ClientAWS SDK 和 AWS CLI 访问Minio服务器。 SDK支持 GO SDKGitHub - minio/minio-go: MinIO Go client SDK for S3 compatible object storage(opens new window) JavaSDKGitHub - minio/minio-java: MinIO Client SDK for Java(opens new window) PythonSDKGitHub - minio/minio-py: MinIO Client SDK for Python(opens new window) 图形化界面有操作页面 支持纠删码MinIO使用纠删码、Checksum来防止硬件错误和静默数据污染。在最高冗余度配置下即使丢失1/2的磁盘也能恢复数据。 功能很强大~ 源码地址GitHub - minio/minio: High Performance Object Storage for AI(opens new window) 中文文档地址MinIO | 高性能, Kubernetes原生对象存储(opens new window) #安装MinIO
安装非常简单这里使用docker安装步骤如下
#1. 获取镜像
执行命令如下
docker pull minio/minio
#2. 启动镜像
执行命令如下
mkdir -p /opt/mnt/data /opt/mnt/conf
docker run -p 9000:9000 -p 9099:9099 --name minio -d --restartalways -e MINIO_ACCESS_KEYadmin -e MINIO_SECRET_KEYadmin123456789 -v /opt/mnt/data:/data -v /opt/mnt/config:/root/.minio minio/minio server --console-address :9000 --address :9099 /data
命令解释如下 -p9000是图形界面的端口9001是API的端口在使用SDK连接需要用到 MINIO_ACCESS_KEY指定图形界面的用户名 MINIO_SECRET_KEY指定图形界面的密码
按照上述两个步骤启动成功即可。 注意ACCESS_KEY 长度最少3个字符SECRET_KEY 长度最少8个字符 #3. 图形界面操作
安装成功后直接访问地址http:/ip:9000/login如下 输入用户名和密码登录成功后如下 菜单很多这里就不再详细介绍了笔者这里直接在Buckets菜单中创建一个桶为test如下图 并且设置这个桶的隐私规则为public如下 MinIO到此已经安装设置成功了 #SpringBoot整合MinIO上传文件
要实现SDK上传需要检查存放图片data文件是否为最高权限不然上传接口会报错
S3 API Requests must be made to API port
原因权限不够不能创建对应文件路径
解决方案 检查docker映射的data目录 /opt/mnt/data权限如果权限不够 chmod 777 /opt/mnt/data 虽然MinIO在图形界面提供了手动上传的操作但是也可以通过SDK的方式去上传下面介绍一下Spring Boot 整合MinIO上传文件。
#1. 获取accessKey和secretKey
这里的accessKey和secretKey并不是图形界面登录名和密码获取很简单直接在图形界面中操作如下图 #2. 添加依赖
添加MinIO的依赖如下
dependencygroupIdio.minio/groupIdartifactIdminio/artifactIdversion8.5.3/version
/dependencydependencygroupIdcom.squareup.okhttp3/groupIdartifactIdokhttp/artifactIdversion4.10.0/version
/dependency
#3. 添加配置
minio:# minio地址endpoint: http://localhost:9000# 账户username: minioadmin# 密码password: minioadmindefaultBucketName: test
#4. 创建配置类用于生成MinioClient
/*** Description minio配置类*/
Configuration
public class MinioConfig {Value(${minio.endpoint})private String endpoint;Value(${minio.username})private String username;Value(${minio.password})private String password;Value(${minio.defaultBucketName})private String defaultBucketName;Beanpublic MinioClient minioClient(){return MinioClient.builder().credentials(username, password).endpoint(endpoint).build();}}
#5.创建一个返回实体类方便规范返回信息
Data
public class MinioReturn {/*** 文件地址*/private String path;/*** 原始文件名*/private String inputName;/*** 最终文件名*/private String outPutName;}#6.创建MinioTemplate类用来书写minio工具类
Component
public class MinioTemplate {Autowiredprivate MinioClient minioClient;private static final String SLASH /;Value(${minio.defaultBucketName})private String defaultBucketName;Value(${minio.endpoint})private String endpoint;/*** 创建桶** param bucketName* throws Exception*/public void makeBucket(String bucketName) throws Exception {BucketExistsArgs args BucketExistsArgs.builder().bucket(bucketName).build();if (!minioClient.bucketExists(args)) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}}/*** 上传文件** param file* return* throws Exception*/public MinioReturn putFile(MultipartFile file) throws Exception {return putFile(file, file.getOriginalFilename(), defaultBucketName);}public MinioReturn putFile(MultipartFile file, String fileName, String bucketName) throws Exception {if (bucketName null || bucketName.length() 0) {bucketName defaultBucketName;}makeBucket(bucketName);minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build());return new MinioReturn(fileLink(bucketName, fileName), file.getOriginalFilename(), fileName);}/*** 删除文件** param bucketName* param fileName* throws Exception*/public void removeFile(String bucketName, String fileName) throws Exception {minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName null || bucketName.length() 0 ? defaultBucketName : bucketName).object(fileName).build());}SneakyThrowsprivate String fileLink(String bucketName, String fileName) {return endpoint.concat(SLASH).concat(bucketName).concat(SLASH).concat(fileName);}private String getFileName(String fileName) {return getFileName(null, fileName);}private String getFileName(String prefix, String fileName) {String fileNamePre fileName;String fileType ;int index fileName.lastIndexOf(.);if (index 0) {fileNamePre fileName.substring(0, index);fileType fileName.substring(index);}String name UUID.randomUUID().toString().replace(-, );if (!org.springframework.util.StringUtils.isEmpty(fileNamePre)) {name fileNamePre - name fileType;}if (!StringUtils.isEmpty(prefix)) {name prefix - name;}return name;}}
#7.书写控制类用于测试
RestController
RequestMapping(minio)
AllArgsConstructor
public class MinioController {private final MinioTemplate minioTemplate;PostMapping(/upload)ResponseBodypublic MinioReturn upload(MultipartFile file) throws Exception {return minioTemplate.putFile(file);}PostMapping(/remove)ResponseBodypublic String remove(String fileName, String bucketName) throws Exception{minioTemplate.removeFile(bucketName, fileName);return success;}}
#8. 测试 我们查看minio中自动创建了桶并且文件也上传成功了 同样再测试一下删除接口 查看minio中删除成功 如果想通过配置域名映射minio服务器访问指定图片
桶权限设置为public 上述代码创建的桶默认是private的如果想要通过客户端代码调整桶权限的话可以通过minioClient.setBucketPolicy方法设置完后可以通过返回的地址进行访问如下所示如果想要通过外网访问给对应的内网地址端口做个外网映射即可 开启权限public会有个安全问题那就是当你访问桶路径时会发现会把所有桶下的文件列出来这样只要再拼接上文件名就能访问所有文件了 要解决这个问题只需要将权限设置为custom然后将s3:ListBucket取消即可 再次访问会发现权限禁止而加上文件名后是可以正常查看的
当然也可以使用AmazonS3 云存储服务接口 相关文档Amazon S3对象执行操作 - AWS SDK for Java1.x