发布于 2026-01-06 0 阅读
0

使用 Go 语言和 REST 和 PostgreSQL 构建云后端 DEV's Worldwide Show and Tell Challenge Presented by Mux: Pitch Your Projects!

使用 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
}


Enter fullscreen mode Exit fullscreen mode

这样就设置好了POST /url端点。请注意函数//encore:api上的注解Shorten,Encore 只需要这个注解就能识别出这是一个 API 端点,它会自动生成公开该端点所需的代码。

🏁 在本地运行您的应用

🥐 看看它是否有效!运行以下命令启动您的应用程序encore run

你应该看看这个:

图片描述

您还会看到本地开发控制面板(localhost:9400)在新标签页中打开。它提供对 Encore API 浏览器、本地跟踪、架构图和服务目录的访问。

本地开发冲刺

🥐 接下来,调用您的端点:

您可以通过开发者控制面板中的 API 浏览器执行此操作,也可以通过终端执行此操作,如下所示:



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


Enter fullscreen mode Exit fullscreen mode

你应该看看这个:



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


Enter fullscreen mode Exit fullscreen mode

🎉 成功了!

只有一个问题……

目前,我们实际上并没有存储 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
);


Enter fullscreen mode Exit fullscreen mode

🥐 接下来,返回文件并修改导入语句,将包url/url.go导入为:encore.dev/storage/sqldb



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

    "encore.dev/storage/sqldb"
)


Enter fullscreen mode Exit fullscreen mode

🥐 然后,让我们告诉 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",
})


Enter fullscreen mode Exit fullscreen mode

🥐 现在,为了将数据插入数据库,让我们创建一个辅助函数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
}


Enter fullscreen mode Exit fullscreen mode

🥐 最后,我们可以更新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
}


Enter fullscreen mode Exit fullscreen mode

🚨 运行应用程序前,请确保已安装并运行Docker。(本地运行带有数据库的 Encore 应用程序需要 Docker。)

🥐 接下来,再次启动应用程序encore run,Encore 会自动设置您的数据库。

🥐 现在我们再次调用 API:



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


Enter fullscreen mode Exit fullscreen mode

🥐 最后,让我们验证一下它是否已保存到数据库中。

通过查看 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
}


Enter fullscreen mode Exit fullscreen mode

Encore 使用path=/url/:id语法来表示带参数的路径。名称id对应于函数签名中的参数名称。在本例中,其类型为 `<path>` string,但您也可以使用其他内置类型,例如 `<path>`intbool`<path>`,以便限制值。

🥐 让我们通过调用它来确保它能正常工作(记住要将 `<path>` 替换为id你在上一步查看跟踪信息时找到的那个值):



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


Enter fullscreen mode Exit fullscreen mode

现在你应该看到这样的画面:



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


Enter fullscreen mode Exit fullscreen mode

🎉 大功告成!这就是在 Encore 中构建 REST API 和使用 PostgreSQL 数据库的方法。

🚀 部署到云端

现在让我们将所有更改提交到项目仓库并部署我们的应用程序。

🥐 将新文件提交到项目的 Git 仓库,然后运行以下命令触发部署到 Encore 的免费开发云:



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


Enter fullscreen mode Exit fullscreen mode

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