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

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

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

Мы будем использовать Encore, чтобы запустить наше приложение в облаке бесплатно за 10 минут!

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

🚀 Что требуется:

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

🏁 Поехали!

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

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

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

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

  • macOS: brew установите encoredev/tap/encore
  • Linux: curl -L https://encore.dev/install.sh | bash
  • Windows: iwr https://encore.dev/install.ps1 | iex

🔨 Создайте службу и конечную точку API

🥐 В корневой папке вашего приложения создайте новый 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), открытую на новой вкладке. Это дает вам доступ к Encore API explorer, локальной трассировке, диаграммам архитектуры и каталогу сервисов.

🥐 Затем вызовите свою конечную точку:

Вы можете сделать это из обозревателя 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, чтобы она стала:

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
}

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

//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, если хотите ограничить значения.

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

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-адрес, по которому сможете просмотреть его ход на Cloud Dashboard.

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

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

🎉 Отличная работа!

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

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

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

Источник:

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

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

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

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