如何部署 Golang 应用程序

How to Deploy a Golang App

Go(Golang)是Google于 2009 年开发的一种编程语言,旨在解决大规模系统开发中的常见问题,如编译速度慢和并发编程需求。

此外,Go 是编译语言,因此比解释型语言更快。

Go 的主要功能之一是支持并发性,允许您通过称为 Goroutines 的轻量级线程同时运行多个任务。

Go 还以其对网络和网络开发的强大支持而著称。Go 的标准库中有 HTTP、TCP/IP 和其他网络协议包,因此可以轻松构建网络应用程序。

在本文中,您将了解 Go 应用程序的优势、限制和部署选项。此外,您还将使用Back4app 的容器化服务免费创建、dockerize 和部署 Go 应用程序。

继续阅读,了解如何部署 Go 应用程序。

Golang 在网络开发中的优势

Go 越来越受欢迎并非偶然。在您的应用程序中使用 Go,您可以获得和利用许多优势。

高性能

高性能是 Dropbox 和 Uber 等公司使用 Go 语言的主要原因之一。Go 语言专为快速执行而设计,因此是需要高性能的应用程序的理想选择。

Go 采用的垃圾回收器可减少内存管理开销,从而加快执行速度。此外,您还可以使用 Go 内置的并发支持来提高应用程序的性能。

可扩展性

Go 是构建可扩展应用程序的绝佳选择。利用并发功能,您可以创建可处理多项任务的程序,这使得 Go 适用于处理需要快速扩展的高流量负载的应用程序。

Go 对分布式系统也有出色的支持,是构建需要在多台机器上运行的大型应用程序的理想选择。

围棋久经考验

许多流行的公司都使用 Go 构建大型应用程序,包括 Google、Uber 和 Dropbox。这意味着 Go 经过了实战检验,在为大型用户群构建复杂的应用程序时是可靠和稳定的。

Go 非常注重向后兼容性,即使 Golang 语言不断发展,用 Golang 编写的应用程序也能继续运行。

强大的社区支持

Go 自发布以来,一直是采用率增长最快的语言之一,并因此创建了一个庞大而活跃的社区。Go 拥有一个庞大而活跃的社区,这意味着您可以轻松找到资源和问题解答。

Go 中有许多开源库和工具,可以用来加快开发时间。Kubernetes、Docker 和 Hugo 等流行的构建工具在其 CLI 工具中使用了 Cobra 等软件包。

Golang 的局限性

虽然 Golang 是一种高性能、可扩展的编程语言,但 Go 也有其局限性,您在使用该语言开发之前应加以考虑。

增加某些任务的复杂性

Go 可能易学易读,但特定任务使用其他语言比使用 Go 更容易。用 Go 构建交互式用户界面可能具有挑战性,因为 Go 需要一个内置的图形用户界面工具包,而第三方软件包会给项目带来复杂性。

Go 的并发模型可能对初学者构成挑战

对于初学者来说,理解和有效使用 Go 的并发模型可能具有挑战性。Go 使用 goroutines 和通道来实现并发,它们是功能强大的工具,但要掌握它们却很有难度。您必须学会有效使用通道,以避免死锁或竞赛条件。

Go 的并发模型还要求你以不同的方式思考代码结构和设计。如果你习惯于顺序编程模型,你会发现这很困难。

与其他语言相比,图书馆生态系统不够成熟

虽然 Golang 的标准库非常全面,并拥有构建 Go 应用程序所需的大部分功能,但与 Java 或 Python 等语言的库相比,它还不够成熟。

Golang 是一种相对较新的编程语言,一些常用的库还没有面世。这可能会对特定项目造成限制,尤其是那些需要更专业功能的项目。

此外,与其他语言相比,Golang 的第三方库并不普及,您可能需要自己实现某些功能,这可能会很耗时。

Golang 部署选项

在 Go 中构建应用程序后,您有几种部署选项,每种选项都各有利弊。

您有多种选择,包括 AWS 等 IaaS 服务、Heroku 等 PaaS 服务、Back4app 和 Google Firebase 等 BaaS 服务以及 Back4App Containers 等 CaaS 服务。

基础设施即服务(IaaS),如 AWS

