当前位置: 首页 > news >正文

Go新项目-为何选Gin框架?(0)

在这里插入图片描述

先说结论:我们选型Gin框架

早在大概在2019年下旬,由于内部一个多线程上传的需求,考虑到Go协程的优势;
内部采用Gin框架编写了内部的数据上传平台BAP,采用Gin+Vue开发,但前期没考虑到工程化思维,导致代码后期维护程度变得很复杂,硬编码内容过多,重复内容过多;
项目说明:其中一半采用Gin作为Web页面API,一半做了脚本独立运行。
此次鉴于新项目的开发,准备将代码工程化思维重构。

首先考虑到业务的增长,以后需要将公司项目朝着自动化运维、微服务、集群、分布式项目的方向发展,云原生的需求,底层部署会向Docker+Kubernetes方向靠拢

目前在行的PHP为主的项目就显得不那么友好(业务代码繁杂,开发环境依赖重,资源消耗占用大等),并且其中还嵌套了Python脚本。
这催生了我们选择go语言重构及开发新项目的打算:

go语言的优势如下:

  • Go天生的自带并发调度,如协程和通道,且协程内存占用少,一个Goroutine栈空间最小2K
  • Go自带的格式统一,gofmt工具
  • Go语法的简洁,可读性强,严格语言规范
  • Go作为静态语言,编译效率高,性能相对高
  • Go跨平台的编译使用,跟操作shell命令一样的调用,部署方便,目前很多脚本都是这么来做的。
  • 丰富的内置类型,内置强大的工具
  • 内置runtime,自动垃圾回收机制

由于我们很多项目都是基于BS架构的模式,我们也不希望过重的框架,开发高性能的API服务以及后续的微服务,进行前后端分离开发模式(go+vue)
所以我们就要从go热门的几款框架中做了对比:

统计star时间:2021-12-15

  • Beego: 一个Go语言下开源的,高性能Web框架 ;
    • github:https://github.com/beego/beego, star 27.4k
  • Buffalo: 一个Go语言下快速Web开发框架 ;
    • github:https://github.com/gobuffalo/buffalo, star 6.5k
  • Echo: 一个高性能,极简的Web框架;
    • github:https://github.com/labstack/echo,21.3k
  • Gin: 一个Go语言写的HTTP Web框架。它提供了Martini风格的API并有更好的性能;
    • github:https://github.com/gin-gonic/gin, star 53.9k
  • Revel: 一个高生产率,全栈Go语言的Web框架;
    • github:https://github.com/revel/revel,star 12.5k
  • Iris: 目前发展最快的Go Web框架。提供完整的MVC功能并且面向未来;
    • github:https://github.com/kataras/iris,star 21.6k

选择Gin的几点说明:

  • 可以看到Gin的star数最多,只是一个指标,说明使用人多,然后社区人员活跃
  • 功能简单易用性强,可扩展空间大
  • 内部使用的路由是httprouter(性能非常好的路由框架).

当然这些不够,如何把轻框架即满足需求又容易扩展,还是要参考热门的开源项目,对该框架进行补充;如:Docker,Kubernetes,Hugo,awesome-go等

详细对比参考地址:https://github.com/speedwheel/awesome-go-web-frameworks/blob/master/README.md

附带一些Gin框架开发相关的辅助工具

  • gin-swagger:通过注释自动生成swagger api文档
  • gorm:ORM库旨在让开发人员更加友好
  • cobra:A Commander for modern Go CLI interactions(现代Go CLI交互的命令行工具集)
  • viper:Viper是Go应用程序的完整配置解决方案,toml,yaml等配置文件读取
  • jwt-go 用于生成、解析JWT token
  • aliyun-oss-go-sdk 阿里云OSS官方包,用于操作OSS(当然这块具体业务了,我们使用alisdk较多)
  • excelize 读写Excel

相关文章:

  • 【贪心】数组大小减半
  • MySQL基础笔记(6)函数
  • 第一章 通信职业道德
  • 性能压力测试:企业成功的关键要素
  • linux 文件打包 / 分割 / 组合 / 解压
  • 【Golang】二进制字符串转换为数字
  • 通过IP地址识别风险用户
  • LLM主流框架:Causal Decoder、Prefix Decoder和Encoder-Decoder
  • rsync 远程同步
  • KubeSphere 核心实战之一【在kubesphere平台上部署mysql】(实操篇 1/3)
  • uniapp中uview组件库Toast 消息提示 的使用方法
  • 计算机网络——应用层(3)
  • matlab/simulink风电光伏储能虚拟同步机VSG下垂控制虚拟惯量控制,光伏变压减载控制一次调频二次调频研究,储能下垂控制SOC
  • 海外云手机:跨境养号的新趋势
  • clip安装使用教程
  • Android系统模拟器绘制实现概述
  • Android优雅地处理按钮重复点击
  • cookie和session
  • express + mock 让前后台并行开发
  • FastReport在线报表设计器工作原理
  • Java的Interrupt与线程中断
  • Linux快速复制或删除大量小文件
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 规范化安全开发 KOA 手脚架
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 配置 PM2 实现代码自动发布
  • 试着探索高并发下的系统架构面貌
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #HarmonyOS:基础语法
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (六)vue-router+UI组件库
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET开源快速、强大、免费的电子表格组件
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [20150321]索引空块的问题.txt
  • [20171101]rman to destination.txt
  • [30期] 我的学习方法
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [C++] sqlite3_get_table 的使用
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [DAX] MAX函数 | MAXX函数
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo