Golang 极简的开发和快速部署入
本文从 Golang 开始到 docker 镜像 构建部署,讲解其过程。本文从 golang 安装到与 Node.js 社区的 express 和 koa 构建结果进行对比。
一、安装 golang
- golang download 选择一个合适的版本,下载与安装。
- 当前的稳定版本是:
go1.22.4
如果你还不熟悉 golang 的语法,可以先花一点时间进行学习,因为 golang 的语法非常简洁,多练习很快就能上手。
二、golang 工具链
golang 有自己的工具链,使用起来还是非常方便的,如果你是一个前端开发者,发现 go 项目没有显示 node_modules
文件夹。下面是一些常用的命令:
2.1)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 ./... |
2.2)go mod
子命令
golang从 v1.1 版本开始支持 mod 命令,并在 1.13 版本后成为默认包管理方式,使用 go mod 能方便的管理你的项目。
子命令 | 功能 | 示例命令 |
---|---|---|
init | 初始化新的模块 | go mod init example.com/mymodule |
tidy | 整理依赖 | go mod tidy |
download | 下载所有模块的依赖 | go mod download |
三、认识 go-gin
如果说要学习的第一个 go 的 web 框架的话,那一定是 go-gin, go-gin 具有一下的特点:
- 速度快、体积小
- 中间件支持
- 无崩溃
- json 校验
- 分组路由
- 错误管理
- 内置渲染引擎
如果你熟悉 koa, go-gin 与 koa 几乎特别像。
四、初始化一个 go gin 项目
cd your_dir
go mod init your_porject_name
# 安装依赖
go get -u github.com/gin-gonic/gin
go get -u github.com/robfig/cron
如果还不熟悉 cron 语法,可以参考 crontab。
五、编写简单的业务代码
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 分为两个版本一个没有分阶段构建和分阶构建的
6.1)没有分阶段
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"]
- 执行构建
docker build -t cron-app--no-stage .
我们看到没有分阶段的大小就包含了开发阶段文件,大小是 596+MB
。体积还比较大的,只有两个小的主要依赖。
6.2)分阶段构建
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
docker login --username=<your_user_name> <your_registry>
- 推送到云端
# 推送之前打一个 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%
。
九、在服务器中进行部署
# 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>
因为是 1s 一次的 print 任务,演示结果已经完成,没有必要频发运行。这样一整个流程就完成了。
十、对比 koa dockerfile 构建大小
- koa + node-cron 完成定时任务
pnpm init
pnpm add @koa/router koa node-cron
- 添加 js 代码
import Koa from 'koa';
import Router from '@koa/router';
import cron from 'node-cron';
// 创建 Koa 实例
const app = new Koa();
const router = new Router();
// 定时任务,每秒执行一次
cron.schedule('* * * * * *', () => {
console.log('每秒执行一次的定时任务');
});
// 设置路由
router.get('/', async (ctx) => {
ctx.body = '欢迎访问主页';
});
// 使用路由中间件
app
.use(router.routes())
.use(router.allowedMethods());
// 启动服务器
const port = 3000;
app.listen(port, () => {
console.log(`服务器正在运行在 http://localhost:${port}`);
});
- 添加 docker 相关的文件
node_modules
# 使用 Node.js 官方提供的 LTS 版本作为基础镜像
FROM node:14-alpine
# 设置工作目录
WORKDIR /app
# 将 package.json 和 package-lock.json 复制到工作目录
COPY package*.json ./
# 安装应用依赖
RUN npm install --production
# 将应用代码复制到工作目录
COPY . .
# 暴露应用运行的端口
EXPOSE 3000
# 启动应用
CMD ["node", "app.mjs"]
这镜像已经非常简洁了(如果还有能简洁,提出宝贵意见)
- 构建
docker build -t koa-app .
- 输出结果
因为没有将 docker 进行打包到一个包里面,dockerfile 镜像依然依赖 node_modules 中生产环境的内容,大小为 122M。远远大于 go gin 15M。但是 koa 还有优化的手段,通过 webpack 等工具打包压缩到一个文件。go 优势就是直接将内容构建为二进制。在开发体验上小程序更加有优势。
十一、小结
文本分析了基于 docker 的 go-gin 项目快速开发与部署,并且对 koa 前端框架。go 得益于构建二进制文件,无需多余的构建工具辅助,可以将文件构建的比较小。
转载自:https://juejin.cn/post/7378028569690685481