框架概述
近期在做yutool相关项目的技术升级工作,直接升级到Java25版本,也用上了带GraalVM的LibericaNIK-25-OpenJDK-25。Spring Boot版本一步到位升级到4.0.x版本,虚拟线程在升级3.5.x版本时也是早早就用上了。为了适配Spring Boot 4.0.x版本,光迁移到Jackson3就花了不少时间,也尝鲜了使用GraalVM构建的native-image等。
这些新技术确实将Java项目的工程化和性能都提升到了新的高度,但却也成为了让我下定决心使用Golang生态重构yutool等项目的导火索。原因主要有以下几点:
- Java项目现在确实更轻更快更成熟了,但对比Rust/Golang等依然很重。简单对比一组数据:
- Golang版本yupan应用:Docker镜像只有
60MB,运行内存在20MB以内 - Java版本yupan应用:在我个人能力范围内,勉强能将Docker镜像体积控制在
390MB左右,运行内存在500MB~600MB之间
- Golang版本yupan应用:Docker镜像只有
- Golang经过这么多年的发展,生态也是相当成熟。主流框架经过长时间的迭代和维护,已经稳如老狗。
- Golang项目的编译速度很快,本地调试快捷方便。
GOPRIVATE让git代码仓库直接化身二方库,代码库的commit hash就是版本号,天才的设计。go mod彻底解决项目依赖管理的痛点,更有go mod vendor能一键打包所有依赖的类库源码到本地项目中,直接锁定依赖的代码源码,而不是版本号,并且在CI/CD构建过程中无需再次下载。
记得上一次使用Golang还是在上一次(7年前),那个时候主要是为了学习Go语言以及开发一些小工具,生态也没有那么成熟,现如今使用Golang进行web项目开发已成主流。
此次使用Golang重构yutool项目时,还是选择以下主流框架:
go-yutool的模块说明:
| 简介 | |||
|---|---|---|---|
| commons | 公共模块,包括常量、接口返回码、业务异常定义、参数检查、JSON序列化/反序列化扩展、工具类等 | ✔ | |
| config | 配置管理,基于viper,支持从nacos加载应用配置 | ✔ | |
| orm | orm组件,基于gorm,支持分页查询(聚合查询)、数据审计、逻辑删除、乐观锁、雪花ID | ✔ | |
| router | web路由,基于gin,支持常用参数绑定、全局error处理 | ✔ | |
| oauth | OAuth认证,支持接入Logto认证服务 | ✔ | |
| oss | 对象存储,文件服务,使用minio-sdk支持接入S3存储服务 | ✔ | |
| cache | 缓存,基于fido | ✔ | |
| cron | 定时任务调度,基于robfig/cron | ✔ | |
| excel | 数据导入导出,基于excelize | ✔ | |
| sse | SSE(Server-Sent Events)服务端组件 | ✔ | |
| menu | 系统菜单管理 | ✔ |
类似yutool,go-yutool也提供了一系列代码模板用于快速生成业务代码,包括:
- service服务
- logic逻辑
- service接口实现
- dto转entity
- entity转vo
- model模型
- entity实体对象
- dto对象
- vo对象
- query查询对象
- routes路由匹配
推荐的项目结构:
├─ hack/ # 工具脚本 (如 CLI 配置、shell脚本)
├─ internal/ # (核心) 内部业务逻辑,通过Go的internal特性对外隐藏
│ ├─ cmd/ # 命令行入口,负责启动流程、路由注册
│ ├─ consts/ # 项目全局常量定义
│ ├─ model/ # 数据结构管理层
│ │ ├─ dto/ # dto对象
│ │ ├─ entity/ # 数据模型,与数据表一一对应
│ │ ├─ query/ # 查询对象
│ │ └─ vo/ # vo对象
│ ├─ routes/ # 路由匹配,接收请求调用服务
│ ├─ logic/ # 业务逻辑封装层,实现具体的业务逻辑
│ ├─ service/ # 业务接口定义层,用于模块间解耦
│ └─ task/ # 定时任务,任务注册
├─ manifest/ # 交付清单,存放配置、部署、Docker等文件
│ ├─ config/ # 配置文件目录
│ └─ docker/ # Docker镜像相关文件
├─ resource/ # 静态资源文件,可用于存放web前端项目的构建产物
│ ├─ static/ # js、css、图片等静态资源
│ └─ templates/ # 页面Html模板
├─ web/ # 前端项目
├─ vendor/ # 存放所有外部依赖,通过go mod vendor命令生成
├─ main.go # 程序主入口文件
├─ main_test.go # 测试入口文件
├─ go.mod # Go模块依赖管理
├─ go.sum # Go模块依赖校验
└─ README.md # 项目介绍文档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
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
评论区留言准则:
1. 本评论区禁止传播封建迷信、吸烟酗酒、低俗色情、赌博诈骗等任何违法违规内容。
2. 当他人以不正当方式诱导打赏、私下交易,请谨慎判断,以防人身财产损失。
3. 请勿轻信各类招聘征婚、代练代抽、私下交易、购买礼包码、游戏币等广告信息,谨防网络诈骗。