背景
项目中需要对接OSS存储平台实现文件存储方案,最终选择了开源的minio作为基础平台。开发文件上传功能时发现如果文件先传到业务系统,再通过业务系统调用minio的api透传到minio平台的话,文件需要在网络中传输两次,比较低效。虽然一般情况下业务系统可能和minio平台在一个内网环境,从业务系统到minio这部分文件传输可以走内网环境,不占用公司公网带宽,但是始终是一种低效的方案。所以开始研究minio的回调方案,经过研究发现如下文件直传oss的方案行得通,即:首先业务系统提供文件上传链接,用户将文件放入文件上传链接的参数中让文件直传oss,minio回调业务系统服务器告知文件已到达,最后业务系统根据文件信息做相关业务处理。废话不多说直接上干货。
--------------------------MinIO Admin Client安装(windows)-------------------------
- 其他操作系统请看这里
- 下载exe文件:https://dl.min.io/client/mc/release/windows-amd64/mc.exe
- 【非必要步骤】配置环境变量,将mc.exe路径设置到path变量中,如果没有设置环境变量,需要在mc.exe所在目录下执行mc命令。
- 测试
mc -v
mc安装完成。
--------------------------配置minio服务器--------------------------
- 直接上脚本
rem ---------step1:为minio服务器设置别名----------------
mc alias set minio_pro http://192.168.1.10:19000 admin admin
rem ---------step2:配置 webhook---------
rem ---------notice:endpoint 对于 minio server 必须网络可达,否则 mc 会报异常 (one or more targets are offline) error---------
mc admin config set minio_pro/ notify_webhook:fs_file_upload_callback_20230525 endpoint='你业务系统的回调接口地址' comment='描述' queue_limit=10000 queue_dir='/home/minio-events'
rem ---------step3:重启 minio server---------
mc admin service restart minio_pro/
注意:
- step1中将http://192.168.1.10:19000 admin admin换成你自己的minio服务器地址,用户名和密码;minio_pro就是你设置的minio服务器别名。
- step2中minio_pro换成在step1中设置的别名;fs_file_upload_callback_20230525是你的webhook名称,自己定义就行。
- step3minio_pro为step1中设置的别名。
- 查看配置信息
rem ---------step4:check config content---------
mc admin info --json minio_pro/
--------------------------桶配置--------------------------
-
登录minio console
-
进入某个对象桶的桶配置
-
添加事件(手动)
至此,文件上传/下载/删除的回调事件配置完成,接下来需要做的就是在业务系统中实现回调接口的逻辑了,回调接口也就是minio服务器配置脚本中step2的endpoint。回调接口的实现可以通过边调试边开发的方式进行,根据回调入参组织自己的业务逻辑。一般为了方便业务处理,会在生成文件上传链接(minio的另一个功能,有必要的话我可以在另一篇文章分享)的时候加入自己的一些业务标识,方便业务处理。这里po一张我自己开发时候的入参数据结构
- 添加事件(自动)
- 依赖
<!--minio-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
<exclusions>
<exclusion>
<artifactId>okio</artifactId>
<groupId>com.squareup.okio</groupId>
</exclusion>
<exclusion>
<artifactId>okhttp</artifactId>
<groupId>com.squareup.okhttp3</groupId>
</exclusion>
</exclusions>
</dependency>
- 主要逻辑代码(java)
先遍历所有minio的对象桶,然后执行以下逻辑:
public void setMinioBucketwebHook(String bucket, OssHandler ossHandler) {
//设置webhook
List<EventType> eventList = new LinkedList<>();
eventList.add(EventType.OBJECT_CREATED_PUT);
QueueConfiguration queueConfiguration = new QueueConfiguration();
queueConfiguration.setQueue("arn:minio:sqs::fs_file_upload_callback_20230525:webhook");
queueConfiguration.setEvents(eventList);
List<QueueConfiguration> queueConfigurationList = new LinkedList<>();
queueConfigurationList.add(queueConfiguration);
NotificationConfiguration configSet = new NotificationConfiguration();
configSet.setQueueConfigurationList(queueConfigurationList);
ossHandler.setMinioWebHook(configSet, bucket);
}
ossHandler.setMinioWebHook调用的是MinioClient.setBucketNotification方法,MinioClient类在上面的依赖包中。
--------------------------分割线--------------------------
以上是关于minio事件回调的分享,更多细节请查看minio官网
码字不易,望君一键三连,skr