Golang 如何将Golang WebApp部署到Heroku
Heroku是一个云平台,可让开发人员轻松地构建、部署和扩展Web应用程序,支持多种编程语言。在本文中,我们将探讨如何使用Heroku将Golang WebApp部署到云上。
准备工作
在将Golang WebApp部署到Heroku之前,我们需要进行一些准备工作。首先,我们需要确保本地已经安装了Golang。其次,我们需要一个Heroku账户,并安装Heroku CLI。最后,我们需要创建我们的Golang应用程序。
接下来,让我们看一下如何创建一个简单的Golang WebApp。
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, Heroku")
})
http.ListenAndServe(":8080", nil)
}
在这个示例代码中,我们创建了一个简单的HTTP服务器,用于响应根路径请求。现在,我们可以测试我们的代码,并确保我们的应用程序正常工作。
$ go run main.go
通过这个命令,我们可以启动我们的Web服务器,并访问http://localhost:8080/,我们应该看到一个“Hello,Heroku”的消息。
创建Heroku应用程序
现在,我们已经准备好将我们的Golang应用程序部署到Heroku了。首先,我们需要在Heroku上创建一个新的应用程序。打开终端,输入以下命令:
$ heroku create <app-name>
这个命令会在你的Heroku账户创建一个新的应用程序,并提示你应用程序的网址。应用程序的名称是可选的,如果没有指定则会随机生成。
配置Heroku应用程序
创建Heroku应用程序后,我们需要告诉Heroku如何构建和运行我们的应用程序。我们需要创建一个Procfile文件,告诉Heroku哪个文件是我们的主要服务器代码,并向Heroku指定我们希望使用的端口号。
在你的应用程序根目录下,创建Procfile文件,并将以下内容粘贴到文件中:
web: ./main
在这个示例代码中,我们告诉Heroku我们的应用程序的Web服务是在./main文件中运行的。Heroku将使用Procfile文件来启动我们的应用程序。
在我们的Golang服务器代码中,我们需要编写代码,以从环境变量读取端口号并使用该端口号启动Web服务器。
package main
import (
"fmt"
"net/http"
"os"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, Heroku")
})
addr := ":" + os.Getenv("PORT")
http.ListenAndServe(addr, nil)
}
在这个示例代码中,我们从环境变量中读取端口号,并用它来启动我们的Web服务器。这种方法允许Heroku等云平台自动向我们分配端口号,并使用该端口号来启动我们的应用程序。
将代码推送到Heroku
现在我们已经准备好将我们的应用程序部署到Heroku了。我们可以使用git将我们的代码推送到Heroku。首先,我们需要将我们的代码提交到本地git存储库。
$ git init
$ git add .
$ git commit -m "Initial commit"
一旦我们的代码被提交到本地git存储库,我们就可以将代码推送到Heroku了。
$ git push heroku master
这个命令将代码推送到Heroku的远程git存储库,并通知Heroku开始构建我们的应用程序。我们的应用程序会自动地构建并部署在Heroku上。你可以在Heroku的Web控制台上查看应用程序的构建和部署进度。
测试Heroku应用程序
现在我们已经将我们的应用程序部署到Heroku,我们可以测试它是否工作正常了。使用以下命令,我们可以访问我们的应用程序。
$ heroku open
这个命令将在默认浏览器中打开我们的应用程序网址。我们应该看到一个“Hello,Heroku”的消息。
给Heroku应用程序添加数据库
我们已经成功地将我们的Golang应用程序部署到Heroku上,但是我们的应用程序目前没有数据库支持。让我们花一些时间来向我们的应用程序添加数据库。
在Heroku上添加支持PostgreSQL数据库是很容易的。在本地终端中,输入以下命令:
$ heroku addons:create heroku-postgresql:hobby-dev
这个命令会在我们的Heroku账户创建一个新的PostgreSQL数据库,并自动为我们的应用程序配置数据库连接。
现在,我们需要更新我们的Golang应用程序,以连接我们的PostgreSQL数据库并执行一些基本操作。
package main
import (
"database/sql"
"fmt"
"net/http"
"os"
_ "github.com/lib/pq"
)
const (
host = "<database-host>"
port = "<database-port>"
user = "<database-user>"
password = "<database-password>"
dbname = "<database-name>"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
db, err := sql.Open("postgres", fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=require", host, port, user, password, dbname))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer db.Close()
rows, err := db.Query("SELECT * FROM users")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
defer rows.Close()
for rows.Next() {
var name string
err := rows.Scan(&name)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
fmt.Fprintf(w, "Name: %s\n", name)
}
})
addr := ":" + os.Getenv("PORT")
http.ListenAndServe(addr, nil)
}
在这个示例代码中,我们使用了“github.com/lib/pq”包,并使用sql.Open函数连接我们的PostgreSQL数据库。我们也执行了一个非常简单的查询,并将结果打印到Web服务器响应中。
我们需要更新我们的Heroku应用程序的连接字符串,以反映我们新的PostgreSQL数据库。
$ heroku config:set DATABASE_URL=<database-url>
这个命令将更新我们的应用程序的环境变量,以反映我们的新的PostgreSQL数据库连接字符串。
现在,我们已经成功地将我们的Golang应用程序部署到Heroku,并向我们的应用程序添加了数据库支持。
结论
在本文中,我们探讨了如何将Golang WebApp部署到Heroku。我们看到了如何创建一个简单的Golang WebApp,并向其添加数据库支持。使用Heroku CLI,我们可以轻松地将我们的应用程序部署到Heroku,然后使用Heroku Web控制台跟踪我们的应用程序的进度。