Как развернуть приложение Golang

How to Deploy a Golang App

Go (Golang) – это язык программирования, разработанный компанией Google в 2009 году для решения таких распространенных проблем при разработке крупномасштабных систем, как медленная компиляция и необходимость параллельного программирования.

Язык был разработан для простоты, эффективности и легкости использования с синтаксисом, похожим на C. Кроме того, Go компилируется, что делает его более быстрым по сравнению с интерпретируемыми языками.

Одна из ключевых особенностей Go – поддержка параллелизма, которая позволяет выполнять несколько задач одновременно с помощью легких потоков, называемых Goroutines.

Go также известен своей сильной поддержкой сетевых и веб-разработок. В стандартной библиотеке Go есть пакеты для HTTP, TCP/IP и других сетевых протоколов, что упрощает создание сетевых приложений.

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

Продолжайте читать, чтобы узнать, как развернуть приложение Go.

Contents

Преимущества Golang в веб-разработке

Растущая популярность Go не случайна. Существует множество преимуществ, которые вы можете получить, используя Go в своих приложениях.

Высокая производительность

Высокая производительность – одна из главных причин, по которой такие компании, как Dropbox и Uber, используют Go. Go рассчитан на быстрое выполнение, что делает этот язык идеальным выбором для приложений, требующих высокой производительности.

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

Масштабируемость

Go – отличный выбор для создания масштабируемых приложений. Благодаря функции Concurrency вы можете создавать программы, способные решать множество задач, что делает Go подходящим для приложений с высоким трафиком, которые должны быстро масштабироваться.

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

Go проверен в бою

Многие популярные компании используют Go для создания масштабных приложений, в том числе Google, Uber и Dropbox. Это означает, что Go прошел боевые испытания на надежность и стабильность при создании сложных приложений для больших пользовательских баз.

Go уделяет большое внимание обратной совместимости, поэтому приложения, написанные на Golang, будут работать даже при развитии языка.

Большая общественная поддержка

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

Go является домом для множества библиотек и инструментов с открытым исходным кодом, которые вы можете использовать для ускорения разработки. Популярные инструменты сборки, такие как Kubernetes, Docker и Hugo, используют такие пакеты, как Cobra, в своих CLI-инструментах.

Ограничения Golang

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

Повышенная сложность некоторых задач

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

Модель параллелизма в Go может быть сложной для новичков

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

Модель параллелизма Go также требует от вас иного подхода к структуре и дизайну кода. Если вы привыкли к последовательным моделям программирования, это покажется вам сложным.

Менее развитая экосистема библиотек по сравнению с другими языками

Хотя стандартная библиотека Golang является всеобъемлющей и содержит большинство функций, необходимых для создания приложений на Go, она менее развита, чем библиотеки таких языков, как Java или Python.

Golang – относительно новый язык программирования, и некоторые популярные библиотеки еще не доступны. Это может быть ограничением для конкретных проектов, особенно тех, которые требуют более специализированной функциональности.

Кроме того, сторонние библиотеки для Golang менее распространены, чем для других языков, и вам, возможно, придется реализовывать некоторые функции самостоятельно, что может занять много времени.

Варианты развертывания Golang

После создания приложений на Go у вас есть несколько вариантов развертывания, каждый из которых имеет свои преимущества и недостатки.

У вас есть широкий выбор: IaaS-сервисы, такие как AWS, PaaS-сервисы, такие как Heroku, BaaS-сервисы, такие как Back4app & Google Firebase, и CaaS-сервисы, такие как Back4App Containers.

Инфраструктура как услуга (IaaS), например AWS

Поставщики инфраструктуры как услуги (IaaS), такие как Amazon Web Services (AWS), предоставляют функциональность для развертывания и управления собственными виртуальными машинами в облаке.

В AWS вы можете использовать такие сервисы, как Elastic Compute Cloud (EC2), для развертывания приложения Golang на виртуальной машине под управлением Linux или Windows. Вы также можете использовать такие сервисы, как Elastic Container Service (ECS), для развертывания приложения в контейнере.

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

Другие платформы IaaS включают:

  • Linode
  • Microsoft Azure
  • Rackspace
  • Amazon Web Services (AWS)
  • DigitalOcean
  • Google Compute Engine (GCE)

