springboot對接minio的webhook完整步驟記錄
前言
近日需要將minio的apache2.0版本給用起來,順便要完善一下原有的文件上傳管理系統(tǒng),其中很重要的一點是,在原有客戶端直傳的基礎(chǔ)上,再添加 minio 的上傳回調(diào)給服務(wù)端做后續(xù)處理。
本文重點在于,介紹整個minio與springboot對接webhook過程。
ps:minio-2021-04-22,mc-2021-04-22 是我從源代碼編譯出來的最后一個apache2.0版本,無視即可,可以直接從官網(wǎng)下載再新版—除非你也想折騰。
minio的啟動以及賬號密碼設(shè)置
啟動腳本如下:
#!/bin/sh mkdir uploads mkdir configs touch log.log export MINIO_ROOT_USER='minio' ##這是管理賬號,請根據(jù)實際自行設(shè)定 export MINIO_ROOT_PASSWORD='123456' ##這是密碼,請根據(jù)實際自行設(shè)定 export MINIO_BROWSER=on nohup ./minio-2021-04-22 server --address ":9000" ./uploads >> log.log 2>&1 & ## :9000 表示監(jiān)聽端口9000, ./uploads 指定當前文件夾下面的子文件夾 uploads為文件存儲目錄。 tail -f log.log
先進行啟動:
那么來了,使用mc來進行管理。首先要明確一點就是:
mc 第一次啟動時不知道你的minio實例在哪里的,你需要指定,設(shè)置一下minio實例以及賬號密碼,例如:
## -- 首先,需要設(shè)置 別名--- 就是如何訪問某個minio實例,例如: 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:切記?。?!只有你指定了具體的minio鏈接方式才能對minio進行管理的。
好了,看看是不是有webhook設(shè)置了:
./mc-2021-04-22 admin config get myminio notify_webhook
如果沒有設(shè)置過的話可以看到:
notify_webhook enable=off endpoint= auth_token= queue_limit=0 queue_dir= client_cert= client_key=
在對minio設(shè)置webhook之前,切回到springboot,我們先寫一段代碼用于接收minio的調(diào)用,注意,必須能夠訪問到的,否則后續(xù)的步驟是走不下去的
springBoot實際接收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過來的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(); } }
簡單介紹一下這個action。
就是一個白板,有兩個path參數(shù),分別是uploadType–可以是阿里云或者minio,這是為了以后預(yù)留的,而后面就是真實的hookname了—也是為了后面預(yù)留的,因為可能有deleted,modified之類的。
方法體什么都沒做,就是打印了uploadType,hookName,還有 minio調(diào)用之后傳過來的authority頭以及request body參數(shù)。
假定,這個action的訪問url現(xiàn)在是:
http://localhost:9608/app-base/api/appUpload/webhooks/{uploadType}/{hookName}
好了,springboot部分基本結(jié)束----實際業(yè)務(wù)得你自行接入完善。
mc正式設(shè)置webhook
mc設(shè)置webhook的命令格式如下:
mc admin config set {minio實例名稱} notify_webhook:{webhook規(guī)則名稱} endpoint="{回調(diào)的url地址,必須確保能夠訪問到}" auth_token="{這算是身份密令了與業(yè)務(wù)系統(tǒng)有關(guān)自行設(shè)置}" queue_dir="{對回調(diào)請求進行持久化,保存到的文件目錄,必須為絕對路徑,不接受相對路徑}" queue_limit="{最大保存多少個回調(diào)請求}"
好了,那么對于本文, 命令如下:
./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 下面執(zhí)行命令的話,那么: $(pwd) = /home/testA/minio 而queue_dir的值就是: /home/testA/minio/queues/fs_uploaded_hook 使用 $(pwd) 可以解決每次都要手動輸入絕對路徑的問題。
好了,需要重啟一下服務(wù),然后再查看是不是設(shè)置成功:
./mc-2021-04-22 admin config get myminio notify_webhook
下面來重點了,上面的步驟只是保證了你添加了一個叫做
fs_uploaded_hook
的 webhook規(guī)則,規(guī)定了回調(diào)的url等等,minio里面的bucket還沒有應(yīng)用到這個規(guī)則上,你需要為bucket指定應(yīng)用規(guī)則才行。
指定bucket應(yīng)用規(guī)則的命令為:
mc event add {受管控的minio實例名稱}/{bucket名稱} arn:minio:sqs::{剛才你添加的規(guī)則名稱}:webhook -p --event {可以是put,delete等} --suffix '.*'(適用的后綴名,可以設(shè)置 .* 表示全部)
假設(shè)目前的minio的bucket有:
那么,實際上執(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 '.*'
驗證是否成功設(shè)置:
./mc-2021-04-22 event list myminio/files ./mc-2021-04-22 event list myminio/test-files
好了,設(shè)置成功了。
驗證聯(lián)調(diào)
下面上傳一個文件到某個bucket,然后看看是不是真的會調(diào)用webhook,執(zhí)行邏輯:
ps:mc可以直接上傳文件到minio的,例如:
./mc-2021-04-22 cp favicon.png myminio/files
返回看看springBoot的輸出:
下面順便將輸出的json字符串格式化貼出來,方便以后調(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對接minio的webhook的文章就介紹到這了,更多相關(guān)springboot對接minio的webhook內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot實現(xiàn)人臉識別與WebSocket長連接的實現(xiàn)代碼
這篇文章主要介紹了Springboot實現(xiàn)人臉識別與WebSocket長連接的實現(xiàn),本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-11-11Spring如何集成ibatis項目并實現(xiàn)dao層基類封裝
這篇文章主要介紹了Spring如何集成ibatis項目并實現(xiàn)dao層基類封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09Mybatisplus自動填充實現(xiàn)方式及代碼示例
這篇文章主要介紹了Mybatisplus自動填充實現(xiàn)方式及代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11詳細分析Java并發(fā)集合LinkedBlockingQueue的用法
這篇文章主要介紹了詳細分析Java并發(fā)集合LinkedBlockingQueue的用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04