Gin项目脚手架与标配组件
文章目录
- 前言
- 设计思想和原则
- ✨ 技术栈
- 视频实况教程
- sponge 内置了丰富的组件(按需使用)
- 几个标配
- 常用组件
- 主要技术点
- 另一个
- 参考链接
前言
软件和汽车一样,由多个重要零部件组装而成。
本文堆积了一些常用部件,还没来得及好好整理。先放着。
神兵利器虽多,总归还是要组装一个自己的才放心。
设计思想和原则
框架中用到的设计思想和原则,尽量满足 “高内聚、低耦合”,主要遵从下面几个原则
-
- 单一职责原则
-
- 基于接口而非实现编程
-
- 依赖注入
-
- 多用组合
-
- 迪米特法则
迪米特法则: 不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口
✨ 技术栈
- 框架路由使用 Gin 路由
- 中间件使用 Gin 框架的中间件
- 数据库组件 GORM
- 文档使用 Swagger 生成
- 配置文件解析库 Viper
- 使用 JWT 进行身份鉴权认证
- 校验器使用 validator 也是 Gin 框架默认的校验器
- 任务调度 cron
- 包管理工具 Go Modules
- 测试框架 GoConvey
- CI/CD GitHub Actions
- 使用 GolangCI-lint 进行代码检测
- 使用 make 来管理 Go 工程
- 使用 shell(admin.sh) 脚本来管理进程
- 使用 YAML 文件进行多环境配置
另一份整理的清单:
- Gin: 轻量级Web框架,自称路由速度是golang最快的
- GORM: ORM工具。本项目需要配合Mysql使用
- Gin-Session: Gin框架提供的Session操作工具
- Go-Redis: Golang Redis客户端
- godotenv: 开发环境下的环境变量工具,方便使用环境变量
- Gin-Cors: Gin框架提供的跨域中间件
- httpexpect: 接口测试工具
- 自行实现了国际化i18n的一些基本功能
- 本项目是使用基于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
几个标配
- Gin: https://github.com/gin-gonic/gin
- Gorm: https://github.com/go-gorm/gorm
- Wire: https://github.com/google/wire
- Viper: https://github.com/spf13/viper
- Zap: https://github.com/uber-go/zap
- Golang-jwt: https://github.com/golang-jwt/jwt
- Go-redis: https://github.com/go-redis/redis
- Testify: https://github.com/stretchr/testify
- Sonyflake: https://github.com/sony/sonyflake
- Gocron: https://github.com/go-co-op/gocron
- Go-sqlmock: https://github.com/DATA-DOG/go-sqlmock
- Gomock: https://github.com/golang/mock
- Swaggo: https://github.com/swaggo/swag
- Pitaya: https://github.com/topfreegames/pitaya
- Casbin: https://github.com/casbin/casbin
常用组件
主要技术点
- 认证使用jwt,双token模式(accessToken、refreshToken)
- 数据库操作使用gorm
- 限流使用令牌桶
- 用户id生成使用的是雪花算法
- 日志管理使用zap
- 配置文件管理使用viper
- 代码热监听使用air
- 接口文档生成使用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
请求参数校验, 版本V9Log
v1.2.2升级后日志支持两种常见的高性能日志 logrus / zap (移除日志写入本地文件, 强烈建议使用docker日志或其他日志收集工具)Viper
配置管理工具, 支持多种配置文件类型Embed
go 1.16文件嵌入属性, 轻松将静态文件打包到编译后的二进制应用中DCron
分布式定时任务,同一task只在某台机器上执行一次(需要配置redis)GoFunk
常用工具包, 某些方法无需重复造轮子FiniteStateMachine
有限状态机, 常用于审批流程管理(没有使用工作流, 一是go的轮子太少, 二是有限状态机基本可以涵盖常用的审批流程)Uploader
大文件分块上传/多文件、文件夹上传Vue组件vue-uploaderMessageCenter
消息中心(websocket长连接保证实时性, 活跃用户上线时新增消息表, 不活跃用户不管, 有效降低数据量)testing
测试标准包, 快速进行单元测试Grafana Loki
轻量日志收集工具loki, 支持分布式日志收集(需要通过docker运行gin-web-docker)Minio
轻量对象存储服务(需要通过docker运行gin-web-docker)Swagger
Swagger V2接口文档Captcha
密码输错次数过多需输入验证码Sign
API接口签名(防重放攻击、防数据篡改)Opentelemetry
链路追踪, 快速分析接口耗时
参考链接
- https://github.com/go-eagle/eagle
- https://github.com/gourouting/singo: Gin+Gorm开发Golang API快速开发脚手架
- https://github.com/gostartkit/web
- https://github.com/go-nunu/nunu
- https://github.com/limitcool/starter: starter 是一个 Go + gin 框架的项目脚手架,提供开箱即用的工具、库和 gin 项目配置,帮助您快速启动 gin 驱动的 API 项目开发。
- https://gitee.com/liuxingxiang/gin-web-scaffolding
- https://github.com/go-dev-frame/sponge/tree/main
- https://github.com/zzjcool/ginHelper
相关文章:
Gin项目脚手架与标配组件
文章目录 前言设计思想和原则✨ 技术栈视频实况教程sponge 内置了丰富的组件(按需使用)几个标配常用组件主要技术点另一个参考链接 前言 软件和汽车一样,由多个重要零部件组装而成。 本文堆积了一些常用部件,还没来得及好好整理。先放着。 神兵利器虽多…...
ros2总结-常用消息包类型以及查询消息包命令
ROS2官方提供了多个常用的消息包(message packages),这些消息包定义了标准的数据结构,用于机器人系统中的通信和数据交换。以下是ROS2官方常见的消息包及其用途: ### 1. **std_msgs** - **用途**:提供基…...
C#·常用快捷键
一、大小写转换 CTRL U转小写 CTRL SHIFT U转大写 二、调试快捷键 F6: 生成解决方案 CtrlF6: 生成当前项目 F7: 查看代码 ShiftF7: 查看窗体设计器 F5: 启动调试 CtrlF5: 开始执行(不调试) ShiftF5: 停止调试 CtrlShiftF5: 重启调试 F9: 切换断点 CtrlF9: 启用/停止断点 C…...
CSS3实现的账号密码输入框提示效果
以下是通过CSS3实现输入框提示效果的常用方法,包含浮动标签和动态提示两种经典实现方案: 一、浮动标签效果 <div class"input-group"><input type"text" required><label>用户名</label> </div><…...
沉浸式 VR 汽车之旅:汽车虚拟展厅与震撼试驾体验
在传统的汽车销售模式里,消费者的看车选车过程极为艰辛。他们常常需要花费大量的时间和精力,亲自前往一家又一家的 4S 店。有时候,为了对比不同品牌、不同型号的汽车,可能要穿梭于城市的各个角落,耗费一整天甚至数天的…...
低秩矩阵、奇异值矩阵和正交矩阵
低秩矩阵 低秩矩阵(Low-rank Matrix)是指秩(rank)远小于其行数和列数的矩阵,即 r a n k ( M ) r ≪ min ( m , n ) rank(M) r \ll \min(m,n) rank(M)r≪min(m,n)。其核心特点是信息冗余性,可通过少量…...

