Golang:使用minio替代文件系统实战教程

news2025/1/7 18:37:03

本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势。同时给出Golang的实际示例代码,包括初始化客户端、读取minio对象以及设置过期策略等。

文件系统 vs Minio

在开发的早期阶段,常见的做法是使用文件系统来存储和检索任何类型的对象。甚至当我们转向微服务时,我们也经常在某个指定的文件夹上硬编码静态文件。这使得开发或迁移到微服务变得快速,但很快我们就会后悔这个决定。

文件系统不足:

  • 文件系统通常依赖于ACL(访问控制列表),因此并非所有用户都具有相同的功能。使用任何类型的对象存储都可以完全避免这个ACL问题。
  • 文件系统与它们所在的操作系统紧密耦合。这可能会限制可移植性,并使在不同平台之间迁移或共享数据变得困难。另一方面,对象存储提供了一个标准化的接口(例如Amazon S3的S3或Azure Blob storage API),允许轻松的数据传输和跨不同系统的兼容性。
  • 当涉及到存储关于文件和对象的元数据时,文件系统通常有限制。另一方面,对象存储可以与每个对象一起存储大量元数据,从而更容易根据不同属性组织、搜索和分析数据。
  • 与对象存储相比,文件系统需要更多的管理开销。对于文件系统,您需要管理目录结构、文件层次结构和访问控制列表。然而,对象存储使用平面地址空间,可以更简单地管理。

对象存储:minio

Minio 是一个开源的高性能对象存储服务器,与传统的文件存储系统不同,它专注于以对象的方式存储数据。
在这里插入图片描述

从功能特性来看,它具有高度的可扩展性。可以很方便地通过添加节点来增加存储容量,满足数据量不断增长的需求。例如,在大数据存储场景下,随着数据的持续积累,Minio 可以灵活地扩展存储规模。

Minio 提供了出色的兼容性,它兼容亚马逊 S3 云存储服务的 API。这意味着,对于已经基于 S3 API 开发的应用程序,几乎可以无缝迁移到 Minio 上运行,大大降低了开发和迁移成本。

在数据安全性方面,Minio 支持数据加密,无论是在存储还是传输过程中,都能有效保护数据的安全。同时,它提供了多种数据冗余策略,像纠删码等方式,确保在部分存储设备出现故障时,数据依然能够完整恢复。

在性能表现上,Minio 的读写速度比较快。通过分布式架构设计,它能够实现高并发的数据访问,在处理大量小文件存储和读取的场景下,如图片存储、视频存储等互联网应用场景,能够提供高效的存储服务。

在应用场景方面,Minio 可用于企业数据备份与归档。企业可以将重要的数据备份到 Minio 存储系统中,方便在需要时进行恢复。还可以用于云原生应用的数据存储,它能够很好地与容器编排工具(如 Kubernetes)配合,为云原生应用提供可靠的存储支持。总之,Minio 以其出色的性能、良好的兼容性和可靠的安全性,在对象存储领域发挥着重要作用。

Golang连接Minio

不管我们用Minio做什么,有一些步骤是必须完成的,比如创建Bucket、配置Bucket策略等。我将提供一些Golang代码片段,这将有助于与MinIO进行交互。
在这里插入图片描述

配置Minio客户端

// 配置客户端的三个步骤
// 1. AccessKey and SecretKey : 创建Minio集群后获取访问key和密钥key
// 2. endpoint : Minio Cluster 访问地址
// 3. useSSL : 是否需要SSL 检查 ? (true or false)
import  "github.com/minio/minio-go/v7"

func getMinioClient(accessKey string, secretKey string, endpoint string, 
                     useSSL bool)(*minio.Client, error) {
 // Context you want to use
 context := context.Background()
 minioClient, err := getMinioClient(accessKey, secretKey, endpoint, useSsl)
 return minioClient, err
}

创建和配置Bucket

下面的代码将创建Bucket,并将Bucket配置为使用Webhook端点,Minio将通过它发送所有配置的FileEvents。

这里比较棘手的部分是在Minio集群中配置Webhook ARN。一种可能的方法是设置环境变量,以便Minio能够理解,官方文档地址:https://min.io/docs/minio/kubernetes/upstream/administration/monitoring/publish-events-to-webhook.html#minio-bucket-notifications-publish-webhook。

set MINIO_NOTIFY_WEBHOOK_ENABLE_PRIMARY=”on”
set MINIO_NOTIFY_WEBHOOK_ENDPOINT_PRIMARY=”ENDPOINT”
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/minio/minio-go/v7"
    "github.com/minio/minio-go/v7/pkg/notification"
)

