当前位置: 首页 > 工具软件 > OpenFaaS > 使用案例 >

OpenFaaS开发后端curd接口

公孙宸
2023-12-01

OpenFaaS系列文章:

WSL中OpenFaaS开发环境配置
OpenFaaS部署前端
OpenFaaS开发后端curd接口

创建函数

mkdir openfaas-restful-demo
cd openfaas-restful-demo

```bash
faas-cli template store pull golang-middleware

faas-cli new --lang golang-middleware record

数据库

使用arkade工具可以方便地安装k8s app,之前也可以使用arkade安装openfaas,此处使用ark来安装postgresql。

根据官方文档提供的命令

安装

curl -sLS https://get.arkade.dev | sudo sh

查看postgesql app的信息

arkade info postgresql

安装

arkade install postgresql

可以查看运行数据库的pod,默认位于default命名空间中

kubectl get pods
NAME                      READY   STATUS    RESTARTS      AGE
postgresql-postgresql-0   1/1     Running   3 (38m ago)   23h

安装成功后会输出一些有用的信息

  • 查看数据库密码
To get the password for "postgres" run:

    export POSTGRES_PASSWORD=$(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)

可以根据以下命令查看密码

echo $(kubectl get secret --namespace default postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
  • 查看数据库地址
    以下是集群内部连接地址
PostgreSQL can be accessed via port 5432 on the following DNS name from within your cluster:

        postgresql.default.svc.cluster.local - Read/Write connection

如果需要在集群外部连接,则使用localhost地址,还需要将5432端口转发出去

kubectl port-forward --namespace default svc/postgresql 5432:5432

使用lsof命令查看可以发现5432端口存在TCP监听进程

lsof -i:5432
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
kubectl 4743 lbaf23    8u  IPv4 171741      0t0  TCP localhost:postgresql (LISTEN)
kubectl 4743 lbaf23    9u  IPv6 171745      0t0  TCP ip6-localhost:postgresql (LISTEN)

可以根据用户名postgre,密码为先前输出的密码,在localhost:5432地址连接数据库

以上信息可以根据

arkade info postgresql

命令查看

golang连接sql

可以参考一个基于golang-middleware模板创建的前后端项目leaderboard-app

以下是摘自官方文档的一段话

Note: The OpenFaaS philosophy is that environment variables should be used for non-confidential configuration values only, and not used to inject secrets.

因此一些敏感信息如数据库密码等不应该使用环境变量来注入,而应该使用faas提供的secrets功能

secret

新建openfaas-restful-demo-db-password.txt文件,写入密码

使用faas-cli保存密码

faas-cli secret create secret-api-key \
  --from-file=openfaas-restful-demo-db-password.txt

查看密码

faas-cli secret list

record.yml中写明密码

version: 1.0
provider:
  name: openfaas
  gateway: http://localhost:31112
functions:
  record:
    lang: golang-middleware
    handler: ./record
    image: lbaf23/record:latest
    build_args:
      GO111MODULE: on
    environment:
      postgres_db: demo
      postgres_port: 5432
      postgres_host: postgresql.default.svc.cluster.local       # 集群内部连接地址
      postgres_user: postgres
      postgres_sslmode: disable                                 # 关闭ssl模式
    secrets:
      - openfaas-restful-demo-db-password                       # 关联密码

在init()函数中初始化一个数据库连接,是对于所有函数的副本共有的

package function

import (
	"database/sql"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"strings"
	"time"

	_ "github.com/lib/pq"
)

var db *sql.DB     # 实际上是一个连接池,可以设置最小和最大连接数量

func init() {
	var err error

	secretfile, _ := ioutil.ReadFile("/var/openfaas/secrets/openfaas-restful-demo-db-password")
	password := strings.Split(string(secretfile), "\n")[0]

	user := os.Getenv("postgres_user")
	host := os.Getenv("postgres_host")
	dbName := os.Getenv("postgres_db")
	port := os.Getenv("postgres_port")
	sslmode := os.Getenv("postgres_sslmode")

	connStr := "postgres://" + user + ":" + password + "@" +
		host + ":" + port + "/" + dbName + "?sslmode=" + sslmode

	fmt.Println(connStr)

	db, err = sql.Open("postgres", connStr)
	if err != nil {
		panic(err.Error())
	}

	err = db.Ping()

	if err != nil {
		panic(err.Error())
	}
}

包管理

leaderboard-app项目采用vendor进行包管理,但是由于近年来更加流行mod管理工具,本文采用go mod进行包管理。

vendor和mod

  • vendor
    不区分包的版本,开发和部署的包版本可能会不一样,可能会出问题

  • mod
    从go1.13开始默认开启go mod模式,管理更加清晰

进入创建的函数目录,创建go mod

cd record
go mod init function
go mod tidy

同时需要添加faas的打包参数,编辑根目录下record.yml文件,添加build_args

version: 1.0
provider:
  name: openfaas
  gateway: http://localhost:31112
functions:
  record:
    lang: golang-middleware
    handler: ./record
    image: lbaf23/record:latest
    build_args:
      GO111MODULE: on             # mod模式
    environment:
      postgres_db: demo
      postgres_port: 5432
      postgres_host: postgresql.default.svc.cluster.local       # 集群内部连接地址
      postgres_user: postgres
      postgres_sslmode: disable                                 # 关闭ssl模式
    secrets:
      - openfaas-restful-demo-db-password                       # 关联密码

如果使用vscode编辑代码,gopls可能会报错,因为gopls目前默认是不支持一个项目中有多个go module的,可以在设置里面编辑settings.json文件,添加

"gopls": {
    "build.experimentalWorkspaceModule": true
}

或者进入function的目录再打开vscode

cd record
code .

部署

faas up -f record.yml

本文代码地址:https://github.com/lbaf23/openfaas-restful-demo

发现faas-cli build函数的时候似乎不会保存docker依赖镜像到本地,每次build都会从docker hub拉取镜像,导致构建时间较长,因此可以手动将镜像pull到本地加快构建速度

以本项目为例,打开template/golang-middleware/Dockerfile文件,发现依赖镜像有以下三个,将镜像拉取到本地

docker pull ghcr.io/openfaas/of-watchdog:0.9.2
docker pull golang:1.16-alpine3.14
docker pull alpine:3.14

然后进行faas build,可以发现构建速度极大提高

 类似资料: