跳到主要内容

将 GoFiber 应用部署到 Firebase Functions

Github StackBlitz

欢迎阅读将 GoFiber 应用部署到 Firebase Functions 的分步指南。如果您希望利用 Go 快速轻量级 Web 框架 GoFiber 的强大功能,并将您的应用托管在 Firebase 上,那么您来对地方了。在本教程中,我们将逐步讲解如何设置 GoFiber 应用,使其在 Firebase Functions 上无缝运行。

先决条件

  1. 您的机器上已安装 Go。
  2. 已安装 Firebase CLI。
  3. 已创建一个 Firebase 项目。
  4. 已启用 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