安装 Go

  • 进入Go官网
  • Go download 选择一个合适的版本,下载与安装。

如果你还不熟悉 Go 的语法,可以先花一点时间进行学习,因为 Go 的语法非常简洁,多练习很快就能上手

Go工具链

Go有自己的工具链,使用起来还是非常方便的,如果你是一个前端开发者,发现 Go 项目没有显示 node_modules 文件夹。下面是一些常用的命令:

Go命令

命令 功能 示例命令
go run 运行 Go 源文件 go run main.go
go build 编译 Go 包和依赖包 go build
go test 自动化测试工具 go test
go fmt 格式化 Go 代码 go fmt ./…
go mod 管理 Go 模块 go mod tidy
go get 下载和安装包和依赖 go get <package_path>
go install 编译并安装包 go install <package_path>
gofmt 格式化 Go 源代码 gofmt -w .
golint 静态检查 Go 代码 golint ./…

Go mod 子命令

Go从 v1.1 版本开始支持 mod 命令,并在 1.13 版本后成为默认包管理方式,使用 go mod 能方便的管理你的项目。

子命令 功能 示例命令
init 初始化新的模块 go mod init example.com/mymodule
tidy 整理依赖 go mod tidy
download 下载所有模块的依赖 go mod download

认识Gin

Gin 具有一下的特点:

  • 速度快、体积小
  • 中间件支持
  • 无崩溃
  • json 校验
  • 分组路由
  • 错误管理
  • 内置渲染引擎

初始化一个 Gin 项目

1
2
3
4
5
6
cd your_dir
go mod init your_porject_name

# 安装依赖
go get -u github.com/gin-gonic/gin
go get -u github.com/robfig/cron

编写简单的业务代码

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
package main

import (
"github.com/gin-gonic/gin"
"github.com/robfig/cron"
"net/http"
"time"
"fmt"
)

func main() {
r := gin.Default()
// 创建一个 cron 实例
c := cron.New()

// 添加定时任务,每隔一分钟执行一次
c.AddFunc("*/1 * * * *", func() {
fmt.Println("执行定时任务:", time.Now())
})

// 启动 cron 服务
c.Start()
r.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

导入如 gin 和 cron 两个三方库,然后再示例化 cron,并且添加一个任务,输出一个string字符串,然后使用 gin 给出一个路由提供给外部访问。一个带有定时任务的 go gin 小程序就完成了。

添加 dockerfile

dockerfile 分为两个版本一个没有分阶段构建和分阶构建的

没有分阶段

1
2
3
4
5
6
7
8
9
10
FROM golang:1.22.2-alpine AS builder

WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o main .
EXPOSE 8080

CMD ["./main"]

执行构建

1
docker build -t cron-app--no-stage .

我们看到没有分阶段的大小就包含了开发阶段文件,大小是 596+MB。体积还比较大的,只有两个小的主要依赖。

分阶段构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM golang:1.22.2-alpine AS builder

# 第一阶段
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o main .

# 第二阶段
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/main .

EXPOSE 8080

CMD ["./main"]

阶段构建的 docker 镜像只有 18M, 远远小于没有分阶段的大小, 带有 linux 的镜像只有 18M, 非常小, 符合预期。

Docker 打包并上传

首先确保自己有一个镜像服务地址,上传镜像,这里以阿里云为例

使用 docker 登录阿里云 registry

1
docker login --username=<your_user_name> <your_registry>

推送到云端

1
2
3
4
# 推送之前打一个 tag
docker tag [ImageId] <your_registry>/<your_name>/<image_name>:[镜像版本号]

docker push <your_registry>/<your_name>/<image_name>:[tag]

将镜像上传容器服务

上传成功之后,我们镜像会被 ali 云进行压缩,原来 15M 的现在 9.1M,压缩率是 39.33%

在服务器中进行部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ssh 登录自己的服务器
ssh root@<your_ip>
# input password
# docker 登录自己阿里云账号
docker login --username=<your_user_name> <your_registry>

# docker 拉取
docker pull <your_image>

# 通过镜像运行容器
docker run -p 8080:8080 <image_id> # 确保 8080 没有被占用

docker ps # 查看所有的 container

# docker stop <container_id>