使用 Go 语言、REST 和 PostgreSQL 构建云后端
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
太长不看
本指南将向您展示如何构建和部署一个基于 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 - 视窗:
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)在新标签页中打开。它提供对 Encore API 浏览器、本地跟踪、架构图和服务目录的访问。
🥐 接下来,调用您的端点:
您可以通过开发者控制面板中的 API 浏览器执行此操作,也可以通过终端执行此操作,如下所示:
curl http://localhost:4000/url -d '{"URL": "https://encore.dev"}'
你应该看看这个:
{
"ID": "5cJpBVRp",
"URL": "https://encore.dev"
}
🎉 成功了!
只有一个问题……
目前,我们实际上并没有存储 URL。这意味着我们可以生成短 ID,但却无法找回原始 URL!我们需要存储一个从短 ID 到完整 URL 的映射关系。
💾 将网址保存到数据库中
Encore 让设置 PostgreSQL 数据库来存储数据变得非常简单。为此,我们首先需要定义一个数据库模式,以迁移文件的形式呈现。
migrations🥐 在文件夹内创建一个名为 `<name>` 的新文件夹url。然后,在该migrations文件夹内创建一个名为 `<init>` 的初始数据库迁移文件1_create_tables.up.sql。文件名格式很重要(必须以 `<name>` 开头1_,以 `<name>` 结尾.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 应用程序需要 Docker。)
🥐 接下来,再次启动应用程序encore run,Encore 会自动设置您的数据库。
🥐 现在我们再次调用 API:
curl http://localhost:4000/url -d '{"URL": "https://encore.dev"}'
🥐 最后,让我们验证一下它是否已保存到数据库中。
通过查看 Encore 自动捕获的跟踪信息来完成此操作,该信息可在localhost:9400的本地开发仪表板中找到。
🔨 添加一个用于检索 URL 的端点
为了完善我们的 URL 缩短 API,让我们添加一个端点,用于根据短 ID 检索 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对应于函数签名中的参数名称。在本例中,其类型为 `<path>` string,但您也可以使用其他内置类型,例如 `<path>`int或bool`<path>`,以便限制值。
🥐 让我们通过调用它来确保它能正常工作(记住要将 `<path>` 替换为id你在上一步查看跟踪信息时找到的那个值):
curl http://localhost:4000/url/zr6RmZc4
现在你应该看到这样的画面:
{
"ID": "zr6RmZc4",
"URL": "https://encore.dev"
}
🎉 大功告成!这就是在 Encore 中构建 REST API 和使用 PostgreSQL 数据库的方法。
🚀 部署到云端
现在让我们将所有更改提交到项目仓库并部署我们的应用程序。
🥐 将新文件提交到项目的 Git 仓库,然后运行以下命令触发部署到 Encore 的免费开发云:
$ git add -A .
$ git commit -m 'Initial commit'
$ git push encore
Encore 现在将构建和测试您的应用程序,配置所需的基础设施,并将您的应用程序部署到云端。
触发部署后,您将看到一个 URL,您可以通过该 URL 在 Encore 的云控制面板中查看部署进度。👈
它看起来大概是这样的:https://app.encore.dev/$APP_ID/deploys/...
从那里您还可以查看指标、跟踪信息,并连接您自己的 AWS 或 GCP 账户以用于生产部署。
🎉 干得好——你完成了!
现在,您已经拥有了一个在云端运行的可扩展 Go 后端应用程序的雏形,并配备了 PostgreSQL 数据库。
继续使用这些开源应用模板进行开发。👈
如果您有任何疑问或想分享您的作品,请加入Encore Discord 社区的开发者交流群。👈
文章来源:https://dev.to/encore/building-a-cloud-backend-in-go-using-rest-and-postgresql-147l


