springboot对接minio的webhook全过程

前言

近日需要将minio的apache2.0版本给用起来,顺便要完善一下原有的文件上传管理系统,其中很重要的一点是,在原有客户端直传的基础上,再添加 minio 的上传回调给服务端做后续处理。
本文重点在于,介绍整个minio与springboot对接webhook过程。
ps:minio-2021-04-22,mc-2021-04-22 是我从源代码编译出来的最后一个apache2.0版本,无视即可,可以直接从官网下载再新版—除非你也想折腾。

minio的启动以及账号密码设置

启动脚本如下:

#!/bin/sh
mkdir uploads
mkdir configs
touch log.log
export MINIO_ROOT_USER='minio' ##这是管理账号,请根据实际自行设定
export MINIO_ROOT_PASSWORD='123456' ##这是密码,请根据实际自行设定
export MINIO_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实例,例如:
mc alias set myminio https://myminio.example.net minioadminuser minioadminpassword
具体到本文提到的服务,那就是:
./mc-2021-04-22 alias set 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=0 queue_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")
public class AppUploadController {
    private static final String logName="文件控制器";
    private static final Logger logger= LoggerFactory.getLogger(logName);

    /*****
     * 规则:
     * 例如,如果是从minio过来的webhook,就用:
     * /webhooks/minio/uploadedFinish 这些
     * aliyun的用:
     * /webhooks/ali/uploadedFinish
     * ****/
    @ApiOperation(value = "webhook回调")
    @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");
        //显示结果: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参数,分别是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"
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/513028.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL生产环境常见故障及解决方案汇总

MySQL生产环境常见故障及解决方案汇总 1. MySQL主从同步异常故障1.1. 情景说明1.2. 排查过程1.3. 数据同步2. MySQL慢查询故障1. MySQL主从同步异常故障 1.1. 情景说明 MySQL主库网卡需要更换IP地址,并将原IP地址配置为MySQL集群的VIP地址,上层应用程序其实不需要更改连接My…

VUE——生命周期

概念&#xff1a; mounted:挂载 new Vue({el: "#x",data: {},methods: {},mounted() {}, }) 系统会自己调用&#xff0c;不需要我们调用。 案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

JavaScript(五)---【DOM】

零.前言 JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】-CSDN博客 JavaScript(二)---【js数组、js对象、this指针】-CSDN博客 JavaScript(三)---【this指针&#xff0c;函数定义、Call、Apply、函数绑定、闭包】-CSDN博客 JavaScript(四)---【执…

在 Windows 中安装部署并启动连接 MongoDB 7.x(命令行方式启动、配置文件方式启动、将启动命令安装为系统服务实现开机自启)

MongoDB 的下载 下载地址&#xff1a;https://www.mongodb.com/try/download/community 这里需要对 MongoDB 的版本号说明一下&#xff1a; MongoDB 版本号的命名规则是 x.y.z&#xff0c;当其中的 y 是奇数时表示当前的版本为开发版&#xff0c;当其中的 y 是偶数时表示当前的…

“多组数组”题的注意事项,天杀的“鲁棒性”

【题目描述】 输入一些整数&#xff0c;求出它们的最小值、最大值和平均值&#xff08;保留3位小数&#xff09;。输入保证这些数都是不超过1000的整数。 输入包含多组数据&#xff0c;每组数据第一行是整数个数n&#xff0c;第二行是n个整数。n&#xff1d;0为输入结束标记&…

日志服务 HarmonyOS NEXT 日志采集最佳实践

作者&#xff1a;高玉龙&#xff08;元泊&#xff09; 背景信息 随着数字化新时代的全面展开以及 5G 与物联网&#xff08;IoT&#xff09;技术的迅速普及&#xff0c;操作系统正面临前所未有的变革需求。在这个背景下&#xff0c;华为公司自主研发的鸿蒙操作系统&#xff08…

经典文献阅读之--LOG-LIO(高效局部几何信息估计的激光雷达惯性里程计)

0. 简介 局部几何信息即法线和点分布在基于激光雷达的同时定位与地图构建&#xff08;SLAM&#xff09;中是至关重要&#xff0c;因为它为数据关联提供了约束&#xff0c;进一步确定了优化方向&#xff0c;最终影响姿态的准确性。然而即使在使用KD树或体素图的辅助下&#xff…

echarts 毕节区县地图 包含百管委、高新区 (手扣)

百度网盘 链接&#xff1a;https://pan.baidu.com/s/14yiReP8HT_bNCGMOBajexg 提取码&#xff1a;isqi

【Qt 学习笔记】Qt 开发环境的搭建 | Qt 安装教程

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 开发环境的搭建 | Qt 安装教程 文章编号&#xff1a;Qt 学习笔记 /…

坦克大战_java源码_swing界面_带毕业论文

一. 演示视频 坦克大战_java源码_swing界面_带毕业论文 二. 实现步骤 完整项目获取 https://githubs.xyz/y22.html 部分截图 启动类是 TankClinet.java&#xff0c;内置碰撞检测算法&#xff0c;线程&#xff0c;安全集合&#xff0c;一切皆对象思想等&#xff0c;是java进阶…

Annaconda的替代品miniforge!

用了多年的Annaconda竟然要收费了&#xff08;个人不收费&#xff0c;企业收费&#xff0c;但个人电脑在企业IP下&#xff0c;还是被警告了&#xff09;&#xff0c;只能用miniforge 全面替换了&#xff01; 一、卸载anaconda windows下卸载&#xff0c; 设置 -> 应用和功…

后台返回数据需要自己匹配图标,图标命名与后台返回的变量保持一致

testItemId为后台返回匹配图标的变量名 sportsTargetsData:{suggestSportTargetId: "2",unlocks: [{ testItemId: vo2max_high_knee, sportTargetName: 心肺能力, indexName: 心肺能力, sportTargetId: 1 },{ testItemId: grip_strength, sportTargetName: 基础力量…

基于YOLOV5+Pyqt5农作物叶片病害检测系统

1、引言 农作物病害的精准检测与识别是推动农业生产智能化与现代化发展的重要举措。随着计算机视觉技术的发展&#xff0c;深度学习方法已得到快速应用&#xff0c;利用卷积神经网络进行农作物病害检测与识别成为近年来研究的热点。基于传统农作物病害识别方法&#xff0c;分析…

瑞吉外卖实战学习--13、完善删除中的逻辑

完善删除中的逻辑 前言效果图逻辑介绍表结构根据mybatisPlus接口规范创建实体类和service和mapper文件1、实体类Dish和Setmeal2、Mapper接口DishMapper和SetealMapper3、Service接口DishService和setmealService4、Service实现类DishServiceImpl和setmealServicelmpl 编写删除函…

双榜有名!美创入围第一新声x天眼查「年度中国高科技高成长企业」系列榜单

为了更好地了解中国高科技高成长企业的现状和发展趋势&#xff0c;2023年底&#xff0c;【第一新声】特联合【天眼查】启动“数字未来”系列之2023年度中国高科技高成长企业系列榜单评选征集工作&#xff0c;发现和挖掘被资本市场关注&#xff0c;同时受客户认可的高科技、高成…

五、postman基础使用案例

postman基础使用 相关案例【传递查询参数】【提交表单数据】【提交JSON数据】 注&#xff1a;postman⼀款⽀持调试和测试的⼯具&#xff0c;开发、测试⼯程师都可以使⽤。方法一般统一为&#xff1a;方法→请求头→请求体→断言 相关案例 【传递查询参数】 访问TPshop搜索商品的…

高德定位 SDK 到底提供了什么服务?

最近我被高德的销售烦到不行&#xff0c;说是我用了他们的 SDK&#xff0c;现在 SDK 要收费。 表达是很绕的&#xff0c;什么授权啦&#xff0c;什么企业认证风险啦&#xff0c;讲了一堆&#xff0c;还跟我开始搬出协议了。感觉高德的销售真够垃圾的&#xff0c;编个话术都不会…

动态规划详细讲解c++|经典例题讲解认识动态规划|0-1背包问题详解

引言 uu们&#xff0c;你们好&#xff01;这次的分享是动态规划&#xff0c;其中介绍了动态规划的相关概念和做题模板&#xff08;三要素&#xff09;&#xff0c;同时为了uu们对动态规划方法有更加形象的认识&#xff0c;特地找了两个经典问题&#xff0c;和大家一起分析。并…

音频转换工具 Bigasoft FLAC Converter for Mac

Bigasoft FLAC Converter for Mac是一款专为Mac用户设计的音频转换工具&#xff0c;它能够将FLAC音频文件高效、高质量地转换为其他常见的音频格式&#xff0c;如MP3、AAC等。这款软件具有直观易用的界面&#xff0c;使用户能够轻松上手&#xff0c;无需复杂的操作步骤即可完成…

SpringBoot整合Lombok以及各种使用技巧

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容: SpringBoot整合Lombok以及各种使用技巧 📚个人知识库: Leo知识库,欢迎大家访…