Amazon Web Services (AWS)等基础设施即服务(IaaS)提供商提供在云上部署和管理自有虚拟机的功能。

通过 AWS,您可以使用 Elastic Compute Cloud (EC2) 等服务将 Golang 应用程序部署到运行 Linux 或 Windows 的虚拟机上。您还可以使用 Elastic Container Service (ECS) 等服务在容器中部署应用程序。

使用 AWS 等 IaaS 服务的一个优势是,您可以完全控制底层基础设施。您可以对虚拟机进行配置,以满足您的特定要求。但是,您需要负责管理和维护虚拟机,这可能是一项技术性很强的工作。

其他 IaaS 平台包括

  • Linode
  • Microsoft Azure
  • Rackspace
  • Amazon Web Services (AWS)
  • DigitalOcean
  • Google Compute Engine (GCE)

平台即服务(PaaS),如 Heroku

像 Heroku 这样的平台即服务(PaaS)提供商为部署 Golang 应用程序提供了一个平台,而不会对底层基础设施造成影响。

Heroku 提供简单的命令行界面,只需几条命令就能部署应用程序。Heroku 还支持自动扩展和负载平衡,让您轻松应对应用程序的高流量。

使用 Heroku 这样的 PaaS 服务的优势在于,您可以专注于开发应用程序,而不必担心基础设施。Heroku 会处理所有的基础设施管理和维护工作,为您节省时间和资源。

不过,这也意味着您对基础设施的控制能力较弱,必须在平台的限制范围内工作。

其他 PaaS 提供商包括

  • Render
  • AWS Elastic Beanstalk
  • Microsoft Azure App Service
  • DigitalOcean App Platform
  • The Fly Platform

后台即服务(BaaS),如 Back4app

后端即服务(BaaS)提供商(如Google Firebase 和 Back4app)可为您的应用程序提供完整的后端解决方案,包括数据库、身份验证和托管。Firebase 支持包括 Golang 在内的多种编程语言,并提供简单的应用程序接口(API),您可以用它来访问其服务。

使用像 Firebase 这样的 BaaS 服务的一个优势是,您可以快速、轻松地为您的应用程序建立后台,而无需管理任何基础设施。Firebase 提供了一系列功能和服务;但是,您需要对基础设施进行更多控制。

其他 BaaS 平台包括

  • AWS Amplify
  • Cloudkit
  • Backendless
  • Back4App
  • Pocketbase

容器化即服务,如 Back4app Containers

容器化在部署应用程序方面很受欢迎。通过容器化,您可以将应用程序及其依赖项打包到一个容器中,然后快速部署到任何支持容器技术的平台上。

Back4App 是容器化服务提供商,您可以用它在容器中部署和管理 Golang 应用程序。

使用 Back4App 这样的容器化服务提供商的优势之一是,您可以将应用程序部署到任何支持容器的平台,而无需担心底层基础设施。

CaaS 提供商会处理所有的容器管理和维护工作,为您节省时间和资源。不过,在无法访问基础设施的情况下,您可能不得不在容器化平台的限制范围内工作。

其他 CaaS 平台包括

  • AWS Container Service
  • Azure Container Service
  • Docker Enterprise
  • Google Container Engine
  • IBM Kubernetes Service
  • Oracle Container Service

Golang 部署流程

在此,您将学习如何将 Golang 应用程序部署到 Back4app 的 CaaS 平台

什么是 Back4app?

Back4app 是一种云服务,您可以用它为您的移动和网络应用程序创建和部署后端服务。

您可以使用 Back4app 的 CaaS 功能在 Back4app 的后端服务器上部署和运行自定义容器。您可以使用容器映像为应用程序添加自定义逻辑,而无需管理服务器基础设施。

在本节中,您将学习如何用 Go 构建简单的 CRUD RESTful API、将 Go 程序容器化并在 Back4app 上部署容器。

设置开发环境

下载页面将 Go 安装到计算机后,就可以为 Go 应用程序创建一个新目录并初始化一个新的 Go 项目。

运行下面的命令为项目创建一个新目录。

mkdir deployAPI && cd deployAPI

运行mod init命令,使用 Go 工具在当前工作目录下初始化一个新项目。

就像这样

go mod init

您将使用Gorilla Mux 软件包构建 RESTful API。

