springboot对接minio的webhook全过程

news2024/11/20 11:40:14

前言

近日需要将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"
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud学习(1)-consul

consul下载安装及使用 1.consul简介 Consul是一种开源的、分布式的服务发现和配置管理工具&#xff0c;能够帮助开发人员构建和管理现代化的分布式系统。它提供了一套完整的功能&#xff0c;包括服务注册与发现、健康检查、KV存储、多数据中心支持等&#xff0c;可以帮助开发人…

Jenkins--任务详解

一、任务类型 Jenkins的主要功能的实现是由执行任务去完成的&#xff0c;常用的任务类型主要有以下三种&#xff1a; 自由风格任务(Free Style Project): 这是Jenkins中最常用的任务类型&#xff0c;允许你自定义各种构建步骤和配置选项&#xff0c;如源码管理、构建触发器、…

vue3+echarts:echarts地图打点显示的样式

colorStops是打点的颜色和呼吸灯、label为show是打点是否显示数据、rich里cnNum是自定义的过滤模板用来改写显示数据的样式 series: [{type: "effectScatter",coordinateSystem: "geo",rippleEffect: {brushType: "stroke",},showEffectOn: &quo…

Redis的值有5种数据结构,不同数据结构的使用场景是什么?

文章目录 字符串缓存计数共享Session限速 哈希缓存 列表消息队列文章列表栈队列有限集合 集合标签抽奖社交需求 有序集合排行榜系统 字符串 缓存 &#xff08;1&#xff09;使用原生字符类型缓存 优点&#xff1a;简单直观&#xff0c;每个属性都支持更新操作 缺点&#xff1…

大话设计模式之状态模式

状态模式是一种行为设计模式&#xff0c;它允许对象在其内部状态发生变化时改变其行为。在状态模式中&#xff0c;对象将其行为委托给当前状态对象&#xff0c;从而在不同的状态下执行不同的行为&#xff0c;而不必在对象自身的代码中包含大量的条件语句。 通常&#xff0c;状…

WE博客代码系统

WE博客代码系统 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net mvc架构和sql server数据库&#xff0c;并采用EF实体模型开发。 三层架构并采用EF实体模型开发 功能模块&#xff1a; WE博客代码系统 WE博客代码系…

使用SpringBoot实现的登录注册后端功能

1、系统演示视频&#xff08;演示视频&#xff09; 2、需要交流和学习请联系

java网络编程——网络编程概述及UDP/TCP通信编程的实现

前言&#xff1a; 学习到通信了&#xff0c;整理下相关知识点。打好基础&#xff0c;daydayup!!! 网络编程 网络编程指可以让设备中的程序与网络上其他设备中的程序进行数据交互。 基本的通信架构 基本的通信架构有两种形式&#xff1a;CS架构&#xff08;Client客户端/Server服…

2024年购买阿里云服务器多少钱?100元-5000元预算

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

KV260 BOOT.BIN更新 ubuntu22.04 netplan修改IP

KV260 2022.2设置 BOOT.BIN升级 KV260开发板需要先更新BOOT.BIN到2022.2版本&#xff0c;命令如下&#xff1a; sudo xmutil bootfw_update -i “BOOT-k26-starter-kit-202305_2022.2.bin” 注意BOOT.BIN应包含全目录。下面是更新到2022.1 FW的示例&#xff0c;非更新到2022.…

数据质量决定大模型能力,景联文科技提供高质量大模型数据

随着大模型的深入发展&#xff0c;各类资源要素的配置状态已悄然变化。其中&#xff0c;数据的价值已被提升到一个新高度。 大模型往往拥有庞大的参数和复杂的网络结构&#xff0c;需要大量的数据来学习和优化。数据的质量和数量直接决定了模型的训练效果。若数据不足或质量不佳…

【Flutter】windows环境配置

windows 11 环境 官方教程 配置了flutter 环境变量在系统的path里 bin 路径。 死活没反应 关闭了git关闭了dart.exe关闭了vs还是不行卸载重新来 新版git flutter doctor 还需要android 环境

WPF动画教程(PointAnimationUsingPath的使用)

PointAnimationUsingPath的介绍 PointAnimationUsingPath 是 WPF 中的一个类&#xff0c;它用于创建一个动画&#xff0c;该动画会沿着指定的路径移动一个点。 关于 PointAnimationUsingPath这些属性比较重要&#xff1a; 属性类型说明PathGeometryPathGeometry这个属性定义了…

【Django学习笔记(四)】JavaScript 语言介绍

JavaScript 语言介绍 前言正文1、JavaScript 小案例2、代码位置2.1 在当前 HTML 文件中2.2 在其他 js 文件中 3、代码注释3.1 HTML的注释3.2 CSS的注释3.3 Javascript的注释 4、变量 & 输出4.1 字符串4.2 数组4.3 对象(python里的字典) 5、条件语句6、函数7、DOM7.1 根据 I…

【动态规划】【背包问题】基础背包

【动态规划】【01背包问题】 解法 二维dp数组01背包解法 一维dp数组&#xff08;滚动数组&#xff09;01背包 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 解法 二维dp数组01背包 &#x1f612;: 我的代码实现> …

RedCap轻量化5G提升生产效率,多领域应用

在工业数字化时代&#xff0c;工业智能化已经成为了各行各业的发展趋势。而在这个过程中&#xff0c;5G作为新一代网络通信技术正逐渐成为工业领域的核心力量。而在5G技术的应用中&#xff0c;RedCap轻量化5G工业网关路由器便是低成本畅享5G的最佳选择。 RedCap轻量化5G工业网…

可视化大屏的应用(18):网络安全和信息安全领域

可视化大屏在物联网领域具有以下价值&#xff1a; 实时监控和可视化&#xff1a; 可视化大屏可以将物联网设备和传感器的数据以图表、图形和动画等形式实时展示&#xff0c;帮助用户直观地了解物联网系统的运行状态和数据趋势。通过可视化大屏&#xff0c;用户可以快速发现异…

说说对排序算法的一些理解

对排序 - 冒泡排序的理解 冒泡排序是一种简单的排序算法&#xff0c;其基本思想是通过多次遍历数组&#xff0c;每次比较相邻的两个元素。如果前一个元素大于后一个元素&#xff0c;则交换它们的位置。这样&#xff0c;每一次遍历都会将当前未排序部分的最大元素“冒泡”到数组…

游戏引擎中的物理应用

一、 角色控制器 Character Controller和普通的动态对象&#xff08;Dynamic Actor &#xff09;是不同的&#xff0c;主要的三个特点是: 它拥有可控制的刚体间的交互假设它是有无穷的摩擦力&#xff08;可以站停在位置上&#xff09;&#xff0c;没有弹性加速和刹车几乎立即…

图论(Graph theory)

抽象数据结构类型 Graphic操作接口 操作接口功能描述操作接口功能描述e()获取图的总边数n()顶点的总数exits(v,u)判断v,u两个顶点是否存在边insert(v) 在顶点集 V 中插入新顶点 v remove(v,u)删除从v 到u的 关联边 remove(v) 将顶点 v 从顶点集中删除 type(v,u)边所属的类型(…