前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用腾讯云 Serverless 开发公众号后端

使用腾讯云 Serverless 开发公众号后端

原创
作者头像
陈少文
修改2021-08-30 10:42:10
3.3K0
修改2021-08-30 10:42:10
举报
文章被收录于专栏:陈少文陈少文

1. Serverless 的使用场景

如果说云计算是希望资源能够像自来水一样,隋开随用、随关随停,那么 Serverless 就是云计算的未来方向之一。相较于 IaaS、Kubernetes 这些运行时,Serverless 提供更细粒度资源控制的同时,还能提供更大的弹性,允许开发者快速交付功能。

常见的 Serverless 场景有聚合服务、构建轻量服务、海量按需付费,能够覆盖大部分的需求。本文将以腾讯云的 Serverless 服务,构建一个微信公众号的服务后端。

2. 在腾讯云 Serverless 上创建函数服务

目前腾讯云 Serverless 主要提供两种类型:

  • 函数服务,提供一些函数执行的服务
  • Serverless 应用,提供完整应用的运行时

Serverless 应用类型目前并没有提供编译型应用,也没有 Gin 框架,主要是 PHP、Python。但函数服务中,Serverless 提供了一种镜像类型,可以直接运行镜像中的文件。因此,可以提前构建好应用的镜像,再借助函数服务创建应用服务。

2.1 初始化镜像

  • 创建命名空间

打开链接 https://console.cloud.tencent.com/tke2/registry/user/space , 新建一个命名空间,这里我使用的是 shaowenchen

  • 创建一个镜像

点击【新建】,创建一个空的镜像,用于创建函数服务。这里需要记住镜像地址,ccr.ccs.tencentyun.com/shaowenchen/xxx

2.2 创建函数服务

打开链接 https://console.cloud.tencent.com/scf/list-create?rid=1&ns=default&createType=empty

按照上图,依次按照如下步骤操作:

  1. 选择自定义创建
  2. 选择 Web 函数
  3. 选择镜像部署,点击选择镜像, 选中上一步创建的镜像
  4. 完善 Command, 填入镜像中应用服务的启动命令 /app

最后点击 【完成】 创建服务,但是提供的网关地址 https://service-xxx.gz.apigw.tencentcs.com/release/ 并不能打开,因为镜像还是空的。下一步,我们创建项目,推送镜像。

3. 在 Github 上创建后端项目

3.1 使用 Gin 初始化项目

使用 Gin 创建一个后端项目,下面是 main.go 文件。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

package main import ( "fmt" "net/http" "github.com/gin-gonic/gin" "github.com/yaotian/gowechat" "github.com/yaotian/gowechat/mp/message" "github.com/yaotian/gowechat/wxcontext" ) func main() { router := gin.Default() router.Any("/mp/", hello) router.Any("/", func(c *gin.Context) { c.String(http.StatusOK, "OK") }) router.Run(":9000") } func hello(c *gin.Context) { //配置微信参数 config := wxcontext.Config{ AppID: "从公众号管理页获取", AppSecret: "从公众号管理页获取", Token: "从公众号管理页获取", EncodingAESKey: "从公众号管理页获取", } wc := gowechat.NewWechat(config) mp, err := wc.MpMgr() if err != nil { return } // 传入request和responseWriter msgHandler := mp.GetMsgHandler(c.Request, c.Writer) //设置接收消息的处理方法 msgHandler.SetHandleMessageFunc(func(msg message.MixMessage) *message.Reply { //回复消息:演示回复用户发送的消息 text := message.NewText(msg.Content) text.Content = "I get a msg : " + text.Content return &message.Reply{message.MsgTypeText, text} }) //处理消息接收以及回复 err = msgHandler.Handle() if err != nil { fmt.Println(err) return } }

代码实现的效果是,响应用户的输入 xxx,返回消息 I get a msg : xxx, 服务端配置在 /mp/ 路径上。

需要特别注意的是端口需要监听 9000,否则 Serverless 无法响应

3.2 添加 Dockerfile

Dockerfile 内容如下

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

ARG GO_VERSION=1.16 FROM golang:${GO_VERSION}-alpine AS builder RUN apk update && apk add alpine-sdk git && rm -rf /var/cache/apk/* RUN mkdir -p /builder WORKDIR /builder COPY go.mod . COPY go.sum . RUN go mod download COPY . . RUN go build -o ./app ./main.go FROM alpine:latest RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* WORKDIR / COPY --from=builder /builder/app . EXPOSE 9000

分阶段构建, 将代码编译到 alpine:latest 镜像中, 可执行文件为 /app, 暴露的端口为 9000。

3.3 添加 Github Action

为了方便持续集成,在仓库中新增文件 .github/workflows/build.yaml , 内容如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

name: Go on: push: branches: - "main" jobs: build: name: Build runs-on: ubuntu-latest env: GO111MODULE: on steps: - name: Check out code into the Go module directory uses: actions/checkout@v2 - name: Set up Go 1.16 uses: actions/setup-go@v2 with: go-version: 1.16 - name: Login Resigtry if: github.event_name == 'push' run: | echo ${{ secrets.REGISTRY_PASSWORD }} | docker login ccr.ccs.tencentyun.com -u ${{ secrets.REGISTRY_USERNAME }} --password-stdin - name: Build run: | docker build -t ccr.ccs.tencentyun.com/shaowenchen/xxx -f ./Dockerfile . docker push ccr.ccs.tencentyun.com/shaowenchen/xxx:latest

提交代码之后,Github Action 自动编译代码,推送镜像到腾讯云的镜像仓库。

4. 公众号配置及测试

4.1 启用公众号服务器配置

如上图,在微信公众号的管理页面,启用服务配置。需要记下如下信息,用于后端代码代码鉴权:

  • AppID
  • AppSecret
  • Token
  • EncodingAESKey

这里的服务器地址就是函数服务的网关地址 https://service-xxx.gz.apigw.tencentcs.com/release/ + mp/ 。由于服务尚未更新,验证无法通过,需要停留在这个页面,等待服务就绪再保存即可。

4.2 配置秘钥更新服务

将上一步获取到的配置填写到 main.go 文件的配置中:

1 2 3 4 5 6

config := wxcontext.Config{ AppID: "从公众号管理页获取", AppSecret: "从公众号管理页获取", Token: "从公众号管理页获取", EncodingAESKey: "从公众号管理页获取", }

提交之后,等待 Github Action 执行完毕,推送镜像成功。

4.3 更新函数服务

虽然服务镜像更新成功,但是函数服务并不会更新。

如上图,我们打开函数管理的页面,选择镜像版本,勾选 latest 提交。提交成功之后,页面会提示拉取镜像、服务更新中,此时打开访问地址,页面响应 OK

此时再去报错公众号服务配置,即可成功。

4.4 发送消息测试

最后,在微信公众号测试一下功能:

在腾讯云的函数服务后端,也可以查看到相关的请求日志。

5. 总结

本文主要以微信公众号后端开发为需求,尝试了一下腾讯云 Serverless 服务。由于目前,腾讯云 Serverless 服务有一定的免费额度,对于个人的一些小项目、Demo 项目,也算够用。本文主要涉及如下内容:

  • 创建了一个腾讯云 Serverless 函数服务
  • 使用 Github Action 创建了一个 Gin 持续集成项目
  • 微信公众号服务器端配置

最终实现了一个能自动响应用户公众号消息输入的功能需求。


原文地址: https://www.chenshaowen.com/blog/develop-a-wechat-backend-using-tencent-serverless.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Serverless 的使用场景
  • 2. 在腾讯云 Serverless 上创建函数服务
    • 2.1 初始化镜像
      • 2.2 创建函数服务
      • 3. 在 Github 上创建后端项目
        • 3.1 使用 Gin 初始化项目
          • 3.2 添加 Dockerfile
            • 3.3 添加 Github Action
            • 4. 公众号配置及测试
              • 4.1 启用公众号服务器配置
                • 4.2 配置秘钥更新服务
                  • 4.3 更新函数服务
                    • 4.4 发送消息测试
                    • 5. 总结
                    相关产品与服务
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档