欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang使用minio替代文件系統(tǒng)的實戰(zhàn)教程

 更新時間:2025年01月09日 10:47:24   作者:夢想畫家  
本文討論項目開發(fā)中直接文件系統(tǒng)的限制或不足,接著介紹Minio對象存儲的優(yōu)勢,同時給出Golang的實際示例代碼,包括初始化客戶端、讀取minio對象以及設(shè)置過期策略等,需要的朋友可以參考下

文件系統(tǒng) vs Minio

在開發(fā)的早期階段,常見的做法是使用文件系統(tǒng)來存儲和檢索任何類型的對象。甚至當(dāng)我們轉(zhuǎn)向微服務(wù)時,我們也經(jīng)常在某個指定的文件夾上硬編碼靜態(tài)文件。這使得開發(fā)或遷移到微服務(wù)變得快速,但很快我們就會后悔這個決定。

文件系統(tǒng)不足:

  • 文件系統(tǒng)通常依賴于ACL(訪問控制列表),因此并非所有用戶都具有相同的功能。使用任何類型的對象存儲都可以完全避免這個ACL問題。
  • 文件系統(tǒng)與它們所在的操作系統(tǒng)緊密耦合。這可能會限制可移植性,并使在不同平臺之間遷移或共享數(shù)據(jù)變得困難。另一方面,對象存儲提供了一個標(biāo)準(zhǔn)化的接口(例如Amazon S3的S3或Azure Blob storage API),允許輕松的數(shù)據(jù)傳輸和跨不同系統(tǒng)的兼容性。
  • 當(dāng)涉及到存儲關(guān)于文件和對象的元數(shù)據(jù)時,文件系統(tǒng)通常有限制。另一方面,對象存儲可以與每個對象一起存儲大量元數(shù)據(jù),從而更容易根據(jù)不同屬性組織、搜索和分析數(shù)據(jù)。
  • 與對象存儲相比,文件系統(tǒng)需要更多的管理開銷。對于文件系統(tǒng),您需要管理目錄結(jié)構(gòu)、文件層次結(jié)構(gòu)和訪問控制列表。然而,對象存儲使用平面地址空間,可以更簡單地管理。

對象存儲:minio

Minio 是一個開源的高性能對象存儲服務(wù)器,與傳統(tǒng)的文件存儲系統(tǒng)不同,它專注于以對象的方式存儲數(shù)據(jù)。

從功能特性來看,它具有高度的可擴展性。可以很方便地通過添加節(jié)點來增加存儲容量,滿足數(shù)據(jù)量不斷增長的需求。例如,在大數(shù)據(jù)存儲場景下,隨著數(shù)據(jù)的持續(xù)積累,Minio 可以靈活地擴展存儲規(guī)模。

Minio 提供了出色的兼容性,它兼容亞馬遜 S3 云存儲服務(wù)的 API。這意味著,對于已經(jīng)基于 S3 API 開發(fā)的應(yīng)用程序,幾乎可以無縫遷移到 Minio 上運行,大大降低了開發(fā)和遷移成本。

在數(shù)據(jù)安全性方面,Minio 支持?jǐn)?shù)據(jù)加密,無論是在存儲還是傳輸過程中,都能有效保護數(shù)據(jù)的安全。同時,它提供了多種數(shù)據(jù)冗余策略,像糾刪碼等方式,確保在部分存儲設(shè)備出現(xiàn)故障時,數(shù)據(jù)依然能夠完整恢復(fù)。

在性能表現(xiàn)上,Minio 的讀寫速度比較快。通過分布式架構(gòu)設(shè)計,它能夠?qū)崿F(xiàn)高并發(fā)的數(shù)據(jù)訪問,在處理大量小文件存儲和讀取的場景下,如圖片存儲、視頻存儲等互聯(lián)網(wǎng)應(yīng)用場景,能夠提供高效的存儲服務(wù)。

在應(yīng)用場景方面,Minio 可用于企業(yè)數(shù)據(jù)備份與歸檔。企業(yè)可以將重要的數(shù)據(jù)備份到 Minio 存儲系統(tǒng)中,方便在需要時進行恢復(fù)。還可以用于云原生應(yīng)用的數(shù)據(jù)存儲,它能夠很好地與容器編排工具(如 Kubernetes)配合,為云原生應(yīng)用提供可靠的存儲支持。總之,Minio 以其出色的性能、良好的兼容性和可靠的安全性,在對象存儲領(lǐng)域發(fā)揮著重要作用。

Golang連接Minio

不管我們用Minio做什么,有一些步驟是必須完成的,比如創(chuàng)建Bucket、配置Bucket策略等。我將提供一些Golang代碼片段,這將有助于與MinIO進行交互。

配置Minio客戶端

// 配置客戶端的三個步驟
// 1. AccessKey and SecretKey : 創(chuàng)建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
}

創(chuàng)建和配置Bucket

下面的代碼將創(chuàng)建Bucket,并將Bucket配置為使用Webhook端點,Minio將通過它發(fā)送所有配置的FileEvents。

