1.常见框架
1.1 框架排名
- Gin 31k [Lite]
- Beego 22k
- Iris 16k
- Echo 15k [Lite]
- Revel 11k
- Martini 10k [×]
- buffalo 5k [Lite]
1.2 框架特性
Gin:
Gin 是一个用 Go (Golang) 编写的 web 框架。它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍。如果你是性能和高效的追求者, 你会爱上 Gin.
快速:基于 Radix 树的路由,小内存占用。没有反射。可预测的 API 性能。
支持中间件:传入的 HTTP 请求可以由一系列中间件和最终操作来处理。例如:Logger,Authorization,GZIP,最终操作 DB。
Crash 处理:Gin 可以 catch 一个发生在 HTTP 请求中的 panic 并 recover 它。这样,你的服务器将始终可用。例如,你可以向 Sentry 报告这个 panic!
JSON 验证:Gin 可以解析并验证请求的 JSON,例如检查所需值的存在。
路由组:更好地组织路由。是否需要授权,不同的 API 版本…… 此外,这些组可以无限制地嵌套而不会降低性能。
错误管理:Gin 提供了一种方便的方法来收集 HTTP 请求期间发生的所有错误。最终,中间件可以将它们写入日志文件,数据库并通过网络发送。
内置渲染:Gin 为 JSON,XML 和 HTML 渲染提供了易于使用的 API。
可扩展性:新建一个中间件非常简单,去查看示例代码吧。
Beego:
bee 工具是一个为了协助快速开发 beego 项目而创建的项目,通过 bee 您可以很容易的进行 beego 项目的创建、热编译、开发、测试、和部署。
简单化:RESTful 支持、MVC 模型,可以使用 bee 工具快速地开发应用,包括监控代码修改进行热编译、自动化测试代码以及自动化打包部署。
智能化:支持智能路由、智能监控,可以监控 QPS、内存消耗、CPU 使用,以及 goroutine 的运行状况,让您的线上应用尽在掌握。
模块化:beego 内置了强大的模块,包括 Session、缓存操作、日志记录、配置解析、性能监控、上下文操作、ORM 模块、请求模拟等强大的模块,足以支撑你任何的应用。
高性能:beego 采用了 Go 原生的 http 包来处理请求,goroutine 的并发效率足以应付大流量的 Web 应用和 API 应用,目前已经应用于大量高并发的产品中。
Iris:
- 专注于高性能
- 简单流畅的API
- 高扩展性
- 强大的路由和中间件生态系统
- 使用iris独特的表达主义路径解释器构建RESTful API
- 动态路径参数化或通配符路由与静态路由不冲突
- 使用重定向选项从URL中删除尾部斜杠
- 使用虚拟主机和子域名变得容易
- 分组API和静态或甚至动态子域名
- net / http和negroni-like处理程序通过iris.FromStd兼容
- 针对任意Http请求错误 定义处理函数
- 支持事务和回滚
- 支持响应缓存
- 使用简单的函数嵌入资源并与go-bindata 保持兼容
- mvc
- 上下文
- 高度可扩展的试图渲染(目前支持markdown,json,xml,jsonp等等)
- 正文绑定器和发送HTTP响应的便捷功能
- 限制请求正文
- 提供静态资源或嵌入式资产
- 本地化i18N
- 压缩(Gzip是内置的)
- 身份验证
- Basic Authentication
- OAuth, OAuth2 (支持27个以上的热门网站)
- JWT 服务器
- 通过TLS提供服务时,自动安装和提供来自https://letsencrypt.org的证书
- 默认为关闭状态
- 在关闭,错误或中断事件时注册
- 连接多个服务器,完全兼容 net/http#Server
- 视图系统.支持五种模板引擎 完全兼容 html/template
- Websocket库,其API类似于http://socket.io [如果你愿意,你仍然可以使用你最喜欢的]
- 热重启
- Typescript集成 + Web IDE
- Iris是最具特色的网络框架之一
1.3 性能测试
- (1):在一定的时间内实现的总调用数,越高越好
- (2):单次操作耗时(ns/op),越低越好
- (3):堆内存分配 (B/op), 越低越好
- (4):每次操作的平均内存分配次数(allocs/op),越低越好
2.应用
2.1 主机服务
Gin
http.ListenAndServe(":8080", router)gin.Default()routerBeeGo
runIris
Iris 的主机有多种拓展功能,包括自定义监听服务、主机配置,同时也支持多主机服务。与 Gin 相似的 iris.Router与 net/http/Handler 功能兼容,它可以在任何net/http服务器上进行调整:
2.2 路由
Gin
Gin 在路由系统上集成了 HttpRouter 拥有高性能的优势,同时拥有其丰富的功能,包括组合路由、路由验证、CORS 等。
简单路由:
分层路由:
BeeGo
BeeGo 的路由功能较为丰富,拥有基础路由、固定路由、正则路由、注解路由、namespace等多个功能,其 REST 风格性较强,且有固定的路由层规范。
简单路由:
固定路由:
namespace(分层路由):
Irisi
简单路由:
分层路由:
2.3 上下文对象
在进行路由匹配之后,可以获取到上下文对象,三套框架都对 Context 进行了封装。
http.Requesthttp.ResponseWriterhttp.Request2.4 数据操作
原生
在原生开发中,Go 支持解析 JSON 格式的数据处理能力:
simplejsonGin
c.ShouldBindstructcontent-typeJSONXMLForm接收数据:
发送数据:
Gin 输出这 JSON、 XML、 YAML 三种格式非常方便,直接使用对用方法并赋值一个结构体给它就行了。
gin.Hgin.Hjavascriptjsongin.HGin 支持返回的数据格式有:HTML, String,JSON, XML, YAML
BeeGo
context.RequestBodycontext.Data“json”context.ServeJSON()c.Data["json"]context.ServeJSON()json.Marshal()此外,BeeGo 支持返回的数据类型由有:JSON、XML、JSONP
Iris
Irisi 对处理 JSON 数据的方法进行了封装,同时也拥有验证数据的能力。
发送数据与前两者无差别,都是先定义结构体,然后底层使用 JSON 库的能力对 JSON 数据进行解析并赋值于创建的对象。
接收数据:
iris.Context.JSON()返回数据:
此外,Iris 支持返回的数据格式有:binary, text, json, jsonp, xml, markdown
2.5 模板引擎
原生
templateParseParseFileExecute原生的模板引擎支持以下的能力:
{{.}}{{with …}}…{{end}} {{range …}}{{end}}if ... else ...Gin
LoadHTMLGlob()LoadHTMLFiles()gin.Defalut()Context.HTMLgin.H()Gin 的模板引擎支持以下能力:
- 使用自定义的 html 模板渲染
- 自定义分隔符(模板标签)
- 继承原生能力
c.HTMLBeego
html/template- 自定义模板目录
- 自动渲染
- 自定义模板标签
- 模板数据:模板中的数据是通过在 Controller 中 this.Data 获取的
- 自定义模板名称
- layout 设计、LayoutSection:实际上是模板的组合、嵌套
- renderform
Iris
Iris 自身并没有创建一种直接可用的模板引擎,而是交给用户可以选择任意一种模板引擎,且完全兼容 html/template。
html- 高性能.
- 非常易用.
- 功能强大,支持模板继承和模板include.
- 自动编译.
同时可以选用 quicktemplate 引擎,其拥有以下特性:
QuicktemplateGoquicktemplateGoand/orPHP:)Go2.6 MVC 架构
Gin
Gin 不支持 MVC 架构模式,需要开发者自行实现,具有一定的灵活性。
Beego
Beego 是标准的 MVC 框架,对 MVC 有着良好的支持,同时提供了 Model 层的 ORM 引擎。
Iris
Iris对MVC(模型视图控制器)模式有一流的支持,Iris web框架支持请求数据、模型、持久数据和以最快的速度执行的绑定。其模式流程图如下: