DevGang
Авторизоваться

Создание облачного backend на Go с использованием REST и PostgreSQL

В этом руководстве показано, как создать и развернуть серверную часть Go для сокращения URL-адресов. Он состоит из одного сервиса с REST API и использует базу данных PostgreSQL.

Чтобы всего за несколько минут запустить нашу серверную часть Go в облаке, мы будем использовать Encore — платформу разработки серверной части, которая автоматизирует инфраструктуру.

🚀 Что надо сделать:

  • Установить Encore
  • Создайте свой сервис и конечные точки
  • Добавить базу данных SQL
  • Запускать локально
  • Развертывание в бесплатном облаке разработки Encore

🏁Поехали!

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

Каждый раз, когда вы видите 🥐, это значит, что вам есть чем заняться!

💽 Установите Encore

Установите Encore CLI для запуска локальной среды:

  • macOS: Brew Install encoredev/tap/encore
  • Linux: curl -L https://encore.dev/install.sh | bash
  • Windows: iwr https://encore.dev/install.ps1 | IEX

🖥 Создайте свое приложение Encore

🥐 Создайте новое приложение, запустив encore app create и выбрав в качестве шаблона Empty app.

🔨 Создайте конечную точку сервиса и API.

Теперь давайте создадим новый сервис URL.

🥐 В корневой папке вашего приложения создайте URL-адрес новой папки и новый файл url.go, который выглядит следующим образом:

package url

import (
    "context"
    "crypto/rand"
    "encoding/base64"
)

type URL struct {
    ID  string // short-form URL id
    URL string // complete URL, in long form
}

type ShortenParams struct {
    URL string // the URL to shorten
}

// Shorten shortens a URL.
//encore:api public method=POST path=/url
func Shorten(ctx context.Context, p *ShortenParams) (*URL, error) {
    id, err := generateID()
    if err != nil {
        return nil, err
    }
    return &URL{ID: id, URL: p.URL}, nil
}

// generateID generates a random short ID.
func generateID() (string, error) {
    var data [6]byte // 6 bytes of entropy
    if _, err := rand.Read(data[:]); err != nil {
        return "", err
    }
    return base64.RawURLEncoding.EncodeToString(data[:]), nil
}

Это устанавливает конечную точку POST/url. Обратите внимание на аннотацию //encore:api в функции Shorten. Это все, что нужно Encore, чтобы понять, что это конечная точка API, и она автоматически сгенерирует код, необходимый для ее предоставления.

🏁 Запустите приложение локально

🥐 Посмотрим, сработает ли это! Запустите приложение, запустив encore run.

Вы должны увидеть это:

Вы также увидите панель локальной разработки (localhost:9400), открытую в новой вкладке. Он дает вам доступ к обозревателю API Encore, локальной трассировке, диаграммам архитектуры и каталогу услуг.

🥐 Далее позвоните на свою конечную точку:

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

curl http://localhost:4000/url -d '{"URL": "https://encore.dev"}'

Вы должны увидеть это:

{
  "ID": "5cJpBVRp",
  "URL": "https://encore.dev"
}

🎉 Это работает!

Есть только одна проблема...

На данный момент мы фактически нигде не храним URL-адрес. Это означает, что мы можем генерировать сокращенные идентификаторы, но нет возможности вернуться к исходному URL-адресу! Нам нужно сохранить сопоставление короткого идентификатора с полным URL-адресом.

💾 Сохранение URL-адресов в базе данных

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

🥐 Создайте новую папку с именем «migrations» внутри папки URL. Затем в папке migrationsсоздайте исходный файл миграции базы данных с именем 1_create_tables.up.sql. Формат имени файла важен (оно должно начинаться с 1_ и заканчиваться на .up.sql).

🥐 Добавьте в файл следующее содержимое:

CREATE TABLE url (
    id TEXT PRIMARY KEY,
    original_url TEXT NOT NULL
);

🥐 Затем вернитесь к файлу url/url.go и импортируйте пакет encore.dev/storage/sqldb, изменив оператор импорта следующим образом:

import (
    "context"
    "crypto/rand"
    "encoding/base64"

    "encore.dev/storage/sqldb"
)