這里比較棘手的部分是在Minio集群中配置Webhook ARN。一種可能的方法是設(shè)置環(huán)境變量,以便Minio能夠理解,官方文檔地址:Publish Events to Webhook — MinIO Object Storage for Kubernetes

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創(chuàng)建Minio存儲桶并配置桶通知
func CreateBucket(bucketName, mArn string, minioClient *minio.Client) error {
    // 1. 創(chuàng)建存儲桶
    ctx := context.Background()
    err := minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{})
    if err!= nil {
        // 檢查存儲桶是否已存在,如果是因為已存在導(dǎo)致的錯誤則忽略
        exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
        if errBucketExists == nil && exists {
            fmt.Printf("存儲桶 %s 已存在,無需重復(fù)創(chuàng)建\n", bucketName)
            return nil
        }
        return fmt.Errorf("創(chuàng)建存儲桶失敗: %v", err)
    }
    fmt.Printf("存儲桶 %s 創(chuàng)建成功\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("設(shè)置存儲桶通知失敗: %v", err)
    }
    fmt.Printf("存儲桶 %s 的通知配置成功\n", bucketName)

    return nil
}

以下是一個使用 Go 語言結(jié)合 Minio 客戶端庫創(chuàng)建 Minio 存儲桶(Bucket)并配置桶通知(示例中以發(fā)送到一個 Webhook 端點為例,假設(shè) Webhook 對應(yīng)的 ARN 已提前知曉)的更完整示例代碼,代碼中包含了必要的包導(dǎo)入以及一些錯誤處理優(yōu)化等內(nèi)容。

func main() {
    // Minio服務(wù)端的訪問端點、訪問密鑰和秘密密鑰
    endpoint := "your_minio_endpoint"
    accessKey := "your_access_key"
    secretKey := "your_secret_key"
    bucketName := "your_bucket_name"
    mArn := "your_webhook_arn"

    // 創(chuàng)建Minio客戶端對象
    minioClient, err := minio.New(endpoint, &minio.Options{
        Credentials: minio.Credentials{
            AccessKey: accessKey,
            SecretKey: secretKey,
        },
    })
    if err!= nil {
        log.Fatalf("創(chuàng)建Minio客戶端失敗: %v", err)
    }

    // 調(diào)用創(chuàng)建存儲桶并配置通知的函數(shù)
    err = CreateBucket(bucketName, mArn, minioClient)
    if err!= nil {
        log.Fatalf("執(zhí)行創(chuàng)建存儲桶及配置通知操作失敗: %v", err)
    }
}

注意要將代碼中的 your_minio_endpoint、your_access_key、your_secret_key、your_bucket_name 和 your_webhook_arn 替換為實際的 Minio 服務(wù)端信息、要創(chuàng)建的存儲桶名稱以及對應(yīng)的 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 中,存儲桶的過期策略可以用于自動刪除桶內(nèi)滿足一定條件(比如對象創(chuàng)建時間達(dá)到指定時長等)的對象。這在一些場景下非常有用,例如對于臨時存儲的數(shù)據(jù)、日志文件等,設(shè)定過期策略后,系統(tǒng)可以自動清理過期數(shù)據(jù),節(jié)省存儲空間,提升存儲資源的利用效率。

**注意:**類似地,也可以實現(xiàn)轉(zhuǎn)換策略。這會將文件重定向到遠(yuǎn)程存儲。但是請確保,不要在同一個集群中配置遠(yuǎn)程存儲。

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()

    // 構(gòu)建生命周期配置規(guī)則
    rule := lifecycle.NewRule{
        ID:     "rule1",
        Status: "Enabled",
        Filter: lifecycle.NewPrefixFilter(""), // 這里可以指定前綴來限制規(guī)則應(yīng)用到特定前綴的對象,空字符串表示應(yīng)用到桶內(nèi)所有對象
        Expiration: lifecycle.Expiration{
            Days: &days, // 設(shè)置過期天數(shù),對象創(chuàng)建后達(dá)到這個天數(shù)就會被自動刪除
        },
    }

    // 將規(guī)則添加到生命周期配置對象中
    config := lifecycle.NewConfiguration()
    config.Rules = append(config.Rules, rule)

    // 使用Minio客戶端設(shè)置存儲桶的生命周期配置(即過期策略)
    err := minioClient.SetBucketLifecycle(ctx, bucketName, config)
    if err!= nil {
        return fmt.Errorf("設(shè)置存儲桶 %s 生命周期配置失敗: %v", bucketName, err)
    }

    fmt.Printf("存儲桶 %s 的過期策略設(shè)置成功,對象將在創(chuàng)建后 %d 天過期\n", bucketName, days)
    return nil
}


在 main 函數(shù)中調(diào)用上述函數(shù)來實際設(shè)置存儲桶過期策略的示例代碼,你需要將相應(yīng)的 Minio 服務(wù)端地址、訪問密鑰、秘密密鑰、存儲桶名稱以及期望的過期天數(shù)等參數(shù)替換為實際的值:

