springboot對(duì)接minio的webhook完整步驟記錄
前言
近日需要將minio的apache2.0版本給用起來(lái),順便要完善一下原有的文件上傳管理系統(tǒng),其中很重要的一點(diǎn)是,在原有客戶(hù)端直傳的基礎(chǔ)上,再添加 minio 的上傳回調(diào)給服務(wù)端做后續(xù)處理。
本文重點(diǎn)在于,介紹整個(gè)minio與springboot對(duì)接webhook過(guò)程。
ps:minio-2021-04-22,mc-2021-04-22 是我從源代碼編譯出來(lái)的最后一個(gè)apache2.0版本,無(wú)視即可,可以直接從官網(wǎng)下載再新版—除非你也想折騰。
minio的啟動(dòng)以及賬號(hào)密碼設(shè)置
啟動(dòng)腳本如下:
#!/bin/sh mkdir uploads mkdir configs touch log.log export MINIO_ROOT_USER='minio' ##這是管理賬號(hào),請(qǐng)根據(jù)實(shí)際自行設(shè)定 export MINIO_ROOT_PASSWORD='123456' ##這是密碼,請(qǐng)根據(jù)實(shí)際自行設(shè)定 export MINIO_BROWSER=on nohup ./minio-2021-04-22 server --address ":9000" ./uploads >> log.log 2>&1 & ## :9000 表示監(jiān)聽(tīng)端口9000, ./uploads 指定當(dāng)前文件夾下面的子文件夾 uploads為文件存儲(chǔ)目錄。 tail -f log.log
先進(jìn)行啟動(dòng):

那么來(lái)了,使用mc來(lái)進(jìn)行管理。首先要明確一點(diǎn)就是:
mc 第一次啟動(dòng)時(shí)不知道你的minio實(shí)例在哪里的,你需要指定,設(shè)置一下minio實(shí)例以及賬號(hào)密碼,例如:
## -- 首先,需要設(shè)置 別名--- 就是如何訪問(wèn)某個(gè)minio實(shí)例,例如: mc alias set myminio https://myminio.example.net minioadminuser minioadminpassword 具體到本文提到的服務(wù),那就是: ./mc-2021-04-22 alias set myminio http://127.0.0.1:9000 'minio' '123456'
ps:切記?。。≈挥心阒付司唧w的minio鏈接方式才能對(duì)minio進(jìn)行管理的。
好了,看看是不是有webhook設(shè)置了:
./mc-2021-04-22 admin config get myminio notify_webhook
如果沒(méi)有設(shè)置過(guò)的話(huà)可以看到:
notify_webhook enable=off endpoint= auth_token= queue_limit=0 queue_dir= client_cert= client_key=
在對(duì)minio設(shè)置webhook之前,切回到springboot,我們先寫(xiě)一段代碼用于接收minio的調(diào)用,注意,必須能夠訪問(wèn)到的,否則后續(xù)的步驟是走不下去的
springBoot實(shí)際接收action
偽代碼如下:
@Api(tags="上傳接口")
@Controller("/api/appUpload")
@RequestMapping(value = "/api/appUpload",produces = "application/json; charset=utf-8")
public class AppUploadController {
private static final String logName="文件控制器";
private static final Logger logger= LoggerFactory.getLogger(logName);
/*****
* 規(guī)則:
* 例如,如果是從minio過(guò)來(lái)的webhook,就用:
* /webhooks/minio/uploadedFinish 這些
* aliyun的用:
* /webhooks/ali/uploadedFinish
* ****/
@ApiOperation(value = "webhook回調(diào)")
@RequestMapping(value = "/webhooks/{uploadType}/{hookName}",
method = RequestMethod.POST)
@ResponseBody
public OpResult webhooks(
HttpServletRequest request
, HttpServletResponse response
,@PathVariable("uploadType") String uploadType
,@PathVariable("hookName") String hookName
,@RequestBody HashMap params
) {
if(params==null||params.size()<1){
return OpResult.success("");
}
String auth=request.getHeader("Authorization");
//顯示結(jié)果: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:****/
}
return OpResult.success();
}
}
簡(jiǎn)單介紹一下這個(gè)action。
就是一個(gè)白板,有兩個(gè)path參數(shù),分別是uploadType–可以是阿里云或者minio,這是為了以后預(yù)留的,而后面就是真實(shí)的hookname了—也是為了后面預(yù)留的,因?yàn)榭赡苡衐eleted,modified之類(lèi)的。
方法體什么都沒(méi)做,就是打印了uploadType,hookName,還有 minio調(diào)用之后傳過(guò)來(lái)的authority頭以及request body參數(shù)。
假定,這個(gè)action的訪問(wèn)url現(xiàn)在是:
http://localhost:9608/app-base/api/appUpload/webhooks/{uploadType}/{hookName}
好了,springboot部分基本結(jié)束----實(shí)際業(yè)務(wù)得你自行接入完善。
mc正式設(shè)置webhook
mc設(shè)置webhook的命令格式如下:
mc admin config set {minio實(shí)例名稱(chēng)} notify_webhook:{webhook規(guī)則名稱(chēng)} endpoint="{回調(diào)的url地址,必須確保能夠訪問(wèn)到}" auth_token="{這算是身份密令了與業(yè)務(wù)系統(tǒng)有關(guān)自行設(shè)置}" queue_dir="{對(duì)回調(diào)請(qǐng)求進(jìn)行持久化,保存到的文件目錄,必須為絕對(duì)路徑,不接受相對(duì)路徑}" queue_limit="{最大保存多少個(gè)回調(diào)請(qǐng)求}"
好了,那么對(duì)于本文, 命令如下:
./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" ## 補(bǔ)充說(shuō)明 $(pwd)表示獲取當(dāng)前文件的根目錄,例如, 如果是在 /home/testA/minio 下面執(zhí)行命令的話(huà),那么: $(pwd) = /home/testA/minio 而queue_dir的值就是: /home/testA/minio/queues/fs_uploaded_hook 使用 $(pwd) 可以解決每次都要手動(dòng)輸入絕對(duì)路徑的問(wèn)題。
好了,需要重啟一下服務(wù),然后再查看是不是設(shè)置成功:
./mc-2021-04-22 admin config get myminio notify_webhook

