首页 » 99链接平台 » Golang 极简的开发和快速部署入(镜像构建部署依赖开发)

Golang 极简的开发和快速部署入(镜像构建部署依赖开发)

萌界大人物 2024-10-24 23:00:06 0

扫一扫用手机浏览

文章目录 [+]

功能

示例命令

go run

Golang 极简的开发和快速部署入(镜像构建部署依赖开发) 99链接平台
(图片来自网络侵删)

运行 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_dirgo mod init your_porject_name# 安装依赖go get -u github.com/gin-gonic/gingo get -u github.com/robfig/cron

如果还不熟悉 cron 语法,可以参考 crontab。

五、编写简单的业务代码

package mainimport ("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 builderWORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN go build -o main .EXPOSE 8080CMD ["./main"]执行构建

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

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

6.2)分阶段构建

FROM golang:1.22.2-alpine AS builder# 第一阶段WORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN go build -o main .# 第二阶段FROM alpine:latestWORKDIR /root/COPY --from=builder /app/main .EXPOSE 8080CMD ["./main"]

构建结果:

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

七、docker 打包并上传

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

使用 docker 登录阿里云 registry

docker login --username=<your_user_name> <your_registry>推送到云端

# 推送之前打一个 tagdocker 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 initpnpm 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 得益于构建二进制文件,无需多余的构建工具辅助,可以将文件构建的比较小。

标签:

相关文章