运行下面的命令,将 Gorilla Mux 软件包安装为项目的依赖项。

go get -u github.com/gorilla/mux

下一步是构建 RESTful API。使用 Gorilla Mux 构建 RESTful API 的第一步是在 Go 文件中导入必要的包。

以下是项目所需的进口商品清单。

import (
	"encoding/json"
	"log"
	"net/http"
	"strconv"

	"github.com/gorilla/mux"
)

列出导入内容后,您需要为应用程序建立一个数据库。为简单起见,我们将使用地图来存储和检索数据。

您可以像这样将地图添加到应用程序中:

var users = map[int]string{}

由于地图是空的,因此需要通过 POST 请求输入数据。

POST 请求处理程序函数

您的 POST 请求应从客户端接收数据、解析数据并将其保存到地图数据存储区。

在应用程序中添加代码块,以实现 POST 请求处理程序:

func createUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	var data map[string]string

	err = json.NewDecoder(r.Body).Decode(&data)
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	users[id] = data["name"]

	w.WriteHeader(http.StatusCreated)
}

createUserHandler处理程序函数从客户端接收数据(JSON),解析 JSON 并将数据保存到地图中。当处理程序成功将数据添加到映射中时,它会向客户端写入StatusCreated成功代码。

GET 请求

您将通过 GET 请求从数据存储区读取数据。您的 GET 请求处理函数将从客户端获取一个 ID,然后搜索并将数据返回给客户端。

在应用程序中添加代码块,以实现 GET 请求处理程序:

func readUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	name, ok := users[id]
	if !ok {
		w.WriteHeader(http.StatusNotFound)
		return
	}

	data := map[string]string{"name": name}

	jsonData, err := json.Marshal(data)
	if err != nil {
		w.WriteHeader(http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusOK)
	w.Write(jsonData)
}

readUserHandler函数使用mux软件包的Vars函数获取 ID,并在地图上搜索数据,然后将数据以 JSON 格式返回给客户端,同时返回一个StatusOk成功代码。

PUT 请求处理程序函数

您将通过 PUT 请求更新数据存储中的数据。您的 PUT 请求处理程序将接受 ID 和用于更新过程的 JSON 字段。

func updateUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	var data map[string]string

	err = json.NewDecoder(r.Body).Decode(&data)
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	users[id] = data["name"]

	w.WriteHeader(http.StatusOK)
}

updateUserHandler函数用vars变量接收ID,解码请求正文中的 JSON,并用请求正文中的 JSON 数据更新字段或 ID。

DELETE 请求处理程序函数

您的 DELETE 请求处理程序函数将接收请求中的字段 ID,并从数据存储中删除该字段。

在应用程序中添加代码块,以实现 DELETE 请求处理程序:

func deleteUserHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	id, err := strconv.Atoi(vars["id"])
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	delete(users, id)

	w.WriteHeader(http.StatusOK)
}

deleteUserHandler函数使用delete函数删除字段,该函数接收地图名称和 ID,并向客户端返回StatusOk代码。

将处理程序函数安装到路由上

定义应用程序的端点后,您必须将处理函数分配给路由。路由是应用程序接口的公共接口。

func main() {
	r := mux.NewRouter()

	r.HandleFunc("/users/{id}", createUserHandler).Methods(http.MethodPost)
	r.HandleFunc("/users/{id}", readUserHandler).Methods(http.MethodGet)
	r.HandleFunc("/users/{id}", updateUserHandler).Methods(http.MethodPut)
	r.HandleFunc("/users/{id}", deleteUserHandler).Methods(http.MethodDelete)

	log.Fatal(http.ListenAndServe(":8080", r))
}

函数中,r是一个新的 mux 路由器实例,HandleFunc方法接收一个路由和一个处理函数。Methods函数指定了路由上的 HTTP 方法。

使用 Docker 将 Go 应用程序容器化

Docker是最流行的容器化技术之一。Docker 是用 Go 构建的,你可以用 Docker 将 Go 应用程序容器化,以实现可移植性。

你必须创建一个新的 dockerfile,在其中指定构建说明。

运行下面的命令,在项目的工作目录中创建一个 Dockerfile。

touch Dockerfile

打开 Dockerfile 并粘贴这些构建说明,用 Docker 将 Go 应用程序容器化。