// CreateBucket创建Minio存储桶并配置桶通知
func CreateBucket(bucketName, mArn string, minioClient *minio.Client) error {
    // 1. 创建存储桶
    ctx := context.Background()
    err := minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{})
    if err!= nil {
        // 检查存储桶是否已存在,如果是因为已存在导致的错误则忽略
        exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
        if errBucketExists == nil && exists {
            fmt.Printf("存储桶 %s 已存在,无需重复创建\n", bucketName)
            return nil
        }
        return fmt.Errorf("创建存储桶失败: %v", err)
    }
    fmt.Printf("存储桶 %s 创建成功\n", bucketName)

    // 2. 配置桶通知
    arn, err := notification.NewArnFromString(mArn)
    if err!= nil {
        return fmt.Errorf("解析ARN失败: %v", err)
    }

    config := notification.NewConfig(arn)
    config.AddEvents(
        notification.ObjectCreatedAll,
        notification.ObjectRemovedAll,
        notification.ObjectAccessedAll,
    )

    notificationConfig := notification.Configuration{}
    notificationConfig.AddQueue(config)

    err = minioClient.SetBucketNotification(ctx, bucketName, &notificationConfig)
    if err!= nil {
        return fmt.Errorf("设置存储桶通知失败: %v", err)
    }
    fmt.Printf("存储桶 %s 的通知配置成功\n", bucketName)

    return nil
}

以下是一个使用 Go 语言结合 Minio 客户端库创建 Minio 存储桶(Bucket)并配置桶通知(示例中以发送到一个 Webhook 端点为例,假设 Webhook 对应的 ARN 已提前知晓)的更完整示例代码,代码中包含了必要的包导入以及一些错误处理优化等内容。

func main() {
    // Minio服务端的访问端点、访问密钥和秘密密钥
    endpoint := "your_minio_endpoint"
    accessKey := "your_access_key"
    secretKey := "your_secret_key"
    bucketName := "your_bucket_name"
    mArn := "your_webhook_arn"

    // 创建Minio客户端对象
    minioClient, err := minio.New(endpoint, &minio.Options{
        Credentials: minio.Credentials{
            AccessKey: accessKey,
            SecretKey: secretKey,
        },
    })
    if err!= nil {
        log.Fatalf("创建Minio客户端失败: %v", err)
    }

    // 调用创建存储桶并配置通知的函数
    err = CreateBucket(bucketName, mArn, minioClient)
    if err!= nil {
        log.Fatalf("执行创建存储桶及配置通知操作失败: %v", err)
    }
}

注意要将代码中的 your_minio_endpoint、your_access_key、your_secret_key、your_bucket_name 和 your_webhook_arn 替换为实际的 Minio 服务端信息、要创建的存储桶名称以及对应的 Webhook 的 ARN 信息。

读Minio对象

func ReadObject(bucketName string, filePath string)([]byte, error) {
     contentBuffer, err := minioClient.GetObject(context, bucketName, filePath, minio.GetObjectOptions{})
     if err != nil {
       return nil, err
     }

     // read the content from the buffer
     contentBytes := new(bytes.Buffer)
     if _, err := io.Copy(contentBytes, contentBuffer); err != nil {
      return nil, err
     }
     return contentBytes.Bytes(), nil
}

写Minio对象

func uploadObject(bucketName string, objectName string, file *os.File) error {
    // get the stat of file
    fileStat, err := file.Stat()
    if err != nil {
    	return err
    }

    // upload the file
    uploadInfo, err := minioClient.PutObject(
        context, 
        bucketName, 
        objectName, 
        file, 
        fileStat.Size(), 
        minio.PutObjectOptions{})

    fmt.Printf("Uploaded Info : %v", uploadInfo)
    return err
}

过期策略

在 Minio 中,存储桶的过期策略可以用于自动删除桶内满足一定条件(比如对象创建时间达到指定时长等)的对象。这在一些场景下非常有用,例如对于临时存储的数据、日志文件等,设定过期策略后,系统可以自动清理过期数据,节省存储空间,提升存储资源的利用效率。

**注意:**类似地,也可以实现转换策略。这会将文件重定向到远程存储。但是请确保,不要在同一个集群中配置远程存储。

import (
    "context"
    "fmt"
    "log"

    "github.com/minio/minio-go/v7"
    "github.com/minio/minio-go/v7/pkg/lifecycle"
)

