page contents

Golang最佳Web框架对比:谁更好一目了然了

六款Web框架 Beego 面向Go编程语言的开源高性能web框架 Buffalo 使用Go语言快速构建Web应用 Echo 高性能、极简Go语言Web框架 Gin Go语言编写的HTTP Web框架,它以更好的性能实现...

attachments-2021-05-hItyJy0v60a5ccc0214a6.png

六款Web框架


Beego 面向Go编程语言的开源高性能web框架


Buffalo 使用Go语言快速构建Web应用


Echo 高性能、极简Go语言Web框架


Gin Go语言编写的HTTP Web框架,它以更好的性能实现了类似Martini的API,性能更好


Iris 全宇宙最快的Go语言Web框架,完备MVC支持,拥抱未来


Revel Go语言的高效、全栈Web框架


流行度

attachments-2021-05-A51CXMNL60a5cb4317f5b.jpeg

学习曲线

attachments-2021-05-RswwBdnp60a5cb5f7c1e5.jpeg

astaxie 和 kataras 分别为 Beego 和 Iris 整理了许多例子供开发者参考学习


核心功能

pic几个知名的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)
  1. /user
  2. /user/profile
  3. /user/signup

可以从分组中再创建子分组

    myGroup.Group("/messages", optionalUserMessagesMiddleware)
    myGroup.Handle("GET', "/{id}", getMessageByID)
  1. /user/messages/{id}

路由: 以上所有规则相结合而不产生冲突 这是一个高级且有用的功能,目前在Go语言框架方面只有Iris能支持这一功能。这意味着类似如 /{path wildcard}, /user/{username}和/user/static以及/user/{path wildcard}等路径都可以在同一个路由中通过静态路径/user/static或通配符/user/{path *wildcard}来正确匹配

路由: 自定义HTTP异常 指可以自行处理请求错误的情况。HTTP的错误状态码>=400,例如,请求的资源不存在 NotFound 404

    OnErrorCode(404, myNotFoundHandler)

上述大多数Web框架只支持404,405及500错误状态的处理,Iris能够支持任意错误,Beego和Revel也能支持完备的HTTP错误状态码

100%兼容net/http包 这意味着

  1. 这些框架能够直接访问 *http.Request 和 http.ResponseWriter 的上下文信息
  2. 一种将net/http handler转换为特定框架类型handler的方法

中间件生态系统 框架会为你提供一个完整的引擎来定义流程、全局、单个或一组路由,而不需要自己用不同的中间件来封装每一部分的handlers

类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)

服务器程序: 优雅关闭 当按下CTRL C关闭终端应用程序时,服务器将等待(特定的超时时间)其他的连接完成相关任务或触发一个自定义事件来做清理工作(比如: 关闭数据库),最后优雅的终止服务

服务器程序: 多重监听 框架的服务器支持自定义的net.Listener或使用多个http服务器和地址为web应用程序提供服务

完全支持HTTP/2 框架可以很好的处理https请求的http/2协议,并支持服务器push功能子域名 可以直接在Web应用中注入子域名的路径

  1. 辅助功能 意味着这个功能并不被这个框架原生支持,但是你仍旧可以通过启用多个 http 服务器来实现。缺点在于:主程序和子域名程序之间并不是连通的,默认情况下,它们不能共享逻辑

会话(Sessions) 支持HTTP Sessions,且可以在自定义的handlers中使用sessions

  1. 一些 Web 框架支持后台数据库来储存 sessions,以便在服务器重启之后仍旧能获得持久的 sessions
  2. 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 设计模式将这三个组件解耦合,从而实现高效的代码复用和并行开发

  1. Iris 支持完备的 MVC 功能, 可以在运行时中注入
  2. Beego 仅支持方法和数据模型的匹配,可以在运行时中注入
  3. Revel 支持方法,路径和数据模型的匹配,只可以通过生成器注入(生成器是另外一个不同的软件用于构建你的 Web 应用)

缓存 Web 缓存是一种用于临时存储(缓存)网页文档,如 HTML 页面和图像,来减缓服务器延时。一个 Web 缓存系统缓存网页文档,使得后续的请求如果满足特定条件就可以直接得到缓存的文档。Web 缓存系统既可以指设备,也可以指软件程序

文件服务器 可以注册一个(物理的)目录到一个路径,使得这个路径下的文件可以自动地提供给客户端

文件服务器: 内嵌入应用 通常情况下,必须将所有的静态文件(比如assets: CSS, JavaScript 文件等)与应用程序的可执行文件一起传输。支持此项功能的框架为你提供了在应用中,以 []byte 的形式,内嵌所有这些数据的机会。由于服务器可以直接使用这些数据而无需在物理位置查找文件,它们的响应速度也将更快

响应在发送前可以在整个生命周期中修改多次 当框架支持此功能时,可以在返回给客户端之前检索、重置或修改状态码、body及headers。默认情况下,在基于 net/http 的 Web 框架中这是不可能的,因为正文和状态码一经写定就不能被检索或修改。目前只有 Iris 通过 http_context 中内建的的响应写入器(response writer)支持这个功能

Gzip 在一个路由的handler中,并且可以改变响应写入器(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转译器

在线编辑器

日志系统 自定义日志系统通过提供有用的功能,如日志输出、格式化、日志级别分离及不同的日志记录后端等,来扩展原生日志包

维护和自动更新 以非侵入的方式通知框架的用户即时更新

小结

框架一直是敏捷开发中的利器,能让开发者很快上手并作出应用。成长不会一蹴而就,会经历从入门到深入,再到精通框架的过程,找到学习和应用它的价值,就不会入门便放弃了。

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-ZSE6wWLz62ac14ba35d1e.jpeg

  • 发表于 2021-05-20 10:45
  • 阅读 ( 1884 )
  • 分类:Golang

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1320 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章