Gin项目脚手架与标配组件

文章目录

前言

软件和汽车一样,由多个重要零部件组装而成。

本文堆积了一些常用部件,还没来得及好好整理。先放着。

神兵利器虽多,总归还是要组装一个自己的才放心。

设计思想和原则

框架中用到的设计思想和原则,尽量满足 "高内聚、低耦合",主要遵从下面几个原则

    1. 单一职责原则
    1. 基于接口而非实现编程
    1. 依赖注入
    1. 多用组合
    1. 迪米特法则

迪米特法则: 不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口

✨ 技术栈

  • 框架路由使用 Gin 路由
  • 中间件使用 Gin 框架的中间件
  • 数据库组件 GORM
  • 文档使用 Swagger 生成
  • 配置文件解析库 Viper
  • 使用 JWT 进行身份鉴权认证
  • 校验器使用 validator 也是 Gin 框架默认的校验器
  • 任务调度 cron
  • 包管理工具 Go Modules
  • 测试框架 GoConvey
  • CI/CD GitHub Actions
  • 使用 GolangCI-lint 进行代码检测
  • 使用 make 来管理 Go 工程
  • 使用 shell(admin.sh) 脚本来管理进程
  • 使用 YAML 文件进行多环境配置

另一份整理的清单:

  1. Gin: 轻量级Web框架,自称路由速度是golang最快的
  2. GORM: ORM工具。本项目需要配合Mysql使用
  3. Gin-Session: Gin框架提供的Session操作工具
  4. Go-Redis: Golang Redis客户端
  5. godotenv: 开发环境下的环境变量工具,方便使用环境变量
  6. Gin-Cors: Gin框架提供的跨域中间件
  7. httpexpect: 接口测试工具
  8. 自行实现了国际化i18n的一些基本功能
  9. 本项目是使用基于cookie实现的session来保存登录状态的,如果需要可以自行修改为token验证

视频实况教程

让我们写个G站吧!Golang全栈编程实况

sponge 内置了丰富的组件(按需使用)

组件 使用示例
Web 框架 gin gin 示例 gin 中间件示例
RPC 框架 gRPC gRPC 示例 gRPC 拦截器示例
配置解析 viper 示例
日志 zap 示例
ORM 框架 gorm, mongo-go-driver gorm 示例 mongodb 示例
缓存 go-redis, ristretto go-redis 示例 ristretto 示例
自动化api文档 swagger, protoc-gen-openapiv2 -
鉴权 jwt jwt 示例 gin 示例 gRPC 示例
校验 validator, protoc-gen-validate validator 示例 protoc-gen-validate 示例
Websocket gorilla/websocket 示例
定时任务 cron 示例
消息队列 rabbitmq, kafka rabbitmq 示例 kafka 示例
分布式事务管理器 dtm dtm 服务发现示例 使用 dtm 秒杀抢购示例
分布式锁 dlock 示例
自适应限流 ratelimit gin 示例 gRPC 示例
自适应熔断 circuitbreaker gin 示例 gRPC 示例
链路追踪 opentelemetry gin 示例 gRPC 示例 跨服务链路追踪示例
监控 prometheus, grafana gin 示例 gRPC 示例 web 和 gRPC 监控示例
服务注册与发现 etcd, consul, nacos 服务注册示例 服务发现示例
自适应采集 profile 示例
资源统计 gopsutil 示例
配置中心 nacos 示例
代码质量检查 golangci-lint -
持续集成部署 CI/CD kubernetes, docker, jenkins 示例
生成项目业务架构图 spograph 示例
生成自定义代码 go template json 示例 sql 示例 protobuf 示例
AI助手 DeepSeek, ChatGPT, Gemini 示例

使用Singo开发的项目实例

仿B站的G站:https://github.com/Gourouting/giligili

Singo框架为移动端提供Token登录的案例: https://github.com/bydmm/singo-token-exmaple

几个标配

常用组件

主要技术点

  1. 认证使用jwt,双token模式(accessToken、refreshToken)
  2. 数据库操作使用gorm
  3. 限流使用令牌桶
  4. 用户id生成使用的是雪花算法
  5. 日志管理使用zap
  6. 配置文件管理使用viper
  7. 代码热监听使用air
  8. 接口文档生成使用swagger
  • 提供 gin 框架项目模版
  • 支持 HTTP 和 gRPC 双协议服务
    • 可通过配置启用/禁用 gRPC 服务
    • 统一的 API 定义和实现
    • 支持 gRPC 健康检查和反射服务
  • 使用 Uber fx 框架进行依赖注入,实现更清晰的代码结构
  • 采用标准 MVC 架构,遵循关注点分离原则
  • 集成 GORM 进行 ORM 映射和数据库操作
    • 支持 PostgreSQL (使用 pgx 驱动)
    • 支持 MySQL
    • 支持 SQLite
    • 提供丰富的查询选项工具函数
  • 集成 Viper 进行配置管理
  • 提供常用 gin 中间件和工具
    • 跨域中间件:处理 API 跨域请求,实现 CORS 支持
    • jwt 解析中间件:从请求中解析并验证 JWT Token,用于 API 身份认证
  • 国际化 (i18n) 支持
    • 基于请求 Accept-Language 头自动选择语言
    • 错误消息多语言支持
    • 内置英语 (en-US) 和中文 (zh-CN) 翻译
    • 可轻松扩展支持更多语言
  • 使用 Cobra 命令行框架,提供清晰的子命令结构
  • 支持数据库迁移与服务器启动分离,提高启动速度
  • 完善的数据库迁移系统,支持版本控制和回滚
  • 内置用户、角色、权限和菜单管理系统
  • 支持多种用户模式,满足不同规模项目需求
  • 优化的错误处理系统,支持错误码和多语言错误消息

另一个

  • RESTful API 设计规范
  • Gin 一款高效的golang web框架
  • MySQL 数据库存储
  • Jwt 用户认证, 登入登出一键搞定
  • Casbin 基于角色的访问控制模型(RBAC)
  • Gorm 数据库ORM管理框架, 可自行扩展多种数据库类型(主分支已支持gorm 2.0)
  • Validator 请求参数校验, 版本V9
  • Log v1.2.2升级后日志支持两种常见的高性能日志 logrus / zap (移除日志写入本地文件, 强烈建议使用docker日志或其他日志收集工具)
  • Viper 配置管理工具, 支持多种配置文件类型
  • Embed go 1.16文件嵌入属性, 轻松将静态文件打包到编译后的二进制应用中
  • DCron 分布式定时任务,同一task只在某台机器上执行一次(需要配置redis)
  • GoFunk 常用工具包, 某些方法无需重复造轮子
  • FiniteStateMachine 有限状态机, 常用于审批流程管理(没有使用工作流, 一是go的轮子太少, 二是有限状态机基本可以涵盖常用的审批流程)
  • Uploader 大文件分块上传/多文件、文件夹上传Vue组件vue-uploader
  • MessageCenter 消息中心(websocket长连接保证实时性, 活跃用户上线时新增消息表, 不活跃用户不管, 有效降低数据量)
  • testing 测试标准包, 快速进行单元测试
  • Grafana Loki 轻量日志收集工具loki, 支持分布式日志收集(需要通过docker运行gin-web-docker)
  • Minio 轻量对象存储服务(需要通过docker运行gin-web-docker)
  • Swagger Swagger V2接口文档
  • Captcha 密码输错次数过多需输入验证码
  • Sign API接口签名(防重放攻击、防数据篡改)
  • Opentelemetry 链路追踪, 快速分析接口耗时

参考链接

相关推荐
十年砍柴---小火苗1 天前
gin使用Mysql连接池用法
数据库·mysql·gin
LL小蜗牛3 天前
Go Web框架选型与实践:基于Gin的REST API开发指南
golang·gin
fashia7 天前
Java转Go日记(五十六):gin 渲染
开发语言·后端·golang·go·gin
fashia8 天前
Java转Go日记(五十四):gin路由
开发语言·后端·golang·go·html·gin
神奇萝卜头8 天前
Gin--Blog项目-flags文件解析
microsoft·gin
jonssonyan10 天前
使用 vite-plugin-dynamic-base 实现运行时动态设置上下文路径
vue.js·golang·gin
张帅涛_66611 天前
golang 安装gin包、创建路由基本总结
开发语言·golang·gin
小G同学14 天前
golang+gin实现api接口开发
golang·gin
我重来不说话16 天前
免费Ollama大模型集成系统——Golang
golang·gin·ollama·免费大模型