Платформа как сервис (PaaS), например Heroku

Поставщики платформ как услуг (PaaS) , такие как Heroku, предоставляют платформу для развертывания приложений Golang без ущерба для базовой инфраструктуры.

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

Преимущество использования PaaS-сервиса, такого как Heroku, заключается в том, что вы можете сосредоточиться на разработке своего приложения, не заботясь об инфраструктуре. Heroku берет на себя все управление и обслуживание инфраструктуры, что экономит ваше время и ресурсы.

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

Другие поставщики PaaS включают:

  • Render
  • AWS Elastic Beanstalk
  • Microsoft Azure App Service
  • DigitalOcean App Platform
  • The Fly Platform

Бэкенд как услуга (BaaS), например Back4app

Поставщики услуг как бэкенд (BaaS), такие как Google Firebase и Back4app, предоставляют полное решение для бэкенда вашего приложения, включая базу данных, аутентификацию и хостинг. Firebase поддерживает несколько языков программирования, включая Golang, и предоставляет простой API, который вы можете использовать для доступа к своим сервисам.

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

Другие платформы BaaS включают:

  • AWS Amplify
  • Cloudkit
  • Backendless
  • Back4App
  • Pocketbase

Контейнеризация как услуга, как Back4app Containers

Контейнеризация популярна для развертывания приложений. С помощью контейнеризации вы можете упаковать свое приложение и его зависимости в контейнер, который можно быстро развернуть на любой платформе, поддерживающей контейнерную технологию.

Back4App – это контейнеризация как поставщик услуг, который можно использовать для развертывания и управления приложением Golang в контейнере.

Одно из преимуществ использования контейнеризации в качестве поставщика услуг, такого как Back4App, заключается в том, что вы можете развернуть свое приложение на любой платформе, поддерживающей контейнеры, не беспокоясь о базовой инфраструктуре.

Поставщик CaaS берет на себя все управление и обслуживание контейнеров, экономя ваше время и ресурсы. Однако вам, возможно, придется работать в рамках ограничений платформы контейнеризации, не имея доступа к инфраструктуре.

Другие платформы CaaS включают в себя:

  • AWS Container Service
  • Azure Container Service
  • Docker Enterprise
  • Google Container Engine
  • IBM Kubernetes Service
  • Oracle Container Service

Процесс развертывания Golang

Здесь вы узнаете , как развернуть свое приложение Golang на платформе CaaS компании Back4app.

Что такое Back4app?

Back4app – это облачное предложение, которое вы можете использовать для создания и развертывания бэкэнд-сервисов для ваших мобильных и веб-приложений.

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

В этом разделе вы узнаете, как создать простой CRUD RESTful API на Go, контейнеризировать Go-программы и развернуть контейнер на Back4app.

Настройка среды разработки

После установки Go на компьютер со страницы загрузки вы можете создать новый каталог и инициализировать новый проект Go для вашего приложения Go.

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

mkdir deployAPI && cd deployAPI

Выполните команду mod init, чтобы инициализировать новый проект в текущем рабочем каталоге с помощью инструмента Go.

Например, так:

go mod init

Вы создадите RESTful API с помощью пакета Gorilla Mux.

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

go get -u github.com/gorilla/mux

Следующий шаг – создание RESTful API. Первым шагом в создании RESTful API с помощью Gorilla Mux является импорт необходимых пакетов в ваш Go-файл.

Вот список импортных товаров, необходимых для проекта.

import (
	"encoding/json"
	"log"
	"net/http"
	"strconv"

	"github.com/gorilla/mux"
)

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

Вы можете добавить карту в свое приложение следующим образом:

var users = map[int]string{}

Поскольку карта пуста, вам нужно ввести данные с помощью POST-запроса.

Функция обработчика запроса POST

Ваш POST-запрос должен получить данные от клиента, разобрать их и сохранить в хранилище данных карты.

Добавьте этот блок кода в свое приложение, чтобы реализовать обработчик POST-запроса:

func createUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	var data map[string]string

	err = json.NewDecoder(r.Body).Decode(&data)
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	users[id] = data["name"]

	w.WriteHeader(http.StatusCreated)
}

