Go 学习日记(1):Gin 编写第一个接口,自动部署到服务器(Github Action + Docker)

1,566 阅读4分钟

为了丰富自己的技术栈,现在开始自学 Go,很多教程参差不齐,记录一下自己的学习过程,持续更新~

通过本篇文章您将学习到:

  • Go 环境搭建(windows),使用 Vscode 开发 GO
  • Gin 框架路由配置,编写第一个接口
  • 阿里云 Docker 镜像创建与使用
  • Github Action + Docker 自动部署到腾讯云服务器

Go 环境搭建

  • 下载 go1.22.5.windows-amd64.zip

  • 解压到本地文件夹 D:\Go

  • 添加环境变量:Path 里面新增 D:\Go\bin,至此安装完成

    PS C:\Windows\system32> go version
    go version go1.22.5 windows/amd64
    

配置 VsCode 开发环境

  • 安装 Go 插件

1722511739190.png

  • 配置Go插件:重启 Vscodectrl + shit + p ,输入 Go: Install/Update tools 然后选择安装

初始化 Go 项目

  • 新建一个项目目录,初始化go项目
go mod init jiang-go-study

会自动生成一个 go.mod 文件,相当于前端项目的 package.json

1722512343230.png

  • 修改 go proxy ,否则无法下载资源,根目录下添加 go.env,写入修改后重启终端生效
export GOPROXY=https://goproxy.io,direct

image.png

Gin 是一个高性能、支持中间件和灵活路由的 Go 语言 HTTP web 框架,适用于开发高并发 web 应用。

go get -u github.com/gin-gonic/gin

会自动生成 go.sum 文件,相当于前端项目的 lock 文件

  • 创建并运行一个简单的 Gin 应用程序:在项目根目录下创建一个名为 main.go 的文件,并写入以下代码:
package main

import (
	"fmt"
	"jiang-go-study/routers"
)

func main() {
	// 注册路由
	r := routers.CreateHttpHandler()
	fmt.Println(r)
	err := r.Run(":8080")
	if err != nil {
		fmt.Println("服务器启动失败!")
	}
}
  • Go 语言中,只要 import 了包就可以直接使用 包名.方法,我们将路由放到单独的文件夹分配管理

在根目录下新建以下结构文件

1722513045433.png

index.go 文件内容:

package routers

import (
	"github.com/gin-gonic/gin"
	"jiang-go-study/routers/module"
)

func CreateHttpHandler() *gin.Engine {
	root := gin.New()
	base := root.Group("/jiang")

	routersModule.SetupCommonRouter(base)

	return root
}

------------------------------------------------------------------------

common.go 内容:

package routersModule

import (
	"github.com/gin-gonic/gin"
)

func SetupCommonRouter(base *gin.RouterGroup) {
	common := base.Group("/common")

	common.GET("/log", func(c *gin.Context) {
		c.String(200, "common log")
	})
}

之后不同模块路由都将放到 module 文件夹内管理

  • 执行 go run main.go ,

1722513354488.png

打开 http://127.0.0.1:8080/jiang/common/log,看到输出则成功

1722513391931.png

至此我们第一个 go 接口就完成啦,接下来就要把这个接口放到服务器上,为了开发更便捷,我们通过 Github Action + docker 自动部署到服务器,这里希望您有一台自己的服务器,我们将使用阿里云 docker 容器镜像服务

使用阿里云 Docker 容器镜像上传

自行在阿里云容器镜像网站上,注册并创建一个仓库,后面会使用到阿里云帐号、密码、仓库名称,需要绑定 Github 帐号以及仓库

1722513894813.png

1722513789687.png

自动构建打包上传

  • 根目录下新建 Dockerfile
# 使用官方 Golang 镜像作为基础镜像
FROM golang:1.22.5

# 设置工作目录
WORKDIR /app

# 复制所有文件到容器中
COPY . .

# 下载并安装依赖包
RUN go mod tidy

# 编译 Go 程序
RUN go build -o jiang-go-study

# 声明服务端口
EXPOSE 8080

# 启动 Go 应用
CMD ["./jiang-go-study"]
  • 根目录下新建 .github/workflows/deploy.yml 文件
name: Deploy to Alibaba Cloud

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: "1.22.5"

      - name: Build
        run: go build -o jiang-go-study

      - name: Login to Alibaba Cloud Container Registry
        run: |
          echo "${{ secrets.ALIYUN_DOCKER_PASSWORD }}" | docker login --username ${{ secrets.ALIYUN_DOCKER_USERNAME }} --password-stdin registry.cn-hangzhou.aliyuncs.com

      - name: Build Docker image
        run: docker build -t registry.cn-hangzhou.aliyuncs.com/jiang-go/jiang-go-study:latest .

      - name: Push Docker image
        run: docker push registry.cn-hangzhou.aliyuncs.com/jiang-go/jiang-go-study:latest

  deploy:
    runs-on: ubuntu-latest
    needs: build

    steps:
      - name: SSH to server and deploy
        uses: appleboy/ssh-action@v0.1.6
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USERNAME }}
          key: ${{ secrets.SERVER_SSH_KEY }}
          script: |
            docker login --username ${{ secrets.ALIYUN_DOCKER_USERNAME }} --password ${{ secrets.ALIYUN_DOCKER_PASSWORD }} registry.cn-hangzhou.aliyuncs.com
            docker pull registry.cn-hangzhou.aliyuncs.com/jiang-go/jiang-go-study:latest
            docker ps -q --filter "name=jiang-go-study" | grep -q . && docker stop jiang-go-study || echo "Container jiang-go-study is not running"
            docker ps -a -q --filter "name=jiang-go-study" | grep -q . && docker rm jiang-go-study || echo "Container jiang-go-study does not exist"
            docker run -d --name jiang-go-study -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/jiang-go/jiang-go-study:latest
  • Github 仓库中的新建 5 个 Repository secrets
    • SERVER_HOST:服务器 ip
    • SERVER_USERNAME:服务器登录用户名,一般 root
    • SERVER_SSH_KEY:服务器上生成的私钥,这里不会的可以参考我的 过去文章
    • ALIYUN_DOCKER_USERNAME:阿里云 Docker 用户名
    • ALIYUN_DOCKER_PASSWORD:阿里云 Docker 密码

1722514154154.png

  • 在腾讯云防火墙中 放行 8080 端口,腾讯云的防火墙添加自定义安全组

  • 腾讯云服务器需要安装 Docker,我这边是宝塔 Linux 版的,我直接在宝塔面板上安装了

至此若不出意外,在推送代码到 GitHub 仓库后,将会在阿里云镜像网站中看到一条新的镜像版本,可以在服务器终端中查看 Docker 状态

1722514898110.png

然后通过服务器 ip 地址访问接口,打开 http://121.4.86.16:8080/jiang/common/log

1722514989505.png

到这里,我们的第一个 Go 接口就成功的自动部署到服务器,之后开发只需要推送代码到仓库就会自动构建了,先把这么一个流程把它弄通,后面再慢慢学习其它的,加油!!!