下面來(lái)重點(diǎn)了,上面的步驟只是保證了你添加了一個(gè)叫做
fs_uploaded_hook
的 webhook規(guī)則,規(guī)定了回調(diào)的url等等,minio里面的bucket還沒(méi)有應(yīng)用到這個(gè)規(guī)則上,你需要為bucket指定應(yīng)用規(guī)則才行。
指定bucket應(yīng)用規(guī)則的命令為:
mc event add {受管控的minio實(shí)例名稱(chēng)}/{bucket名稱(chēng)} arn:minio:sqs::{剛才你添加的規(guī)則名稱(chēng)}:webhook -p --event {可以是put,delete等} --suffix '.*'(適用的后綴名,可以設(shè)置 .* 表示全部)
假設(shè)目前的minio的bucket有:

那么,實(shí)際上執(zhí)行命令就是:
./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 '.*'
驗(yàn)證是否成功設(shè)置:
./mc-2021-04-22 event list myminio/files ./mc-2021-04-22 event list myminio/test-files

好了,設(shè)置成功了。
驗(yàn)證聯(lián)調(diào)
下面上傳一個(gè)文件到某個(gè)bucket,然后看看是不是真的會(huì)調(diào)用webhook,執(zhí)行邏輯:
ps:mc可以直接上傳文件到minio的,例如:
./mc-2021-04-22 cp favicon.png myminio/files

返回看看springBoot的輸出:

下面順便將輸出的json字符串格式化貼出來(lái),方便以后調(diào)試整理:
{
"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"
}總結(jié)
到此這篇關(guān)于springboot對(duì)接minio的webhook的文章就介紹到這了,更多相關(guān)springboot對(duì)接minio的webhook內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于idea2020.3升級(jí)lombok不能使用的問(wèn)題
這篇文章主要介紹了關(guān)于idea2020.3升級(jí)lombok不能使用的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
一文掌握spring cloud gateway(總結(jié)篇)
Spring Cloud Gateway是Spring Cloud的全新項(xiàng)目,該項(xiàng)目是基于Spring 5.0,Spring WebFlux和Project Reactor等技術(shù)開(kāi)發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的API路由管理方式,本文通過(guò)實(shí)例代碼總結(jié)介紹spring cloud gateway的相關(guān)知識(shí),感興趣的朋友一起看看吧2024-12-12
Java的Spring框架中實(shí)現(xiàn)發(fā)送郵件功能的核心代碼示例
這篇文章主要介紹了Java的Spring框架中實(shí)現(xiàn)發(fā)送郵件功能的核心代碼示例,包括發(fā)送帶附件的郵件功能的實(shí)現(xiàn),需要的朋友可以參考下2016-03-03
Java實(shí)現(xiàn)一鍵將Word文檔轉(zhuǎn)為PDF
在開(kāi)發(fā)中,經(jīng)常會(huì)碰到需要把 Word 文檔轉(zhuǎn)換成 PDF 格式的需求,Java 有不少好用的庫(kù)能實(shí)現(xiàn)這個(gè)功能,本文為大家介紹了兩個(gè)常用的方法,需要的可以了解下2025-02-02
idea項(xiàng)目結(jié)構(gòu)中不顯示out文件夾的解決
本文通過(guò)圖片的方式詳細(xì)解釋操作步驟,使讀者能夠更直觀更方便地理解和執(zhí)行操作,同時(shí),文章末尾祝福讀者步步高升,一帆風(fēng)順,展現(xiàn)了作者的人情味和親和力,整體來(lái)說(shuō),這是一篇簡(jiǎn)單易懂、實(shí)用性強(qiáng)的操作指南2024-10-10
javaweb中mysql數(shù)據(jù)庫(kù)連接步驟方法及其實(shí)例
這篇文章主要介紹了使用java web 連接MySQL數(shù)據(jù)庫(kù)的驅(qū)動(dòng)方法的相關(guān)知識(shí),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-04-04
使用spring boot 整合kafka,延遲啟動(dòng)消費(fèi)者
這篇文章主要介紹了使用spring boot 整合kafka,延遲啟動(dòng)消費(fèi)者的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

