Введение


Сегодня (прим. переводчика 24-07-2018), команда Go в Google выпустила новый Open Source проект Go Cloud, библиотека и инструменты для разработки в открытом облаке. Этим проектом, мы преследуем цель, чтобы разработчики выбирали язык Go для создания кросс-облачных приложений.

Этот пост обясняет почему мы начали этот проект, детали того как работает Go Cloud, и как вовлечься и начать использовать его.

Почему кросс-облачное программирование? Почему сейчас?


По нашей оценке, в мире более одного миллиона разработчиков, использующих Go. Go обслуживает многие из самых критичных облачно-ориентрованных проектов, включая Kubernetes, Istio и Docker. Компании, такие как, Lyft, Capital One, Netflix и многие другие зависят от Go в продакшене. На протяжении многих лет, мы обнаружили, что разработчики любят использовать Go для облачной разработки из-за его эффективности, производительности, встроенной конкурентности и маленькой задержки.

Как часть нашей работы по поддержке быстрого развития Go, мы проводили интервью с командами, кто работает с Go и понимает как они используют язык и как в будущей перспективе можно улучшить экосистему Go. Одна из основных, озвученных тем среди многих опрошенных организаций, необходимость в кросс-облачной разработке. Эти команды (опрошенные) хотят иметь возможность разворачивать свои приложения в мульти-облачных и гибридных облачных окружениях, и распределять нагрузку между облачными провайдерами без существенных изменений в коде приложения.

Для достижения этой цели, некоторые команды пытаются отвязать свои приложения от провайдеро-специфичного API для того чтобы писать более простой и более портабельный (кросс-облачный) код. Тем не менее, краткосрочные требования по доставке функционала означает, что командам приходится жертвовать долгосрочными требованиям по кросс-облачности. Как результат, большинство Go приложений запущенных в облаке крепко привязаны к изначально выбранному облачному провайдеру.

Как альтернатива, команды могут использовать Go Cloud, набор открытых общих облачных API, для программирование более простых и более портабельных облачных приложений. Go Cloud также представляет из себя фундамент для экосистемы портабельных облачных библиотек. Go Cloud позволяет командам сосредоточиться на функционале во время разработки приложения, в то же время сохраняя долгосрочную гибкость для развертки приложения в мульти-облачных и гибридно-облачных архитектурах. Go Cloud приложения также могут быть смигрированы на облачного провайдера наилучшим образом удовлетворяющего потребностям приложения.

Что такое Go Cloud?


Мы выявили общие сервисы, используемые облачными приложениями и создали общее API, для работы между облачным провайдерами. Сегодня, Go Cloud может работать с blob хранилищем, БД MySQL, настройками (конфигурацией) времени выполнения, и HTTP сервером сконфигурированный с логгированием запросов, мониторингом и проверкой работоспособности (health checking). Go Cloud работает c Google Cloud Platform (GCP) и Amazon Web Services (AWS). Мы будем продолжать работать с партнерами в облачной индустрии и сообществом Go, чтобы добавить поддержку других облачных провайдеров в ближайшем будущем.

Go Cloud преследует цель разработать нейтральный к поставщику общее API для большинства используемых сервисов, например, простая и легкая развертка Go приложения на другое облако. Go Cloud также может использоваться как основа для разработки других Open Source библиотек для работы между облачными поставщиками. Обратная связь, от всех видов разработчиков и на всех уровнях разработки, будут влиять на приоритет реализации/добавления того или иного функционала в будущих версиях Go Cloud API.

Как это работает?


В основе Go Cloud лежит набор общих API для кросс-облачного программирования. Давайте посмотрим на примере использования blob хранилища. Вы можете использовать общий тип *blob.Storage чтобы скопировать файл с локального диска в облако. Давайте начнем с открытия S3 хранилища, используя поставляемый в комплекте пакет s3blob:

// setupBucket opens an AWS bucket.
func setupBucket(ctx context.Context) (*blob.Bucket, error) {
    // Obtain AWS credentials.
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("us-east-2"),
    })
    if err != nil {
        return nil, err
    }
    // Open a handle to s3://go-cloud-bucket.
    return s3blob.OpenBucket(ctx, sess, "go-cloud-bucket")
}

