将 GoFiber 应用部署到 Firebase Functions
欢迎阅读将 GoFiber 应用部署到 Firebase Functions 的分步指南。如果您希望利用 Go 快速轻量级 Web 框架 GoFiber 的强大功能,并将您的应用托管在 Firebase 上,那么您来对地方了。在本教程中,我们将逐步讲解如何设置 GoFiber 应用,使其在 Firebase Functions 上无缝运行。
先决条件
- 您的机器上已安装 Go。
- 已安装 Firebase CLI。
- 已创建一个 Firebase 项目。
- 已启用 Firestore 和 Cloud Functions。
创建一个 GoFiber 应用
首先初始化您的 GoFiber 应用。在您的终端中使用以下命令
go mod init example.com/GofiberFirebaseBoilerplate
服务器配置
创建一个服务器文件 (src/server.go)
,其中包含一个 CreateServer
函数,用于设置您的 GoFiber 服务器。
package src
import (
"example.com/GofiberFirebaseBoilerplate/src/routes"
"github.com/gofiber/fiber/v2"
)
func CreateServer() *fiber.App {
version := "v1.0.0"
app := fiber.New(fiber.Config{
ServerHeader: "Gofiber Firebase Boilerplate",
AppName: "Gofiber Firebase Boilerplate " + version,
})
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Gofiber Firebase Boilerplate " + version)
})
routes.New().Setup(app)
return app
}
路由配置
您的 GoFiber 应用初始化完成后,接下来我们将深入了解如何设置和配置路由。本节对于定义应用如何处理传入请求至关重要。打开 src/routes/routes.go
文件来管理您的路由。
package routes
import (
"example.com/GofiberFirebaseBoilerplate/src/database"
"example.com/GofiberFirebaseBoilerplate/src/repositories"
"github.com/gofiber/fiber/v2"
)
type Routes struct {
mainRepository *repositories.MainRepository
}
func New() *Routes {
db := database.NewConnection()
return &Routes{mainRepository: &repositories.MainRepository{DB: db}}
}
func (r *Routes) Setup(app *fiber.App) {
app.Post("message", r.insertMessage)
}
func (r *Routes) insertMessage(c *fiber.Ctx) error {
return c.SendString("ok")
}
数据库配置
在 src/database/database.go
文件中配置您的 Firestore 数据库连接。请确保将占位符凭据替换为您的 Firebase 项目的实际凭据。
package database
import (
"context"
"encoding/json"
"log"
"cloud.google.com/go/firestore"
firebase "firebase.google.com/go"
"google.golang.org/api/option"
)
type Config struct {
Host string
Port string
Password string
User string
DBName string
SSLMode string
}
func NewConnection() *firestore.Client {
ctx := context.Background()
sa := option.WithCredentialsJSON(credentials())
app, err := firebase.NewApp(ctx, nil, sa)
if err != nil {
log.Fatalf("functions.init: NewApp %v\n", err)
}
db, err := app.Firestore(ctx)
if err != nil {
log.Fatalf("functions.init: Database init : %v\n", err)
}
return db
}
func credentials() []byte {
// TODO: Replace with your Credentials
data := map[string]interface{}{
"type": "",
"project_id": "",
"private_key_id": "",
"private_key": "",
"client_email": "",
"client_id": "",
"auth_uri": "",
"token_uri": "",
"auth_provider_x509_cert_url": "",
"client_x509_cert_url": "",
"universe_domain": "",
}
bytes, err := json.Marshal(data)
if err != nil {
panic(err)
}
return bytes
}
Repository 模式
在 src/repositories/main.repository.go
文件中实现 repository 模式,以便与 Firestore 交互。此文件包含一个将消息插入数据库的示例。
package repositories
import (
"context"
"cloud.google.com/go/firestore"
"example.com/GofiberFirebaseBoilerplate/src/models"
"github.com/google/uuid"
)
type MainRepository struct {
DB *firestore.Client
}
func (r *MainRepository) InsertMessage(body *models.MessageInputBody) error {
id := uuid.New().String()
_, err := r.DB.Collection("messages").Doc(id).Set(context.Background(), body)
return err
}
模型定义
在 src/models/message_input_body.go 中定义一个消息输入模型,以构建您将要处理的数据结构。
package models
type MessageInputBody struct {
From string `json:"from"`
To string `json:"to"`
Message string `json:"message"`
}
云集成函数
在 functions.go
中,将 Google Cloud Function 请求转换为 Fiber 并将其路由到您的应用。此文件包含有助于集成 Google Cloud Functions 和 GoFiber 的函数。
package app
import (
"net/http"
"github.com/gofiber/fiber/v2"
adaptor "github.com/gofiber/fiber/v2/middleware/adaptor"
)
// CloudFunctionRouteToFiber route cloud function http.Handler to *fiber.App
// Internally, google calls the function with the /execute base URL
func CloudFunctionRouteToFiber(fiberApp *fiber.App, w http.ResponseWriter, r *http.Request) {
adaptor.FiberApp(fiberApp)(w, r)
}
主应用入口
在 main.go
中,初始化您的 GoFiber 应用并启动服务器。此文件还包含一个用于部署的导出 Cloud Function 处理程序。
package app
import (
"fmt"
"net/http"
"strings"
"example.com/GofiberFirebaseBoilerplate/src"
"github.com/gofiber/fiber/v2"
)
var app *fiber.App
func init() {
app = src.CreateServer()
}
// Start start Fiber app with normal interface
func Start(addr string) error {
if -1 == strings.IndexByte(addr, ':') {
addr = ":" + addr
}
return app.Listen(addr)
}
// ServerFunction Exported http.HandlerFunc to be deployed to as a Cloud Function
func ServerFunction(w http.ResponseWriter, r *http.Request) {
CloudFunctionRouteToFiber(app, w, r)
}
开发
对于本地开发,请使用 cmd/main.go
文件。如果您喜欢热重载,则包含 .air.toml
配置文件以便使用 Air。
cmd/main.go
package main
import (
"log"
"os"
app "example.com/GofiberFirebaseBoilerplate"
)
func main() {
port := "3001"
if envPort := os.Getenv("PORT"); envPort != "" {
port = envPort
}
if err := app.Start(port); err != nil {
log.Fatalf("app.Start: %v\n", err)
}
}
.air.toml
root = "."
testdata_dir = "testdata"
tmp_dir = "tmp"
[build]
args_bin = []
bin = "./tmp/main"
cmd = "go build -o ./tmp/main ./cmd"
delay = 1000
exclude_dir = ["assets", "tmp", "vendor", "testdata"]
exclude_file = []
exclude_regex = ["_test.go"]
exclude_unchanged = false
follow_symlink = false
full_bin = ""
include_dir = []
include_ext = ["go", "tpl", "tmpl", "html"]
include_file = []
kill_delay = "0s"
log = "build-errors.log"
poll = false
poll_interval = 0
post_cmd = []
pre_cmd = []
rerun = false
rerun_delay = 500
send_interrupt = false
stop_on_error = false
[color]
app = ""
build = "yellow"
main = "magenta"
runner = "green"
watcher = "cyan"
[log]
main_only = false
time = false
[misc]
clean_on_exit = false
[screen]
clear_on_rebuild = false
keep_scroll = true
部署
使用以下命令部署您的 Cloud Function,将 <YourProjectID>
替换为您的 Firebase 项目 ID
gcloud config set project <YourProjectID>
gcloud functions deploy MyCloudFunction --runtime go120 --trigger-http
总结
恭喜!您已成功在 Firebase Functions 上配置并部署了 GoFiber 应用。这种强大的组合使您能够构建快速高效的无服务器应用。进一步尝试 GoFiber 的特性和 Firebase 集成,以释放无服务器架构的全部潜力。祝您编程愉快!
Medium 文章
https://medium.com/@kmltrk07/how-to-deploy-gofiber-app-to-firebase-functions-8d4d537a4464