openfaas 尝试整合gin记录

原创
03/28 18:09
阅读数 333

  看了几天文档后发现所谓的template 就是把handler目录的文件复制到模板的function 目录以后 ,根据Dockerfile构建镜像,再通过watchdog触发事件(应该是吧),于是开始尝试整合 gin的 template 。

  先在本机写一个简单的应用做测试

main.go

package main

import (
	"io"
	"log"
	"os"
	"os/signal"

	"gitee.com/awol2010ex/openfaas-gin-template/function"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	gin.DisableConsoleColor()
	gin.SetMode(gin.ReleaseMode)
	f, _ := os.Create("gin.log")
	gin.DefaultWriter = io.MultiWriter(f)

	//执行handler方法
	function.Handle(r)
	go func() {
		_ = r.Run(":9033")
	}()

	quit := make(chan os.Signal)
	signal.Notify(quit, os.Interrupt)
	<-quit
	log.Print("end function")
}

handler.go

package function

import (
	"github.com/360EntSecGroup-Skylar/excelize"
	"github.com/gin-gonic/gin"
)

func Handle(r *gin.Engine) {
	//设置路由和方法
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.GET("/excel", func(c *gin.Context) {
		f := excelize.NewFile()
		// 创建一个工作表
		index := f.NewSheet("Sheet2")
		// 设置单元格的值
		f.SetCellValue("Sheet2", "A2", "Hello world.")
		f.SetCellValue("Sheet1", "B2", 100)
		// 设置工作簿的默认工作表
		f.SetActiveSheet(index)

		c.Header("Content-Type", "application/octet-stream")
		c.Header("Content-Disposition", "attachment; filename="+"Workbook.xlsx")
		c.Header("Content-Transfer-Encoding", "binary")
		_ = f.Write(c.Writer)
	})

}

根目录和function目录各写一个 go.mod进行依赖包的隔离(实际写function的时候没理由跑去改template)

function\go.mod

module gitee.com/awol2010ex/openfaas-gin-template/function

go 1.13

require ( 
   github.com/gin-gonic/gin v1.6.2
   github.com/360EntSecGroup-Skylar/excelize v1.4.1
)

./go.mod

module gitee.com/awol2010ex/openfaas-gin-template

go 1.13

require (
	github.com/gin-gonic/gin v1.6.2
)

replace gitee.com/awol2010ex/openfaas-gin-template/function => ./function

测试过可以跑一下,一个ping一个导出excel (测试第三方包)

测试完结后新开一个工程,把刚才的代码复制到template目录当模板,再新建一个目录做demo

Dockerfile根据 go 和node10-express-service的模板结合修改,主要把go模板改成用of-watchdog (好像是可以用 http模式和upstream_url做反向代理),然后补上mode=“http” 和upsteam_url ,改成使用go modules,去掉不想要的vendor部分(主要是不会用)

Dockerfile

FROM openfaas/of-watchdog:0.5.3 as watchdog
FROM golang:1.13-alpine3.11 as builder

# Allows you to add additional packages via build-arg
ARG ADDITIONAL_PACKAGE
ARG CGO_ENABLED=0
ARG GO111MODULE="on"
ARG GOPROXY="https://mirrors.aliyun.com/goproxy/"
ARG GOFLAGS=""

COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
RUN chmod +x /usr/bin/fwatchdog

ENV CGO_ENABLED=0

WORKDIR /go/src/handler
COPY . .

WORKDIR /go/src/handler

RUN CGO_ENABLED=${CGO_ENABLED} GOOS=linux \
    go build --ldflags "-s -w" -a -installsuffix cgo -o handler .

FROM alpine:3.11
RUN apk --no-cache add ca-certificates \
    && addgroup -S app && adduser -S -g app app \
    && mkdir -p /home/app \
    && chown app /home/app

WORKDIR /home/app

COPY --from=builder /usr/bin/fwatchdog         .
COPY --from=builder /go/src/handler/function/  .
COPY --from=builder /go/src/handler/handler    .
RUN chmod +x fwatchdog
RUN chown -R app /home/app

USER app

ENV fprocess="./handler"
ENV cgi_headers="true"
ENV mode="http"
ENV upstream_url="http://127.0.0.1:9033"
EXPOSE 8080

HEALTHCHECK --interval=3s CMD [ -e /tmp/.lock ] || exit 1

CMD ["./fwatchdog"]

template.xml (配置fprocess,可能是吧)

language: openfaas-gin-template
fprocess: ./handler

demo基本照搬function目录

然后是 function 的yml 

gin-demo.yml (用了自己私有registry)

version: 1.0
provider:
  name: openfaas
  gateway: http://127.0.0.1:31112
functions:
  gin-demo:
    lang: openfaas-gin-template
    handler: ./gin-demo
    image: 10.110.36.168:5000/gin-demo:latest

测试一下, faas up -f gin-demo.yml 部署function

测试访问 

花几个小时写,好像还行,先关机去做饭。

代码地址备份

https://gitee.com/awol2010ex/openfaas-gin-template

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部