func main() {
    endpoint := "your_minio_endpoint"
    accessKey := "your_access_key"
    secretKey := "your_secret_key"
    bucketName := "your_bucket_name"
    days := 30 // 這里假設(shè)設(shè)置對象30天后過期,你可以按需修改

    // 創(chuàng)建Minio客戶端實例
    minioClient, err := minio.New(endpoint, &minio.Options{
        Credentials: minio.Credentials{
            AccessKey: accessKey,
            SecretKey: secretKey,
        },
    })
    if err!= nil {
        log.Fatalf("創(chuàng)建Minio客戶端失敗: %v", err)
    }

    // 調(diào)用函數(shù)設(shè)置存儲桶過期策略
    err = SetBucketLifecycle(bucketName, days, minioClient)
    if err!= nil {
        log.Fatalf("設(shè)置存儲桶過期策略時出現(xiàn)錯誤: %v", err)
    }
}

需要注意的是:

  • 要將代碼中的占位符(如 "your_minio_endpoint""your_access_key"、"your_secret_key""your_bucket_name" 等)替換為實際有效的 Minio 相關(guān)參數(shù)信息。
  • 確保已經(jīng)正確引入了 minio-go 庫,可以通過 go get github.com/minio/minio-go/v7 命令獲取該依賴(如果還未安裝)。

通過以上代碼示例,你可以在 Go 語言項目中實現(xiàn)對 Minio 存儲對象讀寫、設(shè)置過期策略的功能,以滿足不同業(yè)務(wù)場景下對數(shù)據(jù)自動過期清理的需求。

到此這篇關(guān)于Golang使用minio替代文件系統(tǒng)的實戰(zhàn)教程的文章就介紹到這了,更多相關(guān)Golang minio替代文件系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go 熱加載之fresh詳解

    Go 熱加載之fresh詳解

    這篇文章主要為大家介紹了Go 熱加載之fresh詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 淺談go語言renderer包代碼分析

    淺談go語言renderer包代碼分析

    本篇文章主要介紹了淺談go語言renderer包代碼分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • golang 數(shù)組隨機排序的實現(xiàn)

    golang 數(shù)組隨機排序的實現(xiàn)

    本文主要介紹了golang 數(shù)組隨機排序的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • golang+vue打造高效多語言博客系統(tǒng)的完整指南

    golang+vue打造高效多語言博客系統(tǒng)的完整指南

    這篇文章主要為大家詳細(xì)介紹了如何使用golang和vue打造一個高效多語言博客系統(tǒng),本文為大家附上了完整版指南,有需要的小伙伴可以參考一下
    2025-03-03
  • Go語言中的map擴容機制

    Go語言中的map擴容機制

    Go語言中的map是一種高效的數(shù)據(jù)結(jié)構(gòu),其擴容機制確保了在大數(shù)據(jù)量情況下的性能,本文介紹了包括擴容觸發(fā)條件、擴容過程和漸進式擴容,感興趣的可以了解一下
    2024-12-12
  • Go語言與其他語言進行交互的方式詳解

    Go語言與其他語言進行交互的方式詳解

    在當(dāng)今的軟件開發(fā)領(lǐng)域,多種編程語言常常需要協(xié)同工作,以充分利用各自的優(yōu)勢來構(gòu)建復(fù)雜的應(yīng)用系統(tǒng),Go 語言作為一門高效、簡潔的編程語言,也經(jīng)常需要與其他語言進行交互,接下來,我們將詳細(xì)探討 Go 語言如何與其他語言進行交互,需要的朋友可以參考下
    2024-06-06
  • GO語言支付寶沙箱對接的實現(xiàn)

    GO語言支付寶沙箱對接的實現(xiàn)

    本文介紹了如何使用GO語言對接支付寶沙箱環(huán)境,包括秘鑰生成、SDK安裝和代碼實現(xiàn)等步驟,詳細(xì)內(nèi)容涵蓋了從秘鑰生成到前端代碼的每個階段,為開發(fā)者提供了一條清晰的指引
    2024-09-09
  • Golang學(xué)習(xí)之無類型常量詳解

    Golang學(xué)習(xí)之無類型常量詳解

    對于無類型常量,可能大家是第一次聽說,但我們每天都在用,每天都有無數(shù)潛在的坑被埋下。本文就來和大家聊聊它的相關(guān)注意事項吧,希望對大家有所幫助
    2023-03-03
  • go實現(xiàn)腳本解釋器gscript

    go實現(xiàn)腳本解釋器gscript

    這篇文章主要為大家介紹了go實現(xiàn)腳本解釋器gscript示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • go語言中匿名函數(shù)的作用域陷阱詳解

    go語言中匿名函數(shù)的作用域陷阱詳解

    GO語言的匿名函數(shù)(anonymous?function),其實就是閉包.是指不需要定義函數(shù)名的一種函數(shù)實現(xiàn)方式,下面這篇文章主要給大家介紹了關(guān)于go語言中匿名函數(shù)作用域陷阱的相關(guān)資料,需要的朋友可以參考下
    2022-05-05

最新評論