🥐 Затем сообщим Encore, что нам нужна база данных, добавив в конец url/url.go следующее:

// Define a database named 'url', using the database
// migrations  in the "./migrations" folder.
// Encore provisions, migrates, and connects to the database.

var db = sqldb.NewDatabase("url", sqldb.DatabaseConfig{
    Migrations: "./migrations",
})

🥐 Теперь, чтобы вставить данные в нашу базу данных, давайте создадим вспомогательную функцию Insert:

// insert inserts a URL into the database.
func insert(ctx context.Context, id, url string) error {
    _, err := db.Exec(ctx, `
        INSERT INTO url (id, original_url)
        VALUES ($1, $2)
    `, id, url)
    return err
}

🥐 Наконец, мы можем обновить нашу функцию Shorten для вставки в базу данных:

//encore:api public method=POST path=/url
func Shorten(ctx context.Context, p *ShortenParams) (*URL, error) {
    id, err := generateID()
    if err != nil {
        return nil, err
    } else if err := insert(ctx, id, p.URL); err != nil {
        return nil, err
    }
    return &URL{ID: id, URL: p.URL}, nil
}

🚨 Прежде чем запускать приложение, убедитесь, что у вас установлен и работает Docker. (Необходимо для локального запуска приложений Encore с базами данных.)

🥐 Затем снова запустите приложение с помощью команды encore run, и Encore автоматически настроит вашу базу данных.

🥐 Теперь снова вызовем API:

curl http://localhost:4000/url -d '{"URL": "https://encore.dev"}'

🥐 Наконец, давайте проверим, что он сохранился в базе данных.

Сделайте это, просмотрев трассировку, автоматически записанную Encore, доступную на панели локальной разработки по адресу localhost:9400.

🔨 Добавьте конечную точку для получения URL-адресов.

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

🥐 Добавьте эту конечную точку в url/url.go:

// Get retrieves the original URL for the id.
//encore:api public method=GET path=/url/:id
func Get(ctx context.Context, id string) (*URL, error) {
    u := &URL{ID: id}
    err := db.QueryRow(ctx, `
        SELECT original_url FROM url
        WHERE id = $1
    `, id).Scan(&u.URL)
    return u, err
}

Encore использует синтаксис path=/url/:id для представления пути с параметром. Имя id соответствует имени параметра в сигнатуре функции. В данном случае это string тип, но вы также можете использовать другие встроенные типы, такие как int или bool, если хотите ограничить значения.

🥐 Давайте убедимся, что он работает, вызвав его (не забудьте изменить идентификатор на тот, который вы нашли при просмотре трассировки на последнем шаге):

curl http://localhost:4000/url/zr6RmZc4

Теперь вы должны увидеть это:

{
  "ID": "zr6RmZc4",
  "URL": "https://encore.dev"
}

🎉 И вот оно! Вот как вы создаете REST API и используете базы данных PostgreSQL в Encore.

🚀 Развертывание в облаке

Теперь давайте зафиксируем все наши изменения в репозитории проекта и развернем наше приложение.

🥐 Зафиксируйте новые файлы в репозитории git проекта и запустите развертывание в бесплатном облаке разработки Encore, выполнив:

$ git add -A .
$ git commit -m 'Initial commit'
$ git push encore

Теперь Encore создаст и протестирует ваше приложение, предоставит необходимую инфраструктуру и развернет ваше приложение в облаке.

После запуска развертывания вы увидите URL-адрес, по которому вы сможете просмотреть его ход на облачной панели управления Encore.👈

Это будет выглядеть примерно так: https://app.encore.dev/$APP_ID/deploys/...

Отсюда вы также можете просмотреть метрики, трассировки и подключить свою собственную учетную запись AWS или GCP для использования в производственном развертывании.

🎉Отличная работа – все готово!

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

Продолжайте создавать с помощью этих шаблонов приложений с открытым исходным кодом.👈

Если у вас есть вопросы или вы хотите поделиться своей работой, присоединяйтесь к видеовстрече разработчиков в сообществе Encore Slack.👈

Источник:

#PostgreSQL #Golang
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу