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}

路由: 以上所有规则相结合而不产生冲突 这是一个高级且有用的功能,目前在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包 这意味着

  • 这些框架能够直接访问 *http.Request 和 http.ResponseWriter 的上下文信息
  • 一种将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应用中注入子域名的路径

  • 辅助功能 意味着这个功能并不被这个框架原生支持,但是你仍旧可以通过启用多个 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 应用)

缓存 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转译器

在线编辑器

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

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

小结

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

golang websocket绑定用户_Golang(五)最佳Web框架对比相关推荐

  1. Golang最佳Web框架对比

    Beego 面向Go编程语言的开源高性能web框架 https://github.com/astaxie/beego https://beego.me Buffalo 使用Go语言快速构建Web应用 ...

  2. python django 动态网页_Django-手撸简易web框架-实现动态网页-wsgiref初识-jinja2初识-python主流web框架对比-00...

    自己动手实现一个简易版本的web框架 在了解python的三大web框架之前,我们先自己动手实现一个. 备注: 这部分重在掌握实现思路,代码不是重点 代码中也有许多细节并未考虑,重在实现思路 手撸一个 ...

  3. python web框架对比_Python六大开源框架对比

    Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...

  4. FastAPI - 一款新型的 Python Web 框架(对比 Flask)

    近日曾想尽办法为 Flask 实现 Swagger UI 文档功能,找到的实现方式基本上是 Flask + Flasgger, 记录在 Flask 应用集成 Swagger UI.然而不断的 Goog ...

  5. Java Web框架对比SSH和SSM

    SSH:Spring+Struts2+Hibernate SSM:Spring+SpringMVC+MyBaitis 两个框架都是IoC容器+MVC框架+ORM框架. IoC的意思是控制反转,意思是把 ...

  6. 第9章 Python Web 框架考察点

    Python WSGI与web框架常考点 WSGI 常见Web框架 ◆什么是WSGI? ◆常用的 Python Web框架Dang/Fask/Tornado对比 ◆web框架的组成(淡化框架,加强基础 ...

  7. 主流的6个Go语言Web框架

    GO 语言爱好者的最佳Web框架 如果你是自己写一个小应用程序,那你可能不需要Web框架.但是如果你要做产品,那么你肯定需要一个好的框架. 如果你认为你有相应的知识和经验,你会自己编写所有的这些代码么 ...

  8. golang 包含文本_Golang教程之Web篇(七)

    首先,大家一起思考一个问题:何为Web编程? 严格来说,这只是一个叫法,并没有学术上的定义,但是一般大家都说到web都是指浏览器相关,所以大家一般说的web开发要么是PC Web要么就是手机Web,不 ...

  9. golang web 框架 gin beego iris 对比

    1.1 框架排名 Gin 31k [Lite] Beego 22k Iris 16k Echo 15k [Lite] Revel 11k Martini 10k [×] buffalo 5k [Lit ...

最新文章

  1. 网页(Webpage)粒度分析算法
  2. 史上最扯Java图形绘制(J2SE)之一JAVA动画效果
  3. CCNP第四天(2) 配置、校验OSPF特殊区域类型-完全Stub区域
  4. Step By Step_Java通过JNI调C程序执行
  5. pytorch中tensorboard使用
  6. 换工作了,开始用金蝶的BOS了,好多东西都要学啊!
  7. 用任意合法序列建立一棵二叉树(洛谷P1305题题解,Java语言描述)
  8. iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController
  9. Python之面向对象进阶篇
  10. [原创]基于EDFlib/C++实现脑电数据EDF标准格式读写
  11. PHP-阿里云oss使用
  12. c语言int【】=(123456789) 元素a【】的值,算法-用C语言实现
  13. ELEMENT UI中关于上传图片el-upload控件删除(同时删除后台图片信息)
  14. 动态SQL之choose
  15. HBuilder的常用快捷键
  16. 前端入门学习笔记(三十五)vue.js入门(三)条件 v-if 与循环 v-for,v-for 中 in 和 of 的区别
  17. 【MySQL】mysql数据库操作指南
  18. OpenNI 1.3.2.1发布
  19. python编写四则运算_python实现四则运算
  20. 最新表白墙网站源码 手机电脑自适应 带后台

热门文章

  1. BGP路由器协议排错教程:缺失 BGP 路由的排错
  2. python爬虫解决频繁访问_爬虫遇到IP访问频率限制的解决方案
  3. 微服务模板: 后端Hello World - Java SpringBoot REST
  4. 绩效培训薪酬管理绿色植物风格PPT模板
  5. 什么叫做工作票?什么是工作票和操作票制度?
  6. python并列条件_if函数如何多个条件并列
  7. 华为成立四大军团,字节开启今年第2次回购,1年半回报率近300%
  8. 2021-05-29Leetcode114.二叉树展开为链表
  9. Air800(GPRS+GPS模块)连接OneNet平台
  10. Pig_6. 数据摄取 输出 -- Protocel Buffer -- 待完善(腾讯 TDW 项目)