Создание облачного бэкенда в 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.👈