前言
近日需要将minio的apache2.0版本给用起来,顺便要完善一下原有的文件上传管理系统,其中很重要的一点是,在原有客户端直传的基础上,再添加 minio 的上传回调给服务端做后续处理。
本文重点在于,介绍整个minio与springboot对接webhook过程。
ps:minio-2021-04-22,mc-2021-04-22 是我从源代码编译出来的最后一个apache2.0版本,无视即可,可以直接从官网下载再新版—除非你也想折腾。
minio的启动以及账号密码设置
启动脚本如下:
#!/bin/shmkdir uploads
mkdir configs
touch log.log
exportMINIO_ROOT_USER='minio'##这是管理账号,请根据实际自行设定exportMINIO_ROOT_PASSWORD='123456'##这是密码,请根据实际自行设定exportMINIO_BROWSER=on
nohup ./minio-2021-04-22 server --address":9000" ./uploads >> log.log 2>&1&## :9000 表示监听端口9000, ./uploads 指定当前文件夹下面的子文件夹 uploads为文件存储目录。tail-f log.log
先进行启动:
那么来了,
使用mc来进行管理。首先要明确一点就是:
mc 第一次启动时不知道你的minio实例在哪里的,你需要指定,设置一下minio实例以及账号密码,例如:
## -- 首先,需要设置 别名--- 就是如何访问某个minio实例,例如:mcaliasset myminio https://myminio.example.net minioadminuser minioadminpassword
具体到本文提到的服务,那就是:
./mc-2021-04-22 aliasset myminio http://127.0.0.1:9000 'minio''123456'
ps:切记!!!只有你指定了具体的minio链接方式才能对minio进行管理的。
好了,看看是不是有webhook设置了:
./mc-2021-04-22 admin config get myminio notify_webhook
如果没有设置过的话可以看到:
notify_webhook enable=off endpoint=auth_token=queue_limit=0queue_dir=client_cert=client_key=
在对minio设置webhook之前,切回到springboot,我们先写一段代码用于接收minio的调用,注意,必须能够访问到的,否则后续的步骤是走不下去的
springBoot实际接收action
伪代码如下:
@Api(tags="上传接口")@Controller("/api/appUpload")@RequestMapping(value ="/api/appUpload",produces ="application/json; charset=utf-8")publicclassAppUploadController{privatestaticfinalString logName="文件控制器";privatestaticfinalLogger logger=LoggerFactory.getLogger(logName);/*****
* 规则:
* 例如,如果是从minio过来的webhook,就用:
* /webhooks/minio/uploadedFinish 这些
* aliyun的用:
* /webhooks/ali/uploadedFinish
* ****/@ApiOperation(value ="webhook回调")@RequestMapping(value ="/webhooks/{uploadType}/{hookName}",
method =RequestMethod.POST)@ResponseBodypublicOpResultwebhooks(HttpServletRequest request
,HttpServletResponse response
,@PathVariable("uploadType")String uploadType
,@PathVariable("hookName")String hookName
,@RequestBodyHashMap params
){if(params==null||params.size()<1){returnOpResult.success("");}String auth=request.getHeader("Authorization");//显示结果:uploadType:minio,hookName:uploadFinish,auth:Bearer test
logger.info("uploadType:{},hookName:{},auth:{}",uploadType,hookName,auth);
logger.info("{}",JSONObject.toJSONString(params));if(uploadType.equalsIgnoreCase("minio")){/****TODO:****/}returnOpResult.success();}}
简单介绍一下这个action。
就是一个白板,有两个path参数,分别是uploadType–可以是阿里云或者minio,这是为了以后预留的,而后面就是真实的hookname了—也是为了后面预留的,因为可能有deleted,modified之类的。
方法体什么都没做,就是打印了uploadType,hookName,还有 minio调用之后传过来的authority头以及request body参数。
假定,这个action的访问url现在是:
http://localhost:9608/app-base/api/appUpload/webhooks/{uploadType}/{hookName}
好了,springboot部分基本结束----实际业务得你自行接入完善。
mc正式设置webhook
mc设置webhook的命令格式如下:
mc admin config set{minio实例名称} notify_webhook:{webhook规则名称}endpoint="{回调的url地址,必须确保能够访问到}"auth_token="{这算是身份密令了与业务系统有关自行设置}"queue_dir="{对回调请求进行持久化,保存到的文件目录,必须为绝对路径,不接受相对路径}"queue_limit="{最大保存多少个回调请求}"
好了,那么对于本文, 命令如下:
./mc-2021-04-22 admin config set myminio notify_webhook:fs_uploaded_hook endpoint="http://localhost:9608/app-base/api/appUpload/webhooks/minio/uploadFinish"auth_token="test"queue_dir="$(pwd)/queues/fs_uploaded_hook"queue_limit="10000"## 补充说明 $(pwd)表示获取当前文件的根目录,例如,
如果是在 /home/testA/minio 下面执行命令的话,那么:
$(pwd)= /home/testA/minio
而queue_dir的值就是:
/home/testA/minio/queues/fs_uploaded_hook
使用 $(pwd) 可以解决每次都要手动输入绝对路径的问题。
好了,需要重启一下服务,然后再查看是不是设置成功:
./mc-2021-04-22 admin config get myminio notify_webhook
下面来重点了,上面的步骤只是保证了你添加了一个叫做
fs_uploaded_hook
的 webhook规则,规定了回调的url等等,minio里面的bucket还没有应用到这个规则上,你需要为bucket指定应用规则才行。
指定bucket应用规则的命令为:
mc event add{受管控的minio实例名称}/{bucket名称} arn:minio:sqs::{刚才你添加的规则名称}:webhook -p--event{可以是put,delete等}--suffix'.*'(适用的后缀名,可以设置 .* 表示全部)
假设目前的minio的bucket有:
那么,实际上执行命令就是:
./mc-2021-04-22 event add myminio/files arn:minio:sqs::fs_uploaded_hook:webhook -p--event put --suffix'.*'
./mc-2021-04-22 event add myminio/test-files arn:minio:sqs::fs_uploaded_hook:webhook -p--event put --suffix'.*'
验证是否成功设置:
./mc-2021-04-22 event list myminio/files
./mc-2021-04-22 event list myminio/test-files
好了,设置成功了。
验证联调
下面上传一个文件到某个bucket,然后看看是不是真的会调用webhook,执行逻辑:
ps:mc可以直接上传文件到minio的,例如:
./mc-2021-04-22 cp favicon.png myminio/files
返回看看springBoot的输出:
下面顺便将输出的json字符串格式化贴出来,方便以后调试整理:
{"EventName":"s3:ObjectCreated:Put","Records":[{"eventVersion":"2.0","eventSource":"minio:s3","awsRegion":"","eventTime":"2024-04-03T09:34:01.211Z","eventName":"s3:ObjectCreated:Put","userIdentity":{"principalId":"fileadmin"},"requestParameters":{"principalId":"fileadmin","region":"","sourceIPAddress":"127.0.0.1"},"responseElements":{"content-length":"0","x-amz-request-id":"17C2BB62C324CD16","x-minio-deployment-id":"fe30defd-c85c-48a4-adb5-7482c30696d4","x-minio-origin-endpoint":"http://127.0.0.1:9000"},"s3":{"s3SchemaVersion":"1.0","configurationId":"Config","bucket":{"name":"files","ownerIdentity":{"principalId":"fileadmin"},"arn":"arn:aws:s3:::files"},"object":{"key":"favicon.png","size":2423,"eTag":"7d1e98521f3bbf904511cacf4517d55d","contentType":"image/png","userMetadata":{"content-type":"image/png"},"sequencer":"17C2BB62C34659DD"}},"source":{"host":"127.0.0.1","port":"","userAgent":"MinIO (linux; amd64) minio-go/v7.0.11 mc-2021-04-22/DEVELOPMENT.GOGET"}}],"Key":"files/favicon.png"}
版权归原作者 码农下的天桥 所有, 如有侵权,请联系我们删除。