最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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 支持數(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)建時間達到指定時長等)的對象。這在一些場景下非常有用,例如對于臨時存儲的數(shù)據(jù)、日志文件等,設(shè)定過期策略后,系統(tǒng)可以自動清理過期數(shù)據(jù),節(jié)省存儲空間,提升存儲資源的利用效率。

**注意:**類似地,也可以實現(xiàn)轉(zhuǎ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)建后達到這個天數(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)文章

  • Golang?實現(xiàn)Redis?協(xié)議解析器的解決方案

    Golang?實現(xiàn)Redis?協(xié)議解析器的解決方案

    這篇文章主要介紹了Golang???實現(xiàn)?Redis?協(xié)議解析器,本文將分別介紹Redis 通信協(xié)議 以及 協(xié)議解析器 的實現(xiàn),若您對協(xié)議有所了解可以直接閱讀協(xié)議解析器部分,需要的朋友可以參考下
    2022-10-10
  • Go語言中的os.Truncate函數(shù)用法解讀

    Go語言中的os.Truncate函數(shù)用法解讀

    這篇文章主要介紹了Go語言中的os.Truncate函數(shù)用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • Go 面向包新提案透明文件夾必要性分析

    Go 面向包新提案透明文件夾必要性分析

    這篇文章主要為大家介紹了Go 面向包新提案,透明文件夾必要性分析,看看是否合適加進 Go 特性中,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Golang中Interface接口的三個特性

    Golang中Interface接口的三個特性

    本文詳細講解了Golang中Interface接口的三個特性,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Golang實現(xiàn)短網(wǎng)址/短鏈服務(wù)的開發(fā)筆記分享

    Golang實現(xiàn)短網(wǎng)址/短鏈服務(wù)的開發(fā)筆記分享

    這篇文章主要為大家詳細介紹了如何使用Golang實現(xiàn)短網(wǎng)址/短鏈服務(wù),文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-05-05
  • Golang多個域名的跨域資源共享的實現(xiàn)

    Golang多個域名的跨域資源共享的實現(xiàn)

    本文主要介紹了Golang多個域名的跨域資源共享的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Golang TCP粘包拆包問題的解決方法

    Golang TCP粘包拆包問題的解決方法

    這篇文章主要給大家介紹了Golang TCP粘包拆包問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Go語言類型轉(zhuǎn)換的方式有哪些

    Go語言類型轉(zhuǎn)換的方式有哪些

    本文主要介紹了Go語言類型轉(zhuǎn)換的方式有哪些,類型轉(zhuǎn)換主要有4種,分別為斷言類型轉(zhuǎn)換、顯式類型轉(zhuǎn)換、隱式類型轉(zhuǎn)換、強制類型轉(zhuǎn)換,感興趣的可以了解一下
    2023-11-11
  • go modules中replace使用方法

    go modules中replace使用方法

    這篇文章主要為大家介紹了go modules中replace使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Go語言中關(guān)于set的實現(xiàn)思考分析

    Go語言中關(guān)于set的實現(xiàn)思考分析

    Go?開發(fā)過程中有時我們需要集合(set)這種容器,但?Go?本身未內(nèi)置這種數(shù)據(jù)容器,故常常我們需要自己實現(xiàn),下面我們就來看看具體有哪些實現(xiàn)方法吧
    2024-01-01

最新評論

山东省| 玉门市| 水城县| 泰来县| 江永县| 揭西县| 电白县| 咸丰县| 东明县| 巨野县| 阜新市| 昌黎县| 桃园县| 财经| 锡林郭勒盟| 长治县| 宿迁市| 固阳县| 岳普湖县| 海宁市| 句容市| 香港 | 壶关县| 运城市| 城固县| 阿坝县| 宁化县| 崇义县| 寿宁县| 嘉善县| 祥云县| 安丘市| 秦皇岛市| 陕西省| 栾川县| 余干县| 呼图壁县| 阳高县| 武胜县| 调兵山市| 综艺|