func SetBucketLifecycle(bucketName string, days int, minioClient *minio.Client) error {
    ctx := context.Background()

    // 构建生命周期配置规则
    rule := lifecycle.NewRule{
        ID:     "rule1",
        Status: "Enabled",
        Filter: lifecycle.NewPrefixFilter(""), // 这里可以指定前缀来限制规则应用到特定前缀的对象,空字符串表示应用到桶内所有对象
        Expiration: lifecycle.Expiration{
            Days: &days, // 设置过期天数,对象创建后达到这个天数就会被自动删除
        },
    }

    // 将规则添加到生命周期配置对象中
    config := lifecycle.NewConfiguration()
    config.Rules = append(config.Rules, rule)

    // 使用Minio客户端设置存储桶的生命周期配置(即过期策略)
    err := minioClient.SetBucketLifecycle(ctx, bucketName, config)
    if err!= nil {
        return fmt.Errorf("设置存储桶 %s 生命周期配置失败: %v", bucketName, err)
    }

    fmt.Printf("存储桶 %s 的过期策略设置成功,对象将在创建后 %d 天过期\n", bucketName, days)
    return nil
}


main 函数中调用上述函数来实际设置存储桶过期策略的示例代码,你需要将相应的 Minio 服务端地址、访问密钥、秘密密钥、存储桶名称以及期望的过期天数等参数替换为实际的值:

func main() {
    endpoint := "your_minio_endpoint"
    accessKey := "your_access_key"
    secretKey := "your_secret_key"
    bucketName := "your_bucket_name"
    days := 30 // 这里假设设置对象30天后过期,你可以按需修改

    // 创建Minio客户端实例
    minioClient, err := minio.New(endpoint, &minio.Options{
        Credentials: minio.Credentials{
            AccessKey: accessKey,
            SecretKey: secretKey,
        },
    })
    if err!= nil {
        log.Fatalf("创建Minio客户端失败: %v", err)
    }

    // 调用函数设置存储桶过期策略
    err = SetBucketLifecycle(bucketName, days, minioClient)
    if err!= nil {
        log.Fatalf("设置存储桶过期策略时出现错误: %v", err)
    }
}

需要注意的是:

  • 要将代码中的占位符(如 "your_minio_endpoint""your_access_key""your_secret_key""your_bucket_name" 等)替换为实际有效的 Minio 相关参数信息。
  • 确保已经正确引入了 minio-go 库,可以通过 go get github.com/minio/minio-go/v7 命令获取该依赖(如果还未安装)。

通过以上代码示例,你可以在 Go 语言项目中实现对 Minio 存储对象读写、设置过期策略的功能,以满足不同业务场景下对数据自动过期清理的需求。

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

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

相关文章

拥抱时代--AI(3)

python语言为了研究机器学习专门发展起来一套框架,并且这个框架是开源的,它就是scikit-learn。它主要实现数据预处理,分类,回归,降维,模型选择等最常用的机器学习算法。 在使用scikit-learn之前&#xff0…

实现多账户cursor限制的免费使用

目录 前言 个人建议: 准备工作 下载: 打开cursor: 打开下载文件目录&#xff1a…

OpenCV计算机视觉 05 图像边缘检测(Sobel算子、Scharr算子、Laplacian算子、Canny边缘检测)

图像边缘检测 边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域。 yuancv2.imread(yuan.png) cv2.imshow(yuan,yuan) cv2.waitKey(0) yuan_xcv2.Sob…

2025年1月4日蜻蜓q旗舰版st完整开源·包含前后端所有源文件·开源可商用可二开·优雅草科技·优雅草kir|优雅草星星|优雅草银满|优雅草undefined

2025年1月4日蜻蜓q旗舰版st完整开源包含前后端所有源文件开源可商用可二开优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined 产品介绍: 本产品主要贡献者优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined-青史留名,时光如川浪淘…

n8n - AI自动化工作流

文章目录 一、关于 n8n关键能力n8n 是什么意思 二、快速上手 一、关于 n8n n8n是一个具有原生AI功能的工作流自动化平台,它为技术团队提供了代码的灵活性和无代码的速度。凭借400多种集成、原生人工智能功能和公平代码许可证,n8n可让您构建强大的自动化…

cursor 使用技巧

一、创建项目前期步骤 1.先给AI设定一个对应项目经理角色, 2.然后跟AI沟通项目功能,生成功能设计文件:README.md README.md项目功能 3.再让AI总结写出开发项目规则文件: .cursorrules 是技术栈进行限定,比如使用什…

xinput1_3.dll丢失修复方法。方法1-方法6

总结 xinput1_3.dll的核心作用 xinput1_3.dll作为Microsoft DirectX库的关键组件,对于游戏控制器的支持起着至关重要的作用。它不仅提供了设备兼容性、多控制器管理和反馈机制等核心功能,还通过XInput API简化了开发人员对控制器状态的检索和设备特性的…

