Golang 极简的开发和快速部署入

本文从 Golang 开始到 docker 镜像 构建部署,讲解其过程。本文从 golang 安装到与 Node.js 社区的 express 和 koa 构建结果进行对比。

一、安装 golang

golang 官方网站.png

  • 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 项目

 

sh

复制代码

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

五、编写简单的业务代码

 

go

复制代码

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)没有分阶段

 

Dockerfile

复制代码

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"]

  • 执行构建
 

sh

复制代码

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

没有分阶段.png

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

6.2)分阶段构建

 

dockerfile

复制代码

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分阶段构建.png

第二节点复制第一阶段的构建产物,没有依赖文件。从图中看到阶段构建的 docker 镜像只有 18M, 远远小于没有分阶段的大小, 带有 linux 的镜像只有 18M, 非常小, 符合预期。

七、docker 打包并上传

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

个人版.png

  • 使用 docker 登录阿里云 registry
 

sh

复制代码

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

  • 推送到云端
 

sh

复制代码

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

八、将镜像上传容器服务

上传云服务之后.png

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

九、在服务器中进行部署

 

sh

复制代码

# 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 完成定时任务
 

sh

复制代码

pnpm init pnpm add @koa/router koa node-cron

  • 添加 js 代码
 

ts

复制代码

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 相关的文件
 

.dockerignore

复制代码

node_modules

 

dockerfile

复制代码

# 使用 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"]

这镜像已经非常简洁了(如果还有能简洁,提出宝贵意见)

  • 构建
 

sh

复制代码

docker build -t koa-app .

  • 输出结果

koa-app.png

因为没有将 docker 进行打包到一个包里面,dockerfile 镜像依然依赖 node_modules 中生产环境的内容,大小为 122M。远远大于 go gin 15M。但是 koa 还有优化的手段,通过 webpack 等工具打包压缩到一个文件。go 优势就是直接将内容构建为二进制。在开发体验上小程序更加有优势。

十一、小结

文本分析了基于 docker 的 go-gin 项目快速开发与部署,并且对 koa 前端框架。go 得益于构建二进制文件,无需多余的构建工具辅助,可以将文件构建的比较小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值