Функция-обработчик createUserHandler принимает данные от клиента (JSON), разбирает их и сохраняет в карте. Когда обработчик успешно добавляет данные в карту, он пишет клиенту код успеха StatusCreated.

Запрос GET

Вы будете читать данные из хранилища данных с помощью GET-запроса. Ваша функция-обработчик GET-запроса получит от клиента идентификатор, выполнит поиск и вернет данные клиенту.

Добавьте блок кода в ваше приложение, чтобы реализовать обработчик GET-запросов:

func readUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	name, ok := users[id]
	if !ok {
		w.WriteHeader(http.StatusNotFound)
		return
	}

	data := map[string]string{"name": name}

	jsonData, err := json.Marshal(data)
	if err != nil {
		w.WriteHeader(http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusOK)
	w.Write(jsonData)
}

Функция readUserHandler получает идентификатор с помощью функции Vars пакета mux и ищет данные в карте, после чего возвращает их клиенту в формате JSON вместе с кодом успеха StatusOk.

Функция обработчика запроса PUT

Вы будете обновлять данные в своем хранилище данных с помощью запроса PUT. Ваш обработчик запроса PUT примет идентификатор и поле JSON для процесса обновления.

func updateUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	var data map[string]string

	err = json.NewDecoder(r.Body).Decode(&data)
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	users[id] = data["name"]

	w.WriteHeader(http.StatusOK)
}

Функция updateUserHandler принимает ID с помощью переменной vars, декодирует JSON из тела запроса и обновляет поле или ID с помощью JSON-данных из тела запроса.

Функция обработчика запроса DELETE

Ваша функция обработчика запроса DELETE примет идентификатор поля из запроса и удалит поле из хранилища данных.

Добавьте этот блок кода в свое приложение, чтобы реализовать обработчик запроса DELETE:

func deleteUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	delete(users, id)

	w.WriteHeader(http.StatusOK)
}

Функция deleteUserHandler удаляет поле с помощью функции delete, которая принимает имя карты и ID и возвращает клиенту код StatusOk.

Прикрепление функций обработчика к маршрутам

После определения конечных точек вашего приложения вы должны назначить функции-обработчики маршрутам. Маршруты – это публичный интерфейс вашего API.

func main() {
	r := mux.NewRouter()

	r.HandleFunc("/users/{id}", createUserHandler).Methods(http.MethodPost)
	r.HandleFunc("/users/{id}", readUserHandler).Methods(http.MethodGet)
	r.HandleFunc("/users/{id}", updateUserHandler).Methods(http.MethodPut)
	r.HandleFunc("/users/{id}", deleteUserHandler).Methods(http.MethodDelete)

	log.Fatal(http.ListenAndServe(":8080", r))
}

В главной функции r – это экземпляр нового маршрутизатора mux, а метод HandleFunc принимает маршрут и функцию-обработчик. Функция Methods задает HTTP-методы для маршрутов.

Контейнеризация приложений Go с помощью Docker

Docker – одна из самых популярных технологий контейнеризации. Docker был создан на основе Go, и вы можете контейнеризовать свои приложения Go для переносимости с помощью Docker.

Вам придется создать новый dockerfile, в котором вы укажете инструкции по сборке.

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

touch Dockerfile

Откройте Dockerfile и вставьте эти инструкции по сборке, чтобы контейнеризировать ваше приложение Go с помощью Docker.

# Use an official Golang runtime as a parent image
FROM golang:latest

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Download and install any required dependencies
RUN go mod download

# Build the Go app
RUN go build -o main .

# Expose port 8080 for incoming traffic
EXPOSE 8080

# Define the command to run the app when the container starts
CMD ["/app/main"]

В инструкциях по сборке в докерфайле указывается версия Go для проекта, рабочий каталог, файлы для приложения и инструкции по сборке для докерфайла.

