亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

文件系統(tǒng) vs Minio

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

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

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

對(duì)象存儲(chǔ):minio

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

從功能特性來(lái)看,它具有高度的可擴(kuò)展性??梢院芊奖愕赝ㄟ^(guò)添加節(jié)點(diǎn)來(lái)增加存儲(chǔ)容量,滿(mǎn)足數(shù)據(jù)量不斷增長(zhǎng)的需求。例如,在大數(shù)據(jù)存儲(chǔ)場(chǎng)景下,隨著數(shù)據(jù)的持續(xù)積累,Minio 可以靈活地?cái)U(kuò)展存儲(chǔ)規(guī)模。

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

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

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

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

Golang連接Minio

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

配置Minio客戶(hù)端

// 配置客戶(hù)端的三個(gè)步驟
// 1. AccessKey and SecretKey : 創(chuàng)建Minio集群后獲取訪(fǎng)問(wèn)key和密鑰key
// 2. endpoint : Minio Cluster 訪(fǎng)問(wèn)地址
// 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端點(diǎn),Minio將通過(guò)它發(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存儲(chǔ)桶并配置桶通知
func CreateBucket(bucketName, mArn string, minioClient *minio.Client) error {
    // 1. 創(chuàng)建存儲(chǔ)桶
    ctx := context.Background()
    err := minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{})
    if err!= nil {
        // 檢查存儲(chǔ)桶是否已存在,如果是因?yàn)橐汛嬖趯?dǎo)致的錯(cuò)誤則忽略
        exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
        if errBucketExists == nil && exists {
            fmt.Printf("存儲(chǔ)桶 %s 已存在,無(wú)需重復(fù)創(chuàng)建\n", bucketName)
            return nil
        }
        return fmt.Errorf("創(chuàng)建存儲(chǔ)桶失敗: %v", err)
    }
    fmt.Printf("存儲(chǔ)桶 %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è)置存儲(chǔ)桶通知失敗: %v", err)
    }
    fmt.Printf("存儲(chǔ)桶 %s 的通知配置成功\n", bucketName)

    return nil
}

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

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

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

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

注意要將代碼中的 your_minio_endpoint、your_access_key、your_secret_key、your_bucket_name 和 your_webhook_arn 替換為實(shí)際的 Minio 服務(wù)端信息、要?jiǎng)?chuàng)建的存儲(chǔ)桶名稱(chēng)以及對(duì)應(yīng)的 Webhook 的 ARN 信息。

讀Minio對(duì)象

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
}

寫(xiě)Minio對(duì)象

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
}

過(guò)期策略

在 Minio 中,存儲(chǔ)桶的過(guò)期策略可以用于自動(dòng)刪除桶內(nèi)滿(mǎn)足一定條件(比如對(duì)象創(chuàng)建時(shí)間達(dá)到指定時(shí)長(zhǎng)等)的對(duì)象。這在一些場(chǎng)景下非常有用,例如對(duì)于臨時(shí)存儲(chǔ)的數(shù)據(jù)、日志文件等,設(shè)定過(guò)期策略后,系統(tǒng)可以自動(dòng)清理過(guò)期數(shù)據(jù),節(jié)省存儲(chǔ)空間,提升存儲(chǔ)資源的利用效率。

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

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(""), // 這里可以指定前綴來(lái)限制規(guī)則應(yīng)用到特定前綴的對(duì)象,空字符串表示應(yīng)用到桶內(nèi)所有對(duì)象
        Expiration: lifecycle.Expiration{
            Days: &days, // 設(shè)置過(guò)期天數(shù),對(duì)象創(chuàng)建后達(dá)到這個(gè)天數(shù)就會(huì)被自動(dòng)刪除
        },
    }

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

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

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


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

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

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

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

需要注意的是:

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

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

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

相關(guān)文章

  • Go 熱加載之fresh詳解

    Go 熱加載之fresh詳解

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

    淺談go語(yǔ)言renderer包代碼分析

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

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

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

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

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

    Go語(yǔ)言中的map擴(kuò)容機(jī)制

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

    Go語(yǔ)言與其他語(yǔ)言進(jìn)行交互的方式詳解

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

    GO語(yǔ)言支付寶沙箱對(duì)接的實(shí)現(xiàn)

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

    Golang學(xué)習(xí)之無(wú)類(lèi)型常量詳解

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

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

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

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

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

最新評(píng)論