六款最棒的Go语⾔Web框架简介
六款最棒的 Go 语⾔ Web 框架简介
⽬录
介绍
是⼀门正在快速增长的编程语⾔,专为构建简单、快速且可靠的软件⽽设计。 点击 查看有哪些优秀的公司正在使⽤ Go 语⾔来驱动他们的业务。
本⽂将会提供⼀切必要的信息来帮助开发⼈员了解更多关于使⽤ Go 语⾔来开发 Web 应⽤程序的最佳选择。
本⽂包含了最详尽的框架⽐较,从流⾏度、社区⽀持及内建功能等多个不同⾓度出发做对⽐。
Beego:开源的⾼性能 Go 语⾔ Web 框架。
Buffalo:使⽤ Go 语⾔快速构建 Web 应⽤。
Echo:简约的⾼性能 Go 语⾔ Web 框架。
Gin:Go 语⾔编写的 Web 框架,以更好的性能实现类似 Martini 框架的 API。
Iris:全宇宙最快的 Go 语⾔ Web 框架。完备 MVC ⽀持,未来尽在掌握。
Revel:Go 语⾔的⾼效、全栈 Web 框架。
流⾏度
按照流⾏度排⾏(根据 GitHub Star 数量)
学习曲线
astaxie 和 kataras 分别为 Beego 和 Iris 做了超棒的⼯作,希望其他的框架也能迎头赶上,为开发者提供更多的例⼦。⾄少对于我来说,如果我要切换到⼀个新的框架,那些例⼦就是最丰富的资源,来获取尽可能多的有⽤信息。⼀个实例胜千⾔啊。
核⼼功能
根据功能⽀持的多寡排⾏
⼏个知名的 Go 语⾔ Web 框架并不是真正意义上的框架,也就是说: Echo,Gin 和 Buffalo 并不是真正意义上的 Web 框架(因为没有完备⽀持所有功能)但是⼤部分的 Go 社区认为它们是的,因此这些框架也可以和 Iris,Beego 或 Revel 做⽐较。所以,我们有义务将这⼏个框架(Echo,Gin 和Buffalo)也列在这个表中。
以上所有这些框架,除了 Beego 和 Revel 之外,都可以适配任意 net/http 中间件。其中⼀部分框架可以轻松地做适配,另外⼀些可能就需要额外的努⼒[即使这⾥的痛苦不是⼀定的]。
技术性词汇
路由:命名的路径参数和通配符
可以处理动态的路径。
命名的路径参数例⼦:
"/user/{username}" 匹配 "/user/me","/user/speedwheel" 等等
上⾯路径参数 username 的值分别是 "me" 和 "speedwheel"。
通配符的例⼦:
"/user/{path *wildcard}" 匹配
"/user/some/path/here",
"/user/this/is/a/dynamic/multi/level/path" 等等
上⾯的路径参数 path 对应的分别是 "some/path/here" 和 "this/is/a/dynamic/multi/level/path"。
Iris 也⽀持⼀个叫 macros 的功能,它可以被表⽰为 /user/{username:string} 或者 /user/{username:int min(1)}。
路由:正则表达式
过滤动态的路径。
例如:
"/user/{id ^[0-9]$}" 能匹配 "/user/42" ,但不会匹配 "/user/somestring"
这⾥的路径参数 id 的值为 42。
路由:分组
通过共⽤逻辑或中间件来处理有共同前缀的路径组。
例如:
myGroup := Group("/user", userAuthenticationMiddleware)
myGroup.Handle("GET", "/", userHandler)
myGroup.Handle("GET", "/profile", userProfileHandler)
myGroup.Handle("GET", "/signup", getUserSignupForm)
/user
/user/profile
/user/signup
你甚⾄可以从⼀个组中创建⼦分组:
myGroup.Group("/messages", optionalUserMessagesMiddleware)
myGroup.Handle("GET', "/{id}", getMessageByID)
/user/messages/{id}
路由:上述所有规则相结合⽽没有冲突
这是⼀个⾼级且有⽤的的功能,我们许多⼈都希望路由模块或 Web 框架能⽀持这点,但⽬前,在 Go 语⾔框架⽅⾯,只有 Iris 能⽀持这⼀功能。
这意味着类似如 /{path *wildcard} , /user/{username} 和 /user/static 以及 /user/{path *wildcard} 等路径都可以在同⼀个路由中通过静态路径(/user/static)或通配符(/{path
*wildcard})来正确匹配。
路由:⾃定义 HTTP 错误
指可以⾃⾏处理请求错误的情况。 Http 的错误状态码均 >=400 ,⽐如 NotFound 404,请求的资源不存在。
例如:
OnErrorCode(404, myNotFoundHandler)
上述的⼤多数 Web 框架只⽀持 404,405 及 500 错误状态的处理,但是例如 Iris,Beego 和 Revel 等框架,它们完备⽀持 HTTP 错误状态码,甚⾄⽀持 any error 任意错误。(any error -- 任意错误,只有 Iris 能够⽀持)。
100% 兼容 net/http
这意味著:
这些框架能够让你直接获取 *http.Request 和 http.ResponseWriter 的所有相关信息。
各框架提供各⾃相应处理 net/http 请求的⽅法。
中间件⽣态系统
框架会为你提供⼀个完整的引擎来定义流程、全局、单个或⼀组路由,⽽不需要你⾃⼰⽤不同的中间件来封装每⼀部分的处理器。框架会提供⽐如 Use(中间件)、Done(中间件)等函数。
类 Sinatra 的 API 设计(译者注:是⼀门基于 Ruby 的)
可以在运⾏时中注⼊代码来处理特定的 HTTP ⽅法 (以及路径参数)。
例如:
.Get or GET("/path", gethandler)
.Post or POST("/path", postHandler)
.Put or PUT("/path", putHandler) and etc.
服务器程序:默认启⽤ HTTPS
框架的服务器⽀持注册及⾃动更新 SSL 证书来管理新传⼊的 SSL/TLS 连接 (https)。 最著名的默认启⽤ https 的供应商是 。
服务器程序:平滑关闭(Gracefully Shutdown)
当按下 CTRL + C 关闭你的终端应⽤程序时,服务器将等待 (⼀定的等待时间)其他的连接完成相关任务或触发⼀个⾃定义事件来做清理⼯作(⽐如:关闭数据库),最后平滑地停⽌服务。
服务器程序:多重监听
框架的服务器⽀持⾃定义的 net.Listener 或可以启动⼀个有多个 http 服务和地址的 Web 应⽤。
完全⽀持 HTTP/2
框架可以很好地⽀持处理 https 请求的 HTTP/2 协议,并且⽀持服务器 Push 功能。
⼦域名
你可以直接在你的 Web 应⽤中注⼊⼦域名的路径。
辅助功能(secondary) 意味着这个功能并不被这个框架原⽣⽀持,但是你仍旧可以通过启⽤多个 http 服务器来实现。这样做的缺点在于:主程序和⼦域名程序之间并不是连通的,默认情况下,它们不能共享逻辑。
会话(Sessions)
⽀持 http sessions,且可以在⾃定义的处理程序中使⽤ sessions。
有⼀些 Web 框架⽀持后台数据库来储存 sessions,以便在服务器重启之后仍旧能获得持久的 sessions。
Buffalo 使⽤,它⽐其他框架的实现略微慢了⼀点。
例如:
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)
}
⽹络套接字(Websockets)
框架⽀持 websocket 通信协议。不同的框架对于这点有各⾃不同的实现⽅式。
你应该通过它们的例⼦来看看哪个适合你。我的⼀个同事,在试过了上述所有框架中的 websocket 功能之后告诉我:Iris 实现了最多的 websocket 特性,并且提供了相对更容易使⽤的 API 。
程序内嵌对视图(⼜名模版)的⽀持
通常情况下,你必须根据 Web 应⽤的可执⾏⽂件⼀⼀对应地转换模版⽂件。内嵌到应⽤中意味着这个框架集成了 ,因此在最终的可执⾏⽂件中可以以 []byte 的形式将模版包含进来。
什么是视图引擎
框架⽀持模版加载、⾃定义及内建模版功能,以此来节省我们的开发时间。
视图引擎:STD
框架⽀持标准的 html/template 解析器加载模版。
web编程语言有哪些视图引擎:Pug
框架⽀持 Pug 解析器加载模版。
视图引擎:Django
框架⽀持 Django 解析器加载模版。
视图引擎:Handlebars
框架⽀持 Handlebars 解析器加载模版。
视图引擎:Amber
框架⽀持 Amber 解析器加载模版。
渲染:Markdown, JSON, JSONP,
框架提供⼀个简单的⽅法来发送和⾃定义各种内容类型的响应。
MVC
Model–view–controller (MVC) 模型是⼀种⽤于在计算机上实现⽤户界⾯的软件架构模式,它将⼀个应⽤程序分为互相关联的三部分。这样做的⽬的是为了:将信息的内部处理逻辑、信息呈现给⽤户以及从⽤户获取信息三者分离。MVC 设计模式将这三个组件解耦合,从⽽实现⾼效的代码复⽤和并⾏开发。
Iris ⽀持完备的 MVC 功能, 可以在运⾏时中注⼊。
Beego 仅⽀持⽅法和数据模型的匹配,可以在运⾏时中注⼊。
Revel ⽀持⽅法,路径和数据模型的匹配,只可以通过⽣成器注⼊(⽣成器是另外⼀个不同的软件⽤于构建你的 Web 应⽤)。
缓存
Web 缓存(或 http 缓存)是⼀种⽤于临时存储(缓存)⽹页⽂档,如 HTML 页⾯和图像,来减缓服务器延时。⼀个 Web 缓存系统缓存⽹页⽂档,使得后续的请求如果满⾜特定条件就可以直接得到缓存的⽂档。Web 缓存系统既可以指设备,也可以指软件程序。
⽂件服务器
可以注册⼀个(物理的)⽬录到⼀个路径,使得这个路径下的⽂件可以⾃动地提供给客户端。
⽂件服务器:内嵌⼊应⽤
通常情况下,你必须将所有的静态⽂件(⽐如静态资产,assets:CSS,JavaScript ⽂件等)与应⽤程序的可执⾏⽂件⼀起传输。⽀持此项功能的框架为你提供了在应⽤中,以[]byte 的形式,内嵌所有这些数据的机会。由于服务器可以直接使⽤这些数据⽽⽆需在物理位置查⽂件,它们的响应速度也将更快。
响应可以在发送前的⽣命周期中被多次修改
⽬前只有 Iris 通过 http_context 中内建的的响应写⼊器(response writer)⽀持这个功能。
当框架⽀持此功能时,你可以在返回给客户端之前检索、重置或修改状态码、正⽂(body)及头部(headers)。默认情况下,在基于 net/http 的 Web 框架中这是不可能的,因为正⽂和状态码⼀经写定就不能被检索或修改。
Gzip
当你在⼀个路由的处理程序中,并且你可以改变响应写⼊器(response writer)来发送⼀个⽤ gzip 压
缩的响应时,框架会负责响应的头部。如果发⽣任何错误,框架应该把响应重置为正常,框架也应该能够检查客户端是否⽀持 gzip 压缩。
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 应⽤,它有⼀个针对 /admin 路径的 GET ⽅法,它有基本的⾝份验证逻辑保护。
上⾯这个简单的测试,⽤ "name" 和 "pass" 通过⾝份验证并访问 GET /admin ,检查它的响应状态是否为 Status OK,并且响应的主体是否为 "welcome" 。
TypeScript 转译器
TypeScript 的⽬标是成为 ES6 的超集。除了标准定义的所有新特性外,它还增加了静态类型系统。TypeScript 还有转换器⽤于将 TypeScript 代码(即 ES6 + 类型)转换为ES5 或 ES3 JavaScript 代码,如此我们就可以在现今的浏览器中运⾏这些代码了。
在线编辑器
在在线编辑器的帮助下,你可以快速轻松地在线编译和运⾏代码。
⽇志系统
⾃定义⽇志系统通过提供有⽤的功能,如彩⾊⽇志输出、格式化、⽇志级别分离及不同的⽇志记录后端等,来扩展原⽣⽇志包。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论