1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/beyondstorage-go-storage

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Библиотека для работы с хранилищами данных на Golang: go-storage

Website | Документация | Сообщество

Go dev License

Matrix Slack Telegram

Build Test Cross Build Unit Test

go-storage — библиотека для хранения данных, независимая от поставщика.

Видение

«Напиши один раз, запускай везде».

Цель

  • Независимость от поставщиков.
  • Готовность к работе в продакшене.
  • Высокая производительность.

Примеры

package main

import (
    "log"

    "go.beyondstorage.io/v5/services"
    "go.beyondstorage.io/v5/types"

    // Добавляем поддержку файловой системы
    _ "go.beyondstorage.io/services/fs/v4"
    // Добавляем поддержку S3
    _ "go.beyondstorage.io/services/s3/v3"
    // Добавляем поддержку GCS
    _ "go.beyondstorage.io/services/gcs/v3"
    // Добавляем поддержку Azure Blob Storage
    _ "go.beyondstorage.io/services/azblob/v3"
    // Больше поддержки можно найти в BeyondStorage.
    _ "go.beyondstorage.io/services/xxx" 
)

func main() {
    // Инициализируем Storager из строки подключения. 
    store, err := services.NewStoragerFromString("s3://bucket_name/path/to/workdir")
    if err != nil {
        log.Fatalf("service init failed: %v", err)
    }

    // Записываем данные из io.Reader в hello.txt
    n, err := store.Write("hello.txt", r, length)

    // Считываем данные из hello.txt в io.Writer
    n, err := store.Read("hello.txt", w)

    // Получаем метаданные объекта hello.txt с помощью Stat
    o, err := store.Stat("hello.txt")

    // Используем функции объекта для получения метаданных
    length, ok := o.GetContentLength()
    
    // List создаёт итератор объектов под путём.
    it, err := store.List("path")
    
    for {
        // Используем iterator.Next для извлечения следующего объекта, пока не встретим IterateDone.
        o, err := it.Next()
        if errors.Is(err, types.IterateDone) {
            break
        }
    }

    // Удаляем hello.txt
    err = store.Delete("hello.txt")
}

Дополнительные примеры можно найти на странице go-storage-example.

Особенности

Поддержка множества популярных сервисов

16 стабильных сервисов, прошедших все интеграционные тесты.

InterPlanetary File Systemipfs

[qiniu kodo]kodo

Данные, которые хранятся только в памятиmemory

MinIOminio

Huawei Object Storage Serviceobs

Aliyun Object Storageoss

QingStor Object Storageqingstor

Amazon S3s3

3 бета-сервиса, в которых реализованы необходимые функции, но не пройдены интеграционные тесты (integration tests)

Hadoop Distributed File Systemhdfs

— Файлы tar — tar

[UPYUN Storage Service]uss

4 альфа-сервиса в стадии разработки

Microsoft OneDriveonedrive

StorJstorj

WebDAVwebdav

— Файлы zip — zip

Дополнительные идеи для сервисов можно найти на странице отслеживания интеграции сервисов (Service Integration Tracking).

Полный и легко расширяемый интерфейс

Основные операции:

  1. Метаданные: получение метаданных Storager.
meta := store.Metadata()
_ := meta.GetWorkDir() // Получить объект WorkDir
_, ok := meta.GetWriteSizeMaximum() // Получить максимальный размер для операции записи
  1. Чтение: чтение содержимого объекта.
// Прочитать 2048 байт со смещением 1024 в io.Writer.
n, err := store.Read("path", w, pairs.WithOffset(1024), pairs.WithSize(2048))
  1. Запись: запись содержимого в объект.
// Записать 2048 байт из io.Reader
n, err := store.Write("path", r, 2048)
  1. Stat: получение метаданных объекта или проверка существования.
o, err := store.Stat("path")
if errors.Is(err, services.ErrObjectNotExist) {
    // объект не существует
}
length, ok := o.GetContentLength() // получить длину содержимого объекта.
  1. Удаление: удаление объекта.
err := store.Delete("path") // Удалить объект "path"
  1. List: список объектов в заданном префиксе или каталоге.
it, err := store.List("path")
for {
    o, err := it.Next()
    if err != nil && errors.Is(err, types.IterateDone) {
        // список завершён
    }
    length, ok := o.GetContentLength() // получить длину содержимого объекта.
}

Расширенные операции:

  1. Copy: копирование объекта внутри storager.
err := store.(Copier).Copy(src, dst) // Скопировать объект из src в dst.
  1. Move: перемещение объекта внутри storager.
err := store.(Mover).Move(src, dst) // Переместить объект из src в dst.
  1. Reach: генерация общедоступного URL для объекта.
url, err := store.(Reacher).Reach("path") // Сгенерировать URL для объекта.
  1. Dir: поддержка объектов Dir.
o, err := store.(Direr).CreateDir("path") // Создать объект dir.

Манипуляции с большими файлами:

  1. Multipart: разрешение выполнения многокомпонентных загрузок.
ms := store.(Multiparter)

// Создать многокомпонентный объект.
o, err := ms.CreateMultipart("path")
// Записать 1024 байта из io.Reader в многокомпонентную часть с индексом 1
n, part, err := ms.WriteMultipart(o, r, 1024, 1)
// Завершить многокомпонентный объект. **err := ms.CompleteMultipart(o, []*Part{part})**

err = ms.CompleteMultipart (o, *Part {part}).

**Append: allow appending to an object**

```go
as := store.(Appender)
// Создаём объект, к которому можно добавить данные.
o, err := as.CreateAppend("path")
// Записываем 1024 байта из io.Reader.
n, err := as.WriteAppend(o, r, 1024)
// Фиксируем изменения в добавленном объекте.
err = as.CommitAppend(o)

Добавить: разрешить добавление данных к объекту.

Block: allow combining an object with block ids

bs := store.(Blocker)
// Создаем блочный объект.
o, err := bs.CreateBlock("path")
// Пишем 1024 байта из io.Reader с идентификатором блока "id-abc".
n, err := bs.WriteBlock(o, r, 1024, "id-abc")
// Объединяем блоки по идентификаторам.
err := bs.CombineBlock(o, []string{"id-abc"})

Блок: разрешить объединение объекта с другими объектами по их идентификатору.

Page: allow doing random writes

ps := store.(Pager)
// Создаём страничный объект.
o, err := ps.CreatePage("path")
// Записываем 1024 байта из io.Reader со смещением 2048.
n, err := ps.WritePage(o, r, 1024, 2048)

Страница: разрешить произвольную запись данных.

Comprehensive metadata

Глобальные метаданные объекта:

  • id: уникальный ключ в сервисе;
  • name: относительный путь к рабочей директории сервиса;
  • mode: режим объекта может быть комбинацией read, dir, part и других;
  • etag: тег сущности, как определено в rfc2616;
  • content-length: размер содержимого объекта;
  • content-md5: дайджест md5, как определено в rfc2616;
  • content-type: тип носителя, как определено в rfc2616;
  • last-modified: время последнего обновления объекта.

Системные метаданные объекта: метаданные системы сервиса, такие как storage-class и т. д.

o, err := store.Stat("path")

// Получаем системные метаданные сервиса через API, предоставляемый go-service-s3.
om := s3.GetObjectSystemMetadata(o)
_ = om.StorageClass // класс хранения этого объекта
_ = om.ServerSideEncryptionCustomerAlgorithm // алгоритм шифрования SSE этого объекта

Strong Typing Everywhere

Самоподдерживающийся кодогенератор definitions помогает генерировать все наши API, пары и метаданные.

Сгенерированные пары, которые можно использовать в качестве необязательных аргументов API.

func WithContentMd5(v string) Pair {
    return Pair{
        Key:   "content_md5",
        Value: v,
    }
}

Сгенерированный объект метаданных, который можно использовать для получения content md5 из объекта.

func (o *Object) GetContentMd5() (string, bool) {
    o.stat()
    
    if o.bit&objectIndexContentMd5 != 0 {
        return o.contentMd5, true
    }
    
    return "", false
}

Server-Side Encrypt

Поддержка Server-Side Encrypt через системные пары и системные метаданные, и мы можем использовать Default Pairs, чтобы упростить задачу.


func NewS3SseC(key []byte) (types.Storager, error) {
    defaultPairs := s3.DefaultStoragePairs{
        Write: []types.Pair{
            // Required, must be AES256
            s3.WithServerSideEncryptionCustomerAlgorithm(s3.ServerSideEncryptionAes256),
            // Required, your AES-256 key, a 32-byte binary value
            s3.WithServerSideEncryptionCustomerKey(key),
        },
        // Now you have to provide customer key to read encrypted data
        Read: []types.Pair{
            // Required, must be AES256
            s3.WithServerSideEncryptionCustomerAlgorithm(s3.ServerSideEncryptionAes256),
            // Required, your AES-256 key, a 32-byte binary value
            s3.WithServerSideEncryptionCustomerKey(key),
        }}
    
    return s3.NewStorager(..., s3.WithDefaultStoragePairs(defaultPairs))
}

Sponsor

В запросе представлен текст на английском языке, связанный с разработкой программного обеспечения. В тексте обсуждаются различные аспекты работы с объектами и метаданными в системе хранения данных, а также вопросы шифрования данных и использования парных значений.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

A vendor-neutral storage library for Golang. Расширить Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/beyondstorage-go-storage.git
git@gitlife.ru:oschina-mirror/beyondstorage-go-storage.git
oschina-mirror
beyondstorage-go-storage
beyondstorage-go-storage
master