【C++】P2550 [AHOI2001] 彩票摇奖

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式:输出格式:输入输出样例: 💯题解思路1. 问题解析 💯我的实现实现逻辑问题分析 💯老…

01:C语言的本质

C语言的本质 1、ARM架构与汇编2、局部变量初始化与空间分配2.1、局部变量的初始化2.1、局部变量数组初始化 3、全局变量/静态变量初始化化与空间分配4、堆空间 1、ARM架构与汇编 ARM简要架构如下:CPU,ARM(能读能写),Flash(能读&a…

8086汇编(16位汇编)学习笔记10.寄存器总结

8086汇编(16位汇编)学习笔记10.寄存器总结-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 寄存器 8086CPU有14个寄存器 它们的名称为: AX、BX、CX、DX、SI、DI、SP、BP、 IP**、CS、DS、ES、**SS、PSW。 8086CPU所有的寄存器都是16位的&#…

如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库教程

简介 本教程将向你介绍如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库。 Apache Cassandra 是一个分布式的 NoSQL 数据库,旨在处理跨多个普通服务器的大量数据,并提供高可用性,没有单点故障。Apache Cassandra 是一个高度可扩展的分布…

uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器

效果 选择前效果 1、时间选择器 2、日期选择器 3、普通选择器 4、多列选择器 选择后效果 代码 <template><!-- 时间选择器 --><view class"line"><view classitem1><view classleft>时间</view><view class"right&quo…

centos,789使用mamba快速安装R及语言包devtools

如何进入R语言运行环境请参考&#xff1a;Centos7_miniconda_devtools安装_R语言入门之R包的安装_r语言devtools包怎么安装-CSDN博客 在R里面使用安装devtools经常遇到依赖问题&#xff0c;排除过程过于费时&#xff0c;使用conda安装包等待时间长等。下面演示centos,789都是一…

STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)

一&#xff1a;步进电机简介 步进电机又称为脉冲电机&#xff0c;简而言之&#xff0c;就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩&#xff0c;步进电机的角位移量与输入的脉冲个数严格成正…

kafka使用以及基于zookeeper集群搭建集群环境

一、环境介绍 zookeeper下载地址&#xff1a;https://zookeeper.apache.org/releases.html kafka下载地址&#xff1a;https://kafka.apache.org/downloads 192.168.142.129 apache-zookeeper-3.8.4-bin.tar.gz kafka_2.13-3.6.0.tgz 192.168.142.130 apache-zookee…

JSON结构快捷转XML结构API集成指南

JSON结构快捷转XML结构API集成指南 引言 在当今的软件开发世界中&#xff0c;数据交换格式的选择对于系统的互操作性和效率至关重要。JSON&#xff08;JavaScript Object Notation&#xff09;和XML&#xff08;eXtensible Markup Language&#xff09;是两种广泛使用的数据表…

Android14 CTS-R6和GTS-12-R2不能同时测试的解决方法

背景 Android14 CTS r6和GTS 12-r1之后&#xff0c;tf-console默认会带起OLC Server&#xff0c;看起来olc server可能是想适配ATS(android-test-station)&#xff0c;一种网页版可视化、可配置的跑XTS的方式。这种网页版ATS对测试人员是比较友好的&#xff0c;网页上简单配置下…

BurpSuite工具安装

BurpSuite介绍&#xff1a; BurpSuite是由PortSwigger开发的一款集成化的Web应用安全检测工具&#xff0c;广泛应用于Web应用的漏洞扫描和攻击模拟&#xff0c;主要用于抓包该包(消息拦截与构造) 一、Burp suite安装 windows系统需要提前配置好java环境&#xff0c;前面博客…

Win11+WLS Ubuntu 鸿蒙开发环境搭建(一)

参考文章 Windows11安装linux子系统 WSL子系统迁移、备份与导入全攻略 如何扩展 WSL 2 虚拟硬盘的大小 Win10安装的WSL子系统占用磁盘空间过大如何释放 《Ubuntu — 调整文件系统大小命令resize2fs》 penHarmony南向开发笔记&#xff08;一&#xff09;开发环境搭建 一&a…

flink cdc oceanbase(binlog模式)

接上文&#xff1a;一文说清flink从编码到部署上线 环境&#xff1a;①操作系统&#xff1a;阿里龙蜥 7.9&#xff08;平替CentOS7.9&#xff09;&#xff1b;②CPU&#xff1a;x86&#xff1b;③用户&#xff1a;root。 预研初衷&#xff1a;现在很多项目有国产化的要求&#…