CS144 - LAB0
CS144 - Lab 0 telnet 发送请求 如图,很简单,但是注意输入时间太久会超时 发邮箱 首先我们需要用命令行去发邮箱,这里我用企业微信邮箱给自己的 qq 邮箱发送~ 整个命令如下! 对于其中的参数,其实从英文就可以看出来…...

论文浅尝 | 将复杂知识图谱问答对齐为约束代码生成(COLING2025)
笔记整理:康家溱,东南大学在读硕士,研究方向为代码大语言模型 论文链接:https://aclanthology.org/2025.coling-main.267.pdf 发表会议:COLING 2025 1. 动机 近年来,随着大语言模型(LLM…...
【Linux命令】scp远程拷贝
文章目录 1. 基本语法与常用选项2. 使用场景和使用示例本地文件->远程主机远程主机文件->本地远程主机->另一台远程主机 3. 使用注意事项 scp(Secure Copy Protocol)是linux中基于ssh的安全文件传输工具,用于在本地和远程主机之前安…...

Golang|分布式搜索引擎中所使用到的设计模式
迭代器模式 定义:在遍历接口时,提供统一的方法函数供调用,保持一致性。核心思想:与大众习惯保持一致,方便第三方实现容器类时保持一致。常见方法:如next()方法,适用于所有集合类,简化…...

Ubuntu22.04通过命令行安装qt5
环境: VMware17Pro ubuntu-22.04.5-desktop-amd64.iso 步骤: 安装好虚拟机进入shell,或通过ssh登录,确保虚拟机能上外网,执行命令: sudo apt update sudo apt install build-essential sudo snap in…...
【仿生机器人】仿生机器人系统架构设计2.0——具备可执行性
结合我的需求后,来自Claude4.0 的结构设计 仿生机器人系统架构设计 一、系统总体架构 1.1 核心设计理念 涌现式情感:情感不是预设的规则,而是从环境感知、记忆关联和内在状态的复杂交互中涌现出来动态人格塑造:性格特质随着经…...

STM32:ESP8266 + MQTT 云端与报文全解析
知识点1【MQTT的概述】 1、概述 MQTT是一种基于发布/订阅模式的轻量级应用层协议,运行在TCP/IP协议之上,专用物联网(IoT)和机器对机器(M2M)设计,其核心目标是低带宽,高延迟或不稳定…...

HTML5 Canvas 星空战机游戏开发全解析
HTML5 Canvas 星空战机游戏开发全解析 一、游戏介绍 这是一款基于HTML5 Canvas开发的2D射击游戏,具有以下特色功能: 🚀 纯代码绘制的星空动态背景✈️ 三种不同特性的敌人类型🎮 键盘控制的玩家战机📊 完整的分数统…...

箱式不确定集
“箱式不确定集(Box Uncertainty Set)”可以被认为是一种 相对简单但实用的不确定集建模方式。 ✅ 一、什么是“简单的不确定集”? 在鲁棒优化领域,“简单不确定集”通常指的是: 特点描述形式直观数学表达简洁&#…...

内存管理 : 04段页结合的实际内存管理
一、课程核心主题引入 这一讲,我要给大家讲的是真正的内存管理,也就是段和页结合在一起的内存管理方式。之前提到过,我们先学习了分段管理内存的工作原理,知道操作系统采用分段的方式,让用户程序能以分段的结构进行编…...
不使用绑定的方法
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // 初始设置 A 控件的宽度 ControlA.Width ControlB.Width / 2; // 监听 B 控件的 SizeChanged 事件 ControlB.SizeChanged (sender, e) > { ControlA.Width ControlB.Actual…...
Spring Boot 中的 Web 应用与 Reactive Web 应用
该判断题表述为:“Spring Boot启动过程中会判断当前应用类型是Web应用还是Reactive Web应用。” 这个说法是 正确的。Spring Boot 的自动配置机制会检查类路径,以确定是将应用程序配置为传统的 Servlet Web 应用还是 Reactive Web 应用。 Spring Boot 中…...
基于 stm32 的农用车控制系统设计
一、系统功能需求分析 农用车控制系统需实现多方面功能,以满足农业生产多样化需求。在动力控制方面,要实现发动机转速调节、挡位自动切换;作业控制涵盖农机具升降、播种施肥量调节、喷洒农药的流量与压力控制等;同时,还需具备车辆状态监测功能,实时监控发动机温度、油压…...

vue3: baidusubway using typescript
项目结构: <!--npm install -D tailwindcss-3d BaiduSubwayMap.vue npm install -D tailwindcss postcss autoprefixer--> <template><div class"relative w-full h-screen"><!-- 地图容器 --><div id"subway-container…...

Redis最佳实践——性能优化技巧之集群与分片
Redis集群与分片在电商应用中的性能优化技巧 一、Redis集群架构模式解析 1. 主流集群方案对比 方案核心原理适用场景电商应用案例主从复制读写分离数据冗余中小规模读多写少商品详情缓存Redis Sentinel自动故障转移监控高可用需求场景订单状态缓存Redis Cluster原生分布式分片…...
vue或者前端适配makedown推荐开源依赖
在 Vue 或前端项目中处理 Markdown 格式,以下是一些推荐的开源依赖和工具,根据需求分类整理: 1. 基础 Markdown 解析与渲染 Vue 专用库 vueuse/markdown VueUse 生态的 Markdown 工具,轻量且集成度高。 适合快速在 Vue 项目中渲…...
打打基础 | 从翻转链表到寄存器、汇编与内存
我作为软件工程师在美国工作了三年,期间接触和浸泡过不少的技术栈,罗列一番的话有 AWS cloud, frontend (React, TypeScript), backend (Django, Springboot, ECS, GraphQL), JVM (Java, Scala, Kotlin), data pipelines (Spark, Snowflake, Prefect, DB…...
深入解析 Dotnet-Boxed.Framework:提升 .NET 开发效率的利器
在现代 .NET 开发中,框架和工具的选择对项目的开发效率和长期维护至关重要。Dotnet-Boxed.Framework 是一个开源框架,旨在简化开发流程,提高生产力。它通过一组实用的工具和自动化功能,帮助开发者快速构建高质量的应用程序。本文将…...

常见相机的ISP算法
常见的ISP算法 3A算法 去雾算法 图像增强算法 图像宽动态算法 图像的电子缩放算法,无极电子缩放 图像降噪算法 相机常见问题 1.相机启动速度问题,启动速度较慢 2.相机扛不住高低温问题 3.相机散热问题问题 4.相机高低温芯片保护掉电 5.相机的成像效果或者…...

2024 CKA模拟系统制作 | Step-By-Step | 8、题目搭建-创建 Ingress
目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、核心考点 Ingress 资源定义 Ingress Controller 依赖 服务暴露验证 网络层次关系 三、搭建模拟环境 1.创建命名空间 2.安装ingress ingress-nginx-controller 3.创建hello.yaml并部署 四、总结 …...

OldRoll复古胶片相机:穿越时光,定格经典
在数字摄影盛行的今天,复古胶片相机的独特魅力依然吸引着无数摄影爱好者。OldRoll复古胶片相机这款软件,以其独特的复古风格和丰富的胶片滤镜效果,让用户仿佛穿越回了那个胶片摄影的黄金时代。它不仅模拟了胶片相机的操作界面,还提…...

通俗易懂的 JS DOM 操作指南:从创建到挂载
目录 🧩 1. 创建元素:document.createElement / createElementNS 📝 2. 创建文本:document.createTextNode ✏️ 3. 修改文本:node.nodeValue 🗑️ 4. 移除元素:el.removeChild() …...

CSS Day07
1.搭建项目目录 2.网页头部SEO三大标签 3.Favicon图标与版心 (1)Favicon图标 (2)版心 4.快捷导航 5.头部-布局 6.头部-logo 7.头部-导航 8.头部-搜索 9头部-购物车 10.底部-布局 11.底部-服务区域 12.底部-帮助中心 13.底部-版权…...
爬虫框架:scrapy使用心得
文章目录 前言一、scrapy是什么?二、使用步骤1.安装和创建2.请求以及参数3.代理池4.请求错误处理5.采集数据入库6.日志及其他配置 总结 前言 有些时候我们需要采集大量数据时,我们需要程序的运行效率高,当然如果有时候不想写请求代码的时候,这些情况我都…...