没关注? 伸出手指点这里
Golang系列
Golang是一门快速增长的语言,专为构建简单、快速且可靠的软件而设计。它提供的net/http库对于HTTP协议实现非常好,基于此再构造框架会更容易,因此生态中出现了很多框架。本文将从流行度、社区支持及内建功能等角度对六款知名Go语言Web框架做对比
六款Web框架
Beego 面向Go编程语言的开源高性能web框架
https://github.com/astaxie/beego
https://beego.me
Buffalo 使用Go语言快速构建Web应用
https://github.com/gobuffalo/buffalo
https://gobuffalo.io
Echo 高性能、极简Go语言Web框架
https://github.com/labstack/echo
https://echo.labstack.com
Gin Go语言编写的HTTP Web框架,它以更好的性能实现了类似Martini的API,性能更好
https://github.com/gin-gonic/gin
https://gin-gonic.github.io/gin
Iris 全宇宙最快的Go语言Web框架,完备MVC支持,拥抱未来
https://github.com/kataras/iris
https://iris-go.com
Revel Go语言的高效、全栈Web框架
https://github.com/revel/revel
https://revel.github.io
流行度
按流行度(Github Star数量)排序学习曲线
astaxie 和 kataras 分别为 Beego 和 Iris 整理了许多例子供开发者参考学习核心功能
根据功能有多到少排序 几个知名的Go语言Web框架(Echo、Gin和Buffalo)由于没有完备支持所有功能,并不能算是真正意义上的Web框架,但大部分go社区认为它们是的,因此,有必要将这几个框架也列在表格中可以和Iris、Beego、Revel做比较。 以上这些框架,除了Beego和Revel之外,都可以适配任意net/http中间件,其中一部分框架可以轻松地做适配,另外一些可能就需要额外的努力词汇解析
路由: 命名参数和通配符 支持注册动态路径 命名路径参数示例// 路径参数 username 取值分别是 me,speedwheel"/user/{username}" 匹配到 "/user/me", "/user/speedwheel" 等等
通配符示例
// 路径参数 path 对应的分别是 /user/some/path/here 和 /user/this/is/a/dynamic/multi/level/path"/user/{path *wildcard}" 匹配到"/user/some/path/here","/user/this/is/a/dynamic/multi/level/path" 等等
Iris也支持一个叫micros的功能,它可以被表示为 /user/{username: string} 或 /user/{username: int min(1)}
路由: 正则表达式
支持过滤动态路径
例如
"/user/{id ^[0-9]$}" 匹配到 "/user/42" 但不会匹配 "/user/somestring"
路由: 分组
通过共用逻辑或中间件来处理有共同前缀的路径组
例如
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}
OnErrorCode(404, myNotFoundHandler)
上述大多数Web框架只支持404,405及500错误状态的处理,Iris能够支持任意错误,Beego和Revel也能支持完备的HTTP错误状态码
100%兼容net/http包 这意味着
这些框架能够直接访问 *http.Request 和 http.ResponseWriter 的上下文信息
一种将net/http handler转换为特定框架类型handler的方法
.Get or GET("/path", gethandler).Post or POST("/path", postHandler).Put or PUT("/path", putHandler) and etc.
服务器程序: 自动启用HTTPS
框架的服务器支持注册及自动更新SSL证书来管理新传入的SSL/TLS连接(https)
服务器程序: 优雅关闭
当按下CTRL+C关闭终端应用程序时,服务器将等待(特定的超时时间)其他的连接完成相关任务或触发一个自定义事件来做清理工作(比如: 关闭数据库),最后优雅的终止服务
服务器程序: 多重监听
框架的服务器支持自定义的net.Listener或使用多个http服务器和地址为web应用程序提供服务
完全支持HTTP/2
框架可以很好的处理https请求的http/2协议,并支持服务器push功能
子域名 可以直接在Web应用中注入子域名的路径
辅助功能
意味着这个功能并不被这个框架原生支持,但是你仍旧可以通过启用多个 http 服务器来实现。缺点在于:主程序和子域名程序之间并不是连通的,默认情况下,它们不能共享逻辑
会话(Sessions)
支持HTTP Sessions,且可以在自定义的handlers中使用sessions
一些 Web 框架支持后台数据库来储存 sessions,以便在服务器重启之后仍旧能获得持久的 sessions
Buffalo 使用 gorilla 的 sessions 库,它比其他框架的实现略微慢了一点
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通信协议,不同框架有不同的实现方式,其中Iris实现了websocket最多功能并提供了相对更容易使用的API
程序内嵌对视图(模版)的支持
通常情况下,你必须根据 Web 应用的可执行文件一一对应地转换模版文件。
内嵌到应用中意味着这个框架集成了
go-bindata
,因此在最终的可执行文件中可以以 []byte 的形式将模版包含进来
视图引擎
框架支持模版加载、自定义及内建模版功能,节省开发时间
视图引擎: STD 框架支持通过标准的 html/template 解析器加载模版
视图引擎: Pug 框架支持通过 Pug 解析器加载模版
视图引擎: Django 框架支持通过 Django 解析器加载模版
视图引擎: Handlebars 框架支持通过 Handlebars 解析器加载模版
视图引擎: Amber 框架支持通过 Amber 解析器加载模版
渲染: Markdown, JSON, JSONP, XML...
框架提供一个简单的方法来发送和自定义各种内容类型的响应
MVC
Model-view-controller(MVC)
模型是一种用于在计算机上实现用户界面的软件架构模式,它将一个应用程序分为互相关联的三部分。
这样做的目的是为了:
将信息的内部处理逻辑、信息呈现给用户以及从用户获取信息三者分离。
MVC 设计模式将这三个组件解耦合,从而实现高效的代码复用和并行开发
Iris 支持完备的 MVC 功能, 可以在运行时中注入
Beego 仅支持方法和数据模型的匹配,可以在运行时中注入
Revel 支持方法,路径和数据模型的匹配,只可以通过生成器注入(生成器是另外一个不同的软件用于构建你的 Web 应用)
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转译器
在线编辑器
日志系统
自定义日志系统通过提供有用的功能,如日志输出、格式化、日志级别分离及不同的日志记录后端等,来扩展原生日志包
维护和自动更新
以非侵入的方式通知框架的用户即时更新
小结
框架一直是敏捷开发中的利器,能让开发者很快上手并作出应用。成长不会一蹴而就,会经历从入门到深入,再到精通框架的过程,找到学习和应用它的价值,就不会入门便放弃了
推 荐 阅 读
[1] https://github.com/speedwheel/awesome-go-web-frameworks
[2] https://github.com/kataras/iris/tree/master/_examples
[3] https://beego.me/docs
[4] https://echo.labstack.com/cookbook/hello-world
[5] https://github.com/gin-gonic/gin/tree/master/examples
[6] http://revel.github.io/examples/index.html
[7] https://gobuffalo.io/docs/installation
[8] https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session
[9] https://en.wikipedia.org/wiki/WebSocket
Golang(四)语言特性
Golang(三)命令行工具集
Golang(二)高效编程
Go 1.13 新特性