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