自从面市以来,Golang成为了程序员在编写API和开发Web服务时的首选之一。近90%的受访者表示会在自己下一组项目中持续使用Golang。与我们熟悉的C和C++类似,Go语言也是现有Golang的“灵魂”。而Golang则是专为并发而设计的。
作为一个编译型语言和开源平台,Golang在独特的功能和更好的替代方案方面可谓各大Web软件开发公司的首选框架。它可以协助开发人员构建出稳定可靠的软件应用。例如,在开发API时,开发人员可以使用Golang框架去构建REST API。
以下是主流的Golang框架,适合用于Web开发:
Go语言编写的HTTP Web框架,它以更好的性能实现了类似Martini的API,性能更好
GinGonic是一个知名且简约的Golang Web应用框架。该框架拥有各种开发所需的库和功能。许多知名的开发公司都会采用该Web框架,来处理各种监控、跟踪、以及调试等问题。此外,相对其他平台,该框架还具有如下特点:
它使用HTTP路由器,来管理Golang流量。
它使用简单的设计规则,并提供精确的文档。
GoFrame 是一个强大的 Go Web 应用开发框架,它提供了一系列优秀的功能模块和常用工具,方便开发者快速构建高性能、高可用的 Web 应用程序。
相较于 Go 标准库,GoFrame 提供了更多的功能模块,例如:ORM、Cache、Session、WebSocket、邮件发送等等。此外,GoFrame 也提供了更友好的 API 和更好的性能。
Goframe是一个优秀的Golang Web框架,其主要优点和缺点如下:
总体来说,Goframe是一个非常优秀的Web框架,其性能和功能都比较出色,但需要注意的是,对于初学者来说,存在一定的学习难度,而且在一些特殊场景下,可能需要进行更多的自定义开发。
Echo 高性能、极简Go语言Web框架
Echo非常适合于开发轻量级的微服务
Beego 面向Go编程语言的开源高性能web框架
类似于面向Python的兼容性Django Web框架,Beego具有Web应用程序共有的一系列独特功能和特性。目前,它由八个不同的模块所组成,可按需取舍或组合使用。
除了在大多数Web框架中常见的MVC组件,Beego还包括一个ORM(Object-Relationship Map,对象关系映射),可访问信息与数据、会话管理工具、以及内置的缓存处理程序。同时,它还包含了用于联合操作(joint operations)和HTTP元素、组件、以及各种日志系统的代码库。
我们可以认为Beego是Django在其不同命令行工具中的另一种表示方式。例如,开发人员可以使用bee命令,从头开始构建Beego应用、或使用当前应用程序进行管理。此外,Beego还能够提供如下功能:
类似于Django的CL(命令行)工具。
从头开始、或在现有的应用中构建强大的应用程序。
只需一个bee命令,即可全面开展任何项目。
Beego整体来讲是非常优秀的框架,吸引了大批Go语言初学者作为第一框架,适合工业级项目开发
项目地址:https://github.com/beego/beego
一种 Express 风格的、基于 fasthttp 的 HTTP Web 框架
Iris 自称是全宇宙最快的Go语言Web框架,完备MVC支持,拥抱未来
Iris为了优化性能,不惜自己开发和集成最快的组件,比如日志记录内置了golog模块,比如json序列化就选择了第三方库jsoniter,从框架设计的态度上,非常给力。
Go-Zero 是一个基于 Go 语言的微服务开发框架。它旨在提供简单、高效和可靠的微服务开发解决方案。Go-Zero 主要功能包括 RPC、缓存、限流、熔断、监控等。相较于其他 Go 框架,如 Gin 或 Beego,Go-Zero 更加专注于微服务开发,并提供了更多的开箱即用的功能。
go-micro 是一个微服务框架,它可以用于构建可伸缩和可维护的微服务应用程序。它支持多种语言和传输协议,并提供了一系列服务发现、负载均衡、消息传递和远程过程调用(RPC)等基础设施功能。
作为另一个Google顶级Golang框架,Gorilla是应用开发社区中最完备的Web框架。它完美地迎合了net/HTTP库的各种可重用元素和组件。目前,Gorilla能够提供如下特点:
模块化和可扩展性。
通过包含和启用新的扩展、模块、删除包,解决过时的功能给系统带来的隐患。
涵括从原生支持到对Web Sockets的支持。
由于Martini可以在整个开发过程中轻松地支持与第三方的集成,因此它更像一个精妙的生态系统,而不是一个框架。除了能够以最小的开销去处理大量功能,该Web框架还可以灵活地扩展出其他功能。由于具有极高的可扩展性,因此该框架主要专注于编写Golang服务,以及构建出优秀的Web应用。此外,Martini还能够提供如下特点:
启用诸如路由、异常处理和常用技术服务,以进一步为通配符、变量参数、以及正则表达式结构等提供支持。
Martini拥有非常完备的Golang Web应用社区。该社区虽然不大,但是非常活跃,并且目前他们拥有着约20多个实用插件。
相比其他Golang Web开发框架,Buffalo不但能够协助您快速地启动开发项目,而且可以被用作集成的Web开发生态系统。目前,Buffalo能够提供如下功能:
通过同时满足后端和前端应用开发的需求,实现简单、有效且快速地构建出Web应用。
带有热重载(hot reloading)功能的Buffalo框架,可以通过dev命令,自动观察.html和.go文件,以重建和重新启动二进制文件。
Goji是一个极其轻量级和快速的GolangWeb开发框架,具有直接组合的能力。目前,该Web框架成为了绝大多数移动应用开发公司、以及从事不同Web项目公司的理想选择。该框架在如下方面进行了探索:
与net/HTTP ServeMux类似,拥有简约的HTTP请求多路复用器(multiplexer)。
Goji不但适合生产环境,而且包括了各种URL模式、可重新配置的中间件栈、以及无缝关闭等功能。
Revel是面向Web开发人员的最新Golang框架之一。它能够提供如下功能:
它带有一系列预配置的创新特性和功能,可被运用在不同的使用场景中。
该框架并不一定需要寻找相关配置与设置。
与其他Go语言框架不同,Revel完全自给自足,并不依赖任何中间件或第三方插件。
Revel是构建多任务式API的一站式解决方案。
虽然未能得到主动维护,但是许多Golang用户仍然会使用到模块化的Mango Web框架。Mango框架可帮助您尽可能轻松快速地去构建和创建可重用的HTTP功能模块。此外,它还将一系列应用程序和中间件,包含在一个HTTP服务器对象中,以保持代码的自我导向性(self-directed)。因此,您可以从不同的库中,决定当前项目中需要用到的不同功能。Mango框架还能够提供如下功能:
对于所有类别的Web开发项目,Mango都可以让应用开发人员从各种库选项中进行按需选择,进而简化了应用的实现。
Mango框架能够方便开发人员快速、直接地使用基于HTTP的模块。
为了保持代码的独立性和高效性,它能够与各种应用及中间件协同使用。
作为老牌稳定的框架,Gocraft提供了可扩展和快速路由的功能。此类路由可以被作为新的功能,添加到HTTP或标准库中的网络包里。由于它是一种定制的Go mux中间件包,且具有反射和转换(casting)能力,因此您可以将其静态地植入自己的应用代码中。
此外,您也可以使用当前的内置中间件,自行创建或添加其他功能。由于程序员往往将性能作为优先考虑因素,因此他们会使用Gocraft框架,来轻松地创建和编写后端Web应用。因此,Gocraft混合并提供了如下功能:
程序开发人员可以通过具有内置中间件的移动应用,去访问并添加更多的功能。
Gocraft可以提供更好的API峰值性能。
由于支持自定义的中间件包,因此它可以处理代码的反射和转换。
Web.go属于最简单的Google Golang Web框架类。它通过树型路由(tree-routing)系统提供各项附加功能,协助开发者在任何用例中,实施和处理需要路由的项目。
指标 | 说明 |
---|---|
基本介绍 | 来源各自官网。 |
模块化设计 | 是否支持模块化插拔设计、模块之间低耦合设计,是否可以独立使用其中某部分组件。 |
模块完善度 | 框架提供的功能模块是否丰富。模块能否能覆盖日常普遍的开发需求。 |
使用易用性 | 易用性不仅仅是值框架好不好用,更多是团队能否在低成本下快速接入,长期来看能否低成本维护。 |
文档完善性 | 参考官网提供的介绍资料,包括但不限于:文档、视频、示例、案例资料。同时,本地中文文档支持也是参考项。 |
工程化完备 | 是否能够快速接入项目开发,是否提供项目接入规范、设计模式、开发工具链,文档是否完善、源码是否易读、是否便于长期维护。 |
开发模式 | 框架适用的开发模式,或者官方推荐的开发模式。 |
工程规范 | 项目接入时的开发规范,如目录规范、设计规范、编码规范、命名规范等。 |
社区活跃 | 官方与社区沟通是否便捷,问题是否能够快速解答,BUG是否能够快速响应处理。 |
开发工具链 | 项目开发时使用到的CLI开发工具,如初始化项目、交叉编译、代码生成、swagger、热编译能力等等。 |
Web: 性能测试 | 来源第三方评测 https://github.com/the-benchmarker/web-frameworks 。 |
Web: 路由冲突处理 | 存在路由注册冲突时有无良好的解决方案,在业务项目开发中比较常见。 |
Web: 域名支持 | Web路由是否支持域名绑定,甚至多域名的绑定。 |
Web: 文件服务 | Web服务是否提供静态资源的访问能力。 |
Web: 优雅重启/关闭 | Web服务在重启时不会影响请求执行,关闭时会等待正在执行的请求处理完,新请求不再接入。 |
ORM | 框架是否自带ORM组件,ORM组件是业务项目的核心组件。无论是自研还是通过第三方组件引入。 |
Session | 框架是否提供会话管理组件,无论是通用型Session组件,还是仅针对于Web服务的Session组件。 |
I18N支持 | 国际化组件支持(常用但非核心组件)。 |
配置管理 | 配置管理也是框架需要完备的核心组件能力。 |
日志组件 | 日志组件也是框架需要完备的核心组件能力。 |
数据校验 | 数据校验也是框架需要完备的核心组件能力。 |
缓存管理 | 缓存管理也是框架需要完备的核心组件能力。无论是内存还是Redis,无论是自研还是通过第三方组件引入。 |
资源打包 | 支持将依赖的文件资源例如静态资源、配置文件等固定文件编译到可执行文件中。框架组件自动支持资源检索。 |
链路跟踪 | 框架是否具备分布式链路跟踪能力,分布式跟踪在微服务架构中是必不可少的能力。 |
测试框架 | 框架是否支持单元测试接入,提供单元测试接入规范。无论是使用标准库还是第三方测试框架。 |
突出优点 | 比较明显的几点优点。 |
突出缺点 | 比较明显的几点缺点。 |
GoFrame | Beego | Iris | Gin | |
---|---|---|---|---|
比较版本 | v1.15.2 | v1.12.3 | v12.0.2 | v1.6.3 |
项目类型 | 开源(国内) | 开源(国内) | 开源(海外) | 开源(海外) |
开源协议 | MIT | Apache-2 | BSD-3-Clause | MIT |
框架类型 | 模块化框架 | Web框架 | Web"框架" | Web"框架" |
基本介绍 | 工程完备、简单易用,模块化、高质量、高性能、企业级开发框架。 | 最简单易用的企业级Go应用开发框架。 | 目前发展最快的Go Web框架。提供完整的MVC功能并且面向未来。 | 一个Go语言写的HTTP Web框架。它提供了Martini风格的API并有更好的性能。 |
项目地址 | http://github.com/gogf/gf | http://github.com/beego/beego | http://github.com/kataras/iris | http://github.com/gin-gonic/gin |
官网地址 | http://goframe.org | http://beego.me | http://iris-go.com | http://gin-gonic.com |
模块化设计 | 是 | - | - | - |
模块完善度 | 10 | 6 | 4 | 2 |
使用易用性 | 9 | 9 | 9 | 10 |
文档完善度 | 10 | 8 | 6 | 4 |
工程化完备 | 10 | 8 | 5 | 1 |
社区活跃 | 9 | 10 | 9 | 10 |
开发模式 | 模块引入、三层架构、MVC | MVC | MVC | - |
工程规范 | 分层设计、对象设计 | 项目结构 | - | - |
开发工具链 | gf工具链 | bee工具链 | - | - |
Web: 性能测试 | 10 | 8 | 8 | 9 |
Web: HTTPS | HTTPS & TLS | 支持 | CustomHttpConfiguration | 支持 |
Web: HTTP2 | - | - | 支持 | 支持 |
Web: WebSocket | WebSocket服务 | 有 | 有 | - |
Web: 分组路由 | 路由注册-分组路由 | Namespace | GroupingRoutes | 有 |
Web: 路由冲突处理 | 有 | - | 有 | - |
Web: 域名支持 | 域名绑定 | - | - | - |
Web: 文件服务 | 静态文件服务 | 静态文件处理 | ServingStaticFiles | 有 |
Web: 多端口/实例 | 多端口监听、多实例监听 | - | RunMultipleServiceUsingIris | - |
Web: 优雅重启/关闭 | 平滑重启特性 | 热升级 | GracefulShutdownOrRestart | GracefulRestartOrStop |
ORM | ORM文档 | ORM文档 | - | - |
Session | Session | Session | 有 | - |
I18N支持 | I18N | I18N | Localization | - |
模板引擎 | 模板引擎 | View设计 | TemplateRendering | HtmlRendering |
配置管理 | 配置管理 | 参数配置 | - | CustomHttpConfig |
日志组件 | 日志组件 | Logging | - | - |
数据校验 | 数据校验 | 表单数据验证 | - | CustomValidators |
缓存管理 | 缓存管理 | Cache | - | - |
资源打包 | 资源管理 | bee工具bale命令 | - | - |
链路跟踪 | 链路跟踪 | - | - | - |
测试框架 | 单元测试 | - | Testing | Testing |
突出优点 | goframe主要以工程化和企业级方向为主,特别是模块化设计和工程化设计思想非常棒。针对业务项目而言,提供了开发规范、项目规范、命名规范、设计模式、开发工具链、丰富的模块、高质量代码和文档,社区活跃。作者也是资深的PHP开发者,PHP转Go的小伙伴会倍感亲切。 | beego开源的比较早,最早的一款功能比较全面的Golang开发框架,一直在Golang领域有着比较大的影响力,作者谢大多年组织着国内影响力比较大GopherCN活动。beego有着比较丰富的开发模块、开箱即用,提供了基于MVC设计模式的项目结构、开发工具链,主要定位为Web开发,当然也可以用于非Web项目开发。 | iris主要侧重于Web开发,提供了Web开发的一系列功能组件,基于MVC开发模式。iris这一年发展比较快,从一个Web Server的组件,也慢慢朝着beego的设计方向努力。 | gin专注于轻量级的Web Server,比较简单,易于理解,路由和中间件设计不错,可以看做替代标准库net/http.Server的路由加强版web server。献给爱造轮子的朋友们。 |
突出缺点 | 开源时间较晚,推广过于佛系,目前主要面向国内用户,未推广海外。 | 起步较早,自谢大创业后,近几年发展较慢。非模块化设计,对第三方重量级模块依赖较多。 | 号称性能最强,结果平平。非模块化设计。最近两年开始朝beego方向发展,但整体框架能力还不完备,需要加油。 | 功能简单易用,既是优点,也是缺点。 |
对于入门者来说,选择一个易于学习的框架比较重要,我推荐Gin和Echo
对于企业开发者来说,需要结合自己的项目特点选择框架,框架只是项目实施的一部分,Go本身就提供了丰富的类库,框架的选择相比于优雅的进行业务实现并没有那么重要。我们可以结合自己的实际项目进行二次封装。
对待新框架的态度:我认为花时间复刻自己的项目,及时复盘,精通一个主流框架,主流语言,比花时间走马观花的了解框架更重要。
综合来说,不同的Golang Web框架都有各自的优缺点。选择一个合适的框架可以根据具体项目需求,比如性能要求、开发难易度、扩展支持等等因素进行权衡。
https://juejin.cn/post/7067347764899741709
https://zhuanlan.zhihu.com/p/350002797