# Use an official Golang runtime as a parent image
FROM golang:latest

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Download and install any required dependencies
RUN go mod download

# Build the Go app
RUN go build -o main .

# Expose port 8080 for incoming traffic
EXPOSE 8080

# Define the command to run the app when the container starts
CMD ["/app/main"]

dockerfile 中的构建说明会指定项目的 Go 版本、工作目录、应用程序文件和 dockerfile 的构建说明。

下面是 Dockerfile 的详细信息:

  • 该文件以FROM golang: latest开头,指定要使用最新版本的官方 Golang 镜像作为 Docker 容器的基础镜像。
  • WORKDIR /app行将容器的工作目录设置为/app目录。
  • COPY ./将当前目录的内容复制到容器的/app目录中。
  • RUN go mod 下载会下载应用程序所需的依赖项。
  • RUN go build -o main .编译 Go 应用程序,并在/app目录下创建名为main的可执行文件。
  • EXPOSE 8080这一行告诉 Docker 公开 8080 端口,即 Go 应用程序监听接收请求的端口。
  • CMD ["/app/main"]行指定了容器启动时要运行的命令(在本例中是可执行文件)。

运行 dockerfile 时,Docker 会构建应用程序镜像,并在8080 端口公开应用程序。

该命令将启动容器,并将主机上的8080端口映射到容器中的8080端口,这样就可以访问[http://localhost:8080](http://localhost:8080)上的 API。

在 Back4app 上部署容器

要部署容器,您需要在 Back4app 上创建一个账户(如果您还没有账户)。

以下是在 Back4app 上创建账户的步骤。

  1. 请访问Back4app 网站
  2. 点击登陆页面右上角的注册按钮,创建新账户。
  3. 最后,填写注册表并提交。

创建 Back4app 账户后,登录账户并点击用户界面右上角的 “新建应用程序“按钮。

新应用程序“按钮将带您进入一个页面,在这里您可以选择如何部署应用程序。由于您要部署一个容器,因此请选择 “容器即服务“选项。

在 Back4app 上创建新的 CaaS 应用程序

接下来,将您的 GitHub 账户连接到 Back4app 账户。您可以选择让 Back4app 访问您账户中所有源代码库的源代码,也可以访问特定的项目目录。

Back4app 容器--导入 GitHub 存储库。

选择要部署的应用程序,在本例中就是本教程中构建的应用程序,然后单击 “选择“。

Back4app 容器- 选择一个 git 仓库

点击 “选择 “按钮后,您将进入一个页面,在此填写应用程序的相关信息,包括名称、分支、根目录和环境变量。

请务必填写应用程序所需的所有环境变量。填写完所需详细信息后,单击 “创建应用程序“。

如下图所示,单击此按钮即可启动 Go 应用程序的部署流程。

Back4app 容器部署页面

结论

您已学会如何在 Back4app 上部署容器化 Go 应用程序。按照本教程的步骤,您应该可以在 Back4app 上运行 Go API。

将应用程序部署到 Back4app 是简化后端基础架构管理的好方法。Back4App 为管理数据、扩展应用程序和监控其性能提供了强大的工具。对于希望构建优秀应用程序而不是管理服务器的开发人员来说,这是一个极佳的选择。

常见问题

什麼是 Back4App,為什麼它是部署我的應用程式的良好平台?

Back4App 是一個 BaaS 平台,您可以在其中使用無伺服器架構建置、託管和擴展您的應用程式。 Back4app 還提供容器化服務,讓您可以管理和部署軟體容器,而不必擔心管理底層基礎架構。

我可以使用容器在 Back4app 上部署其他語言(例如 Rust)嗎?

是的,您可以使用 Docker 等容器化技術在 Back4App 上部署 Rust。 Back4App 支援 Docker 容器,您可以使用它來部署以各種程式語言(包括 Rust)編寫的應用程式。

我可以在 Back4App 上擴展我的容器化應用程式嗎?

是的,您可以使用內建的自動擴充功能在 Back4App 上擴充您的容器化應用程式。自動擴展功能會根據需求自動擴展應用程式的執行個體數量,確保您的應用程式可以處理增加的流量和工作負載。


Leave a reply

Your email address will not be published.