Вот описание Dockerfile:

  • Файл начинается с FROM golang: latest, что указывает на то, что вы хотите использовать последнюю версию официального образа Golang в качестве базового образа для вашего Docker-контейнера.
  • Строка WORKDIR /app устанавливает в качестве рабочего каталога для вашего контейнера каталог /app.
  • Команда COPY . /app копирует содержимое вашего текущего каталога в каталог /app контейнера.
  • RUN go mod download загружает необходимые зависимости вашего приложения.
  • Команда RUN go build -o main . компилирует ваше приложение Go и создает исполняемый файл с именем main в каталоге /app.
  • Строка EXPOSE 8080 указывает Docker на открытие порта 8080 – порта, на котором ваше приложение Go будет принимать входящие запросы.
  • В строке CMD ["/app/main"] указывается команда, которая будет выполняться при запуске контейнера (в данном случае – основной исполняемый файл).

После запуска dockerfile Docker собирает образ приложения и открывает его на порту 8080.

Команда запускает контейнер и сопоставляет порт 8080 на хост-машине с портом 8080 в контейнере, после чего вы сможете получить доступ к API на [http://localhost:8080](http://localhost:8080).

Развертывание контейнера на Back4app

Вам нужно будет создать учетную запись на Back4app (если у вас ее нет), чтобы развернуть контейнеры.

Вот шаги по созданию аккаунта на Back4app.

  1. Перейдите на сайт Back4app.
  2. Чтобы создать новую учетную запись, нажмите кнопку ” Зарегистрироваться ” в правом верхнем углу целевой страницы.
  3. Наконец, заполните форму регистрации и отправьте ее.

После создания учетной записи Back4app войдите в нее и нажмите кнопку NEW APP в правом верхнем углу пользовательского интерфейса.

Кнопка NEW APP приведет вас на страницу, где вы сможете выбрать способ развертывания приложения. Поскольку вы развертываете контейнер, выберите вариант Containers as a Service.

Создайте новое приложение CaaS на Back4app

Затем подключите свой аккаунт GitHub к аккаунту Back4app. Вы можете предоставить Back4app доступ к исходному коду всех репозиториев в вашем аккаунте или к определенной директории проекта.

Контейнеры Back4app - импорт репозитория GitHub.

Выберите приложение, которое вы хотите развернуть, в данном случае приложение, которое вы создали в этом уроке, а затем нажмите кнопку Выбрать.

Контейнеры Back4app - Выберите git-репозиторий

Нажав кнопку выбора, вы перейдете на страницу, где заполните информацию о своем приложении, начиная с названия и заканчивая веткой, корневым каталогом и переменными окружения.

Обязательно заполните все переменные среды, которые требуются вашему приложению. После того как вы заполнили все необходимые данные, нажмите кнопку Создать приложение.

Нажатие этой кнопки запускает процесс развертывания вашего приложения Go, как показано на рисунке ниже.

Страница развертывания контейнера Back4app

Заключение

Вы узнали, как развернуть приложение Go в контейнере на Back4app. Следуя шагам этого руководства, вы должны иметь Go API, работающий на Back4app.

Развертывание приложений на Back4app – это отличный способ упростить управление инфраструктурой бэкэнда. Back4App предоставляет мощные инструменты для управления данными, масштабирования приложения и мониторинга его производительности. Это отличный выбор для разработчиков, которые хотят создавать отличные приложения, а не управлять серверами.

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

Что такое Back4App и почему это хорошая платформа для развертывания моего приложения?

Back4App — это платформа BaaS, где вы можете создавать, размещать и масштабировать свои приложения с помощью архитектуры без сервера. Back4app также предлагает услуги контейнеризации, позволяющие вам управлять и развертывать программные контейнеры, не беспокоясь об управлении базовой инфраструктурой.

Могу ли я развернуть другие языки, например Rust, на Back4app с помощью контейнеров?

Да, вы можете развернуть Rust на Back4App, используя технологии контейнеризации, такие как Docker. Back4App поддерживает контейнеры Docker, которые вы можете использовать для развертывания приложений, написанных на различных языках программирования, включая Rust.

Могу ли я масштабировать свое контейнерное приложение на Back4App?

Да, вы можете масштабировать свое контейнерное приложение на Back4App с помощью встроенной функции автоматического масштабирования. Функция автоматического масштабирования автоматически масштабирует количество экземпляров вашего приложения в зависимости от спроса, гарантируя, что ваше приложение сможет справиться с возросшим трафиком и рабочей нагрузкой.


Leave a reply

Your email address will not be published.