如何部署 Golang 应用程序
Go(Golang)是Google于 2009 年开发的一种编程语言,旨在解决大规模系统开发中的常见问题,如编译速度慢和并发编程需求。
此外,Go 是编译语言,因此比解释型语言更快。
Go 的主要功能之一是支持并发性,允许您通过称为 Goroutines 的轻量级线程同时运行多个任务。
Go 还以其对网络和网络开发的强大支持而著称。Go 的标准库中有 HTTP、TCP/IP 和其他网络协议的软件包,因此可以轻松构建网络应用程序。
在本文中,您将了解 Go 应用程序的优势、限制和部署选项。此外,您还将使用Back4app 的容器化服务免费创建、dockerize 和部署 Go 应用程序。
继续阅读,了解如何部署 Go 应用程序。
Contents
- 1 Golang 在网络开发中的优势
- 2 Golang 的局限性
- 3 Golang 部署选项
- 4 基础设施即服务(IaaS),如 AWS
- 5 平台即服务(PaaS),如 Heroku
- 6 后台即服务(BaaS),如 Back4app
- 7 容器化即服务,如 Back4app Containers
- 8 Golang 部署流程
- 9 使用 Docker 将 Go 应用程序容器化
- 10 在 Back4app 上部署容器
- 11 结论
- 12 常见问题
- 13 什么是 Back4App,为什么它是部署我的应用程序的良好平台?
- 14 我可以使用容器在 Back4app 上部署其他语言(例如 Rust)吗?
- 15 我可以在 Back4App 上扩展我的容器化应用程序吗?
Golang 在网络开发中的优势
Go 越来越受欢迎并非偶然。在您的应用程序中使用 Go,您可以获得和利用许多优势。
高性能
高性能是 Dropbox 和 Uber 等公司使用 Go 语言的主要原因之一。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 上创建账户的步骤。
- 请访问Back4app 网站。
- 点击登陆页面右上角的注册按钮,创建新账户。
- 最后,填写注册表并提交。
创建 Back4app 账户后,登录账户并点击用户界面右上角的 “新建应用程序“按钮。
新应用程序“按钮将带您进入一个页面,在这里您可以选择如何部署应用程序。由于您要部署一个容器,因此请选择 “容器即服务“选项。
接下来,将您的 GitHub 账户连接到 Back4app 账户。您可以选择让 Back4app 访问您账户中所有源代码库的源代码,也可以访问特定的项目目录。
选择要部署的应用程序,在本例中就是本教程中构建的应用程序,然后单击 “选择“。
点击 “选择 “按钮后,您将进入一个页面,在此填写应用程序的相关信息,包括名称、分支、根目录和环境变量。
请务必填写应用程序所需的所有环境变量。填写完所需详细信息后,单击 “创建应用程序“。
如下图所示,单击此按钮即可启动 Go 应用程序的部署流程。
结论
您已学会如何在 Back4app 上部署容器化 Go 应用程序。按照本教程的步骤,您应该可以在 Back4app 上运行 Go API。
将应用程序部署到 Back4app 是简化后端基础架构管理的好方法。Back4App 为管理数据、扩展应用程序和监控其性能提供了强大的工具。对于希望构建优秀应用程序而不是管理服务器的开发人员来说,这是一个极佳的选择。
常见问题
什么是 Back4App,为什么它是部署我的应用程序的良好平台?
Back4App 是一个 BaaS 平台,您可以在其中使用无服务器架构构建、托管和扩展应用程序。Back4app 还提供容器化服务,让您可以管理和部署软件容器,而无需担心管理底层基础设施。
我可以使用容器在 Back4app 上部署其他语言(例如 Rust)吗?
是的,您可以使用 Docker 等容器化技术在 Back4App 上部署 Rust。Back4App 支持 Docker 容器,您可以使用它来部署用各种编程语言(包括 Rust)编写的应用程序。
我可以在 Back4App 上扩展我的容器化应用程序吗?
是的,您可以使用内置的自动扩展功能在 Back4App 上扩展容器化应用程序。自动扩展功能会根据需求自动扩展应用程序的实例数量,从而确保您的应用程序可以处理增加的流量和工作负载。