截至 2017 年,Go 语言排名前 6 的 Web 框架
适用于 Gophers 的超棒 Web 框架
再见!
适用于 Gophers 的超棒 Web 框架
如果你只是为自己设计一个小型应用程序,可能不需要 Web 框架;但如果你要将其投入生产环境,那么你肯定需要一个 Web 框架,而且是一个好的 Web 框架。
即使你认为自己具备必要的知识和经验,你愿意冒险独自编写所有这些功能吗?
你有时间找到一个生产级别的外部软件包来完成这项工作吗?你确定它能与你应用程序的其他部分保持一致吗?
正是这些严肃的原因促使我们中的佼佼者也使用框架,如果别人已经完成了那些艰苦的工作,我们就不想自己编写所有必要的功能。
介绍
Go是一种快速发展的开源编程语言,旨在构建简单、快速且可靠的软件。点击此处查看哪些优秀公司使用 Go 来驱动他们的服务。
本文包含了所有必要的信息,可以帮助开发者了解使用 Go 开发 Web 应用程序的最佳方案。
本文包含了目前最详尽的框架比较,从尽可能多的角度对最知名的 Web 框架进行了比较:流行度、支持度和内置功能:
Beego:一个用于 Go 编程语言的开源、高性能 Web 框架。
Buffalo:使用 Go 进行快速 Web 开发。
Echo:一个高性能、极简的 Go Web 框架。
Gin:一个用 Go 语言(Golang)编写的 HTTP Web 框架。它拥有类似 Martini 的 API,但性能更佳。
Iris:宇宙中最快的 Go 语言 Web 框架。MVC 架构,功能齐全。立即拥抱未来。
Revel:一个用于 Go 语言的高效全栈 Web 框架。
人气
按受欢迎程度(星级)排序
https://github.com/speedwheel/awesome-go-web-frameworks/blob/master/README.md#popularity
学习曲线
https://github.com/speedwheel/awesome-go-web-frameworks/blob/master/README.md#learning-curve
astaxie 和 kataras 做得真棒!希望其他框架也能尽快提供更多示例。至少对我来说,如果我切换到新的框架,这些示例是快速掌握尽可能多的信息的最佳途径。一个例子就相当于 1000 字。
核心功能
按特色程度由高到低排序
https://github.com/speedwheel/awesome-go-web-frameworks/blob/master/README.md#core-features
The most known "Web frameworks" in Go are not really frameworks, meaning that:
Echo, Gin and Buffalo are not really (fully featured) web frameworks
but the majority of Go community thinks that they are.
Therefore they think that they are comparable with Iris, Beego or Revel,
because of that we have the obligation to include them into this list as well.
All of the above frameworks, except Beego and Revel, can adapt any middleware
that was created for net/http, some of those can do this with ease and others
with some hacking [even the pain is a choice here].
词汇
路由器:命名路径参数和通配符
当您可以向具有动态路径的路由注册处理程序时。
命名路径参数示例:
"/user/{username}" matches to "/user/me", "/user/speedwheel" etc
路径username参数的值分别为"/me"和"speedwheel"。
通配符示例:
"/user/{path *wildcard}" matches to
"/user/some/path/here",
"/user/this/is/a/dynamic/multi/level/path" etc
路径path参数的值分别为"some/path/here"和"this/is/a/dynamic/multi/level/path"。
macrosIris也支持一个名为 的功能,可以描述为/user/{username:string}或/user/{username:int min(1)}。
路由器:正则表达式
当您可以向具有动态路径的路由注册处理程序时,
需要传递一些过滤器才能执行该处理程序。
例子:
"/user/{id ^[0-9]$}" matches to "/user/42" but not to "/user/somestring"
路径id参数的值为42。
路由器:分组
当您可以将通用逻辑或中间件/处理程序注册到共享相同路径前缀的特定路由组时。
例子:
myGroup := Group("/user", userAuthenticationMiddleware)
myGroup.Handle("GET", "/", userHandler)
myGroup.Handle("GET", "/profile", userProfileHandler)
myGroup.Handle("GET", "/signup", getUserSignupForm)
- /用户
- 用户/个人资料
- 用户/注册
你甚至可以从群组中创建子群组:
myGroup.Group("/messages", optionalUserMessagesMiddleware)
myGroup.Handle("GET', "/{id}", getMessageByID)
- /user/messages/{id}
路由器:以上所有选项混合使用,无冲突
这是一个高级但实用的功能,我们很多人都希望路由器或 Web 框架能够支持它,目前在 Go 语言世界中只有 Iris 支持此功能。
这意味着类似“ /{path *wildcard}and”/user/{username}和“and ”/user/static这样的事物/user/{path *wildcard}可以注册到同一个路由器中,并且可以通过静态路径(/user/static)或通配符(/{path *wildcard})正确匹配而不会发生冲突。
路由器:自定义 HTTP 错误
您可以注册一个用于“错误”状态码的处理程序。错误 HTTP 状态码是一种>=400状态码,即NotFound 404……
例子:
OnErrorCode(404, myNotFoundHandler)
上述大多数 Web 框架仅支持404注册405,500但功能齐全的框架(例如 Iris)Iris, Beego and Revel支持任何状态码甚至any error代码(any errorIris 仅支持)。
100% 兼容 net/http
这意味着你拥有:
- 该框架为您提供了一个上下文,可以直接访问
*http.Request和http.ResponseWriter。 net/http将处理程序转换为特定框架类型的处理程序的方法。
中间件生态系统
当您不必自己用中间件包装每个处理程序,而框架为您提供了一个完整的引擎来定义流程,无论是全局的、每个路由的还是每个路由组的,例如Use(middleware),Done(middleware)等等。
类似 Sinatra 的 API
在运行时处理程序中注册特定 HTTP 方法(和路径参数)的路由。
例子:
.Get or GET("/path", gethandler)
.Post or POST("/path", postHandler)
.Put or PUT("/path", putHandler) and etc.
服务器:自动 HTTPS
当框架服务器支持注册和自动续订 SSL 证书以管理 SSL/TLS 传入连接 (https) 时,最著名的自动 https 提供商是letsencrypt。
服务器:正常关闭
当您按下CTRL + C关闭终端应用程序的按钮时,服务器将优雅地关闭自身,等待某些连接完成其任务(在指定的超时时间内)或触发自定义事件以进行清理(即数据库关闭)。
服务器:多监听器
当框架的服务器支持注册自定义net.Listener或使用多个http服务器和地址来提供web应用程序时。
完整的 HTTP/2
当框架Push轻松支持 HTTP/2 和 https 以及服务器功能时。
子域名
当您可以直接从您的 Web 应用程序注册每个 x、y 子域的路由时。
secondary这意味着该框架不支持此功能,但您仍然可以通过启动多个 http 服务器来实现,缺点是主应用程序和子域未连接,默认情况下无法在它们之间共享逻辑。
会议
当 HTTP 会话受支持并可在您的特定处理程序中使用时。
- 一些 Web 框架支持后端数据库来存储会话,这样即使服务器重启,也能保持会话数据持久性。
- Buffalo 使用的是 Gorilla 会话,这种会话比其他实现方式稍慢一些。
例子:
func setValue(context http_context){
s := Sessions.New(http_context)
s.Set("key", "my value")
}
func getValue(context http_context){
s := Sessions.New(http_context)
myValue := s.Get("key")
}
func logoutHandler(context http_context){
Sessions.Destroy(http_context)
}
维基百科:https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session
WebSocket
当框架支持 WebSocket 通信协议时,其实现方式有所不同。
你应该看看他们的示例,找到适合你的方案。我的同事试用了所有这些方案,他告诉我,与其他方案相比,Iris 实现了功能最齐全的 WebSocket 连接,而且 API 也更易于使用。
维基百科:https://en.wikipedia.org/wiki/WebSocket
嵌入到应用程序中的视图(又称模板)
通常情况下,您需要将所有模板文件与 Web 应用程序的可执行文件一起传输。嵌入到应用程序中意味着该框架支持与go-bindata集成,因此最终的可执行文件包含模板,以[]byte.
什么是视图引擎
当框架支持模板加载时,自定义和内置模板函数可以在关键部分拯救我们。
查看引擎:标准版
当框架支持通过标准html/template解析器加载模板时。
查看引擎:哈巴狗
当框架支持通过解析器加载模板时Pug。
视图引擎:Django
当框架支持通过解析器加载模板时Django。
查看引擎:车把
当框架支持通过解析器加载模板时Handlebars。
查看引擎:琥珀色
当框架支持通过解析器加载模板时Amber。
渲染器:Markdown、JSON、JSONP、XML……
当框架的上下文能够让你轻松地发送/自定义各种内容类型的响应时。
MVC
模型-视图-控制器(MVC)是一种用于在计算机上实现用户界面的软件架构模式。它将一个应用程序划分为三个相互关联的部分。这样做是为了将信息的内部表示与信息的呈现方式和接收方式分离。MVC 设计模式解耦了这些主要组件,从而实现了高效的代码重用和并行开发。
- Iris 支持完整的 MVC 功能,可在运行时注册。
- Beego 仅支持方法和模型匹配,可在运行时注册。
- Revel 支持方法、路径和模型匹配,只能通过生成器(您必须运行的另一个软件来构建您的 Web 应用程序)进行注册。
维基:https ://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
缓存
Web缓存(或HTTP缓存)是一种信息技术,用于临时存储(缓存)网页文档,例如HTML页面和图像,以减少服务器延迟。Web缓存系统会记录通过它的请求;如果满足特定条件,后续请求可能会直接从缓存中获取。[1] Web缓存系统既可以指代设备,也可以指代计算机程序。
维基百科:https://en.wikipedia.org/wiki/Web_cache
文件服务器
当您可以将一个(物理)目录注册到路由时,该路由将自动向客户端提供该目录中的文件。
文件服务器:嵌入到应用程序中
通常情况下,您需要将所有静态文件(例如资源文件、CSS、JavaScript 文件等)与应用程序的可执行文件一起传输。支持此功能的框架允许您将所有这些数据嵌入到应用程序内部,以 `<script>` 标签的形式表示。[]byte由于服务器可以直接提供这些数据,而无需在物理位置查找文件,因此响应速度也更快。
在发送之前,响应可以在生命周期内多次修改。
目前只有 Iris 通过其 http_context 中的内置响应写入器支持此功能。
如果框架支持此功能,则可以在发送到客户端之前检索、重置或修改已写入的状态代码、正文和标头(在基于 net/http 的 Web 框架中,默认情况下这是不可能的,因为写入时无法检索或更改正文和状态代码)。
Gzip
当你在路由处理程序中,并且可以更改响应写入器以使用 gzip 压缩发送响应时,框架应该处理发送的标头,如果发生任何错误,它应该将响应写入重置为正常状态,并且它还应该能够检查客户端是否支持 gzip。
gzip 是一种文件格式和用于文件压缩和解压缩的软件应用程序。
维基百科:https://en.wikipedia.org/wiki/Gzip
测试框架
当您可以使用特定的框架库来测试 HTTP 时,它的作用就是帮助您轻松编写更好的测试。
例如(目前只有 Iris 支持此功能)
func TestAPI(t *testing.T) {
app := myIrisApp()
tt := httptest.New(t, app)
tt.GET("/admin").WithBasicAuth("name", "pass").Expect().
Status(httptest.StatusOK).Body().Equal("welcome")
}
myIrisApp返回你的虚拟 Web 应用程序,
它有一个 GET 处理程序,/admin该处理程序受基本身份验证保护。
上述简单测试检查是否/admin响应了Status OK指定的用户名和密码,并且身份验证是否通过,其正文为"welcome":
TypeScript 转译器
TypeScript 的目标是成为 ES6 的超集,除了标准定义的所有新特性之外,它还将添加静态类型系统。TypeScript 还拥有一个转译器,可以将我们的 TypeScript 代码(即 ES6 + 类型)转换为 ES5 或 ES3 JavaScript 代码,以便我们可以在现代浏览器中使用它。
在线编辑
借助在线编辑器,您可以快速轻松地在线编译和运行 Go 代码。
日志系统
自定义日志系统,通过提供颜色编码、格式化、日志级别分离、不同的日志后端等实用功能,扩展原生日志包的行为。
维护与自动更新
以非侵入式的方式告知框架用户“即时”更新。
本文最初发布于:https://medium.com/@MarinescuEdwar1/top-6-web-frameworks-for-go-as-of-2017-23270e059c4b
再见!
感谢阅读,如果您喜欢这篇文章,请用表情符号点赞!
文章来源:https://dev.to/speedwheel/top-6-web-frameworks-for-go-as-of-2017-34i