С того момента как в приложении появляется *blob.Bucket, вы получаете возможность создать *blob.Writer, который в свою очередь реализует интерфейс io.Writer. С этого момента, приложение (программа) может использовать *blob.Writer для записи данных в облачное хранилище, проверяя, что Close не возвращает ошибку.

ctx := context.Background()
b, err := setupBucket(ctx)
if err != nil {
    log.Fatalf("Failed to open bucket: %v", err)
}
data, err := ioutil.ReadFile("gopher.png")
if err != nil {
    log.Fatalf("Failed to read file: %v", err)
}
w, err := b.NewWriter(ctx, "gopher.png", nil)
if err != nil {
    log.Fatalf("Failed to obtain writer: %v", err)
}
_, err = w.Write(data)
if err != nil {
    log.Fatalf("Failed to write to bucket: %v", err)
}
if err := w.Close(); err != nil {
    log.Fatalf("Failed to close: %v", err)
}

Заметьте, что логика работы с хранилищем (bucket) не ссылается на специфику работы AWS S3. Go Cloud превращает замену облачного хранилища, по сути в замену функции используемой для открытия *blob.Bucket. Приложение может легко переключиться на использование Google Cloud Storage, создавая экземпляр *blob.Bucket используя gcsblob.OpenBucket без изменения кода, который копирует файл:

// setupBucket opens a GCS bucket.
func setupBucket(ctx context.Context) (*blob.Bucket, error) {
    // Open GCS bucket.
    creds, err := gcp.DefaultCredentials(ctx)
    if err != nil {
        return nil, err
    }
    c, err := gcp.NewHTTPClient(gcp.DefaultTransport(), gcp.CredentialsTokenSource(creds))
    if err != nil {
        return nil, err
    }
    // Open a handle to gs://go-cloud-bucket.
    return gcsblob.OpenBucket(ctx, "go-cloud-bucket", c)
}

Пока все же, требуются различные шаги для доступа к хранилищу для различных облачных поставщиков, конечный тип используемый приложением остается все тот же *blob.Bucket. Таким образом код приложения остается изолированным от облачно-специфичного кода. Чтобы увеличить совместимость с существующими библиотеками Go, Go Cloud использует существующие интерфейсы, поставляемые в стандартной библиотеке Go, такие как io.Writer, io.Reader и *sql.DB.

Код, необходимый для доступа к облачным сервисам (функция setupBucket() из примера выше) следует следующему шаблону: высшие абстракции конструируются с помощью более базовых (низших) абстракций. В то время как вы можете написать такой код ручками, Go Cloud автоматизирует это при помощи Wire, инструмента, который генерирует облачно-специфичный код для Вас. Документация Wire объясняет как его установить и использовать, а примеры показывают Wire в действии.

Как вовлечься в проект и узнать больше?


Для начала, мы рекомендуем следующее руководство, а далее рекомендуем самому попробовать построить приложение с использованием Go Cloud. Если вы уже используете AWS или GCP, вы можете попробовать мигрировать части существующих приложений на использование Go Cloud. Если вы используете другие облачные провайдеры или сервис по подписке (on-premise), вы можете расширить Go Cloud для поддержки сего, реализуя интерфейсы драйвера (например driver.Bucket).

Мы оценим любой и разного рода опыт с Go Cloud. Разработка Go Cloud управляется на GitHub. Мы будем рады любому вкладу в проект, включая пул рекуесты. Создавайте issue чтобы сообщить нам, что на Ваш взгляд стоит улучшить или какие API в первую очередь должна поддерживать библиотека. Чтобы следить за обновлениями и новостями присоединяйтесь к списку рассылки проекта.

Проект требует, чтобы контрибьюторы подписали то же самое Лицензионное Соглашение Контрибьютора, принятое в проекте Go. Читайте руководство контрибьютора для более подробной информации.

Спасибо за Ваше время, потраченное на знакомство с Go Cloud, мы рады работать с Вами, чтобы сделать язык Go выбором разработчиков для построения кросс-облачных (портабельных) приложений.

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


  1. anjensan
    25.07.2018 16:15

    Go Cloud автоматизирует это при помощи Wire, инструмента, который генерирует облачно-специфичный код для Вас.
    Судя по всему это просто DI контейнер, нисколько не «облачно-спецефичный». Интересно, приживется ли данный подход в Go.


  1. aml
    26.07.2018 10:45
    +1

    Для питона давно есть Apache libcloud. Давно пора было для Go запилить.