当前位置: 首页 > 科技观察

Golang中六款优秀Web框架的比较

时间:2023-03-18 21:56:20 科技观察

Golang是一种快速发展的语言,旨在构建简单、快速、可靠的软件。它提供的net/http库对于HTTP协议的实现非常好,基于此重构框架会更容易,所以生态中出现了很多框架。本文将从流行度、社区支持、内置功能等方面对六大著名的Go语言Web框架进行比较。六大Web框架Beego是Go编程语言的开源高性能Web框架https://github.com/astaxie/beegohttps://beego.meBuffalo使用Go语言快速构建Web应用https://github。com/gobuffalo/buffalohttps://gobuffalo.ioEcho高性能、极简的Go语言web框架https://github.com/labstack/echohttps://echo.labstack.comHTTPweb框架,用GinGo语言编写,性能更好实现了性能更好的类似Martini的APIhttps://github.com/gin-gonic/ginhttps://gin-gonic.github.io/ginIris宇宙中最快的Go语言web框架,完整MVC支持,拥抱未来https://github.com/kataras/irishttps://iris-go.comRevelGo语言的高效全栈网络框架https://github.com/revel/revelhttps://github.com/revel/revelhttps://iris-go.com/revel.github.ioastaxie和kataras的流行学习曲线分别为Beego和Iris编译了很多例子供开发者学习核心功能s的网络框架。Web框架的核心功能与几个著名的Go语言Web框架(Echo、Gin和Buffalo)相比,因为它们并没有完全支持所有功能。它不能被视为真正的Web框架,但大多数Go社区认为它们是。因此,有必要将这些框架列在表格中,与Iris、Beego、Revel进行对比。以上框架,除了Beego和Revel,都可以适配任何net/http中间件,有的可以轻松适配,有的可能需要额外的努力Lexicon解析Routing:Namedparametersandwildcardssupportregistration动态路径命名路径示例parameters//路径参数username的值为me,speedwheel"/user/{username}"匹配"/user/me"、"/user/speedwheel"等通配符示例//Path参数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:intmin(1)}routing:正则表达式支持过滤动态路径“/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支持这个特性。这意味着像/{pathwildcard}、/user/{username}和/user/static和/user/{pathwildcard}这样的路径可以在同一个路由中找到,使用静态路径/user/static或通配符/user/{path*wildcard}正确匹配路由:自定义HTTP异常是指请求错误可以自行处理的情况。HTTP错误状态码>=400,例如请求的资源不存在NotFound404OnErrorCode(404,myNotFoundHandler)以上web框架大多只支持404、405、500错误状态处理,Iris可以支持任意错误,Beego和Revel还可以支持CompleteHTTP错误状态码100%兼容net/http包,这意味着这些框架可以直接访问*http.Request和http.ResponseWriter的上下文信息将net/http处理程序转换为特定框架类型的方法handlersMiddlewareecology系统框架将为你提供一个完整的引擎来定义流程,全局的,单个的或一组路由,而不需要使用不同的中间件来封装每个部分的handlersSinatra-styleAPI可以注入在运行时处理特定HTTP方法(和路径参数)的代码。GetorGET("/path",gethandler).PostorPOST("/path",postHandler).PutorPUT("/path",putHandler)andetc.Serverprogram:自动启用HTTPS框架的服务器支持注册和自动更新SSL证书以管理新传入的SSL/TLS连接(https)服务器程序:Gracefulshutdown当按CTRL+C关闭终端应用时,服务器会等待(为指定的超时时间)为其他连接完成相关任务或触发自定义事件做清理(例如:关闭数据库),最后优雅地终止服务服务器程序:多听框架的服务器支持自定义网络.Listenerorusesmultiplehttpserversandaddressesforwebapplications程序提供的服务完全支持HTTP/2框架,可以很好的处理HTTP/2协议的https请求,支持服务器推送功能。子域名可以直接将子域名注入到web应用中。该框架本身支持它,但您仍然可以通过启用多个http服务器来实现。缺点是主程序和子域程序没有联系。默认情况下,它们不能共享逻辑会话(Session)来支持HTTPSession,可以在自定义处理程序中使用会话。一些web框架支持后台数据库存储session,这样服务器重启后仍然可以获取到持久化session。Buffalo使用的是gorilla的session库,速度比其他框架稍慢。funcsetValue(contexthttp_context){s:=Sessions.New(http_context)s.Set("key","myvalue")}funcgetValue(contexthttp_context){s:=Sessions.New(http_context)myValue:=s.Get("key")}funclogoutHandler(contexthttp_context){Sessions.Destroy(http_context)}Websockets支持websocket通信协议,不同的框架有不同的实现方式。其中,Iris实现了websocket的大部分功能,并提供了相对简单易用的API。程序内置了对视图(模板)的支持。通常情况下,你必须根据web应用程序的可执行文件一一对应。转换模板文件。嵌入到应用中意味着框架集成了go-bindata,因此模板可以以[]byte的形式包含在最终的可执行文件中。视图引擎框架支持模板加载、自定义和内置模板功能。节省开发时间视图引擎:STD框架支持通过标准html/模板解析器加载模板视图引擎:Pug框架支持通过Pug解析器加载模板视图引擎:Django框架支持通过Django解析器加载模板视图引擎:Handlebars框架支持通过Handlebars解析器加载模板视图引擎:Amber框架支持通过AmberParser加载模板渲染:Markdown、JSON、JSONP、XML...该框架提供了一种简单的方法来发送和自定义各种内容类型的响应用于在计算机上实现用户界面的软件体系结构模式,它将应用程序划分为三个相互关联的部分。这样做的目的是:分离信息内部处理逻辑,将信息呈现给用户,从用户那里获取信息。MVC设计模式将这三个组件解耦,以实现高效的代码重用和并行开发。Iris支持完整的MVC功能,可以在运行时注入。beego只支持方法和数据模型的匹配,可以在运行时注入。Revel支持方法、路径和数据模型匹配,只能通过生成器注入(生成器是另一种用于构建您的Web应用程序的不同软件)CacheWeb缓存是一种临时存储(缓存)Web文档的方法,例如HTML页面和图像以减慢服务器延迟。Web缓存系统缓存网页文档,以便后续请求在满足某些条件的情况下可以直接获取缓存的文档。Web缓存系统可以指代设备或软件程序。一个文件服务器可以注册一个(物理)目录到一个路径,这样这个路径下的文件就可以自动提供给客户端文件服务器:必须与应用程序可执行文件一起交付。支持此功能的框架使您有机会在应用程序中以[]byte的形式嵌入所有这些数据。它们的响应速度也会更快,因为服务器可以直接使用数据,而无需在物理位置查找文件。检索、重置或修改状态代码、正文和标题。默认情况下,这在基于net/http的Web框架中是不可能的,因为文本和状态代码一旦写入就无法检索或修改。目前只有Iris通过路由处理程序中的http_contextGzip中的内置响应编写器支持此功能,并且可以更改响应编写器以发送使用gzip压缩的响应,框架将处理响应标头。如果发生任何错误,框架应该将响应重置为正常,框架还应该能够检查客户端是否支持gzip压缩gzip是一种用于压缩和解压缩的文件格式,软件程序测试框架可以使用框架特定的库来帮助你轻松写出更好的测试代码来测试你的HTTP,下面的例子(目前只有Iris支持这个特性)funcTestAPI(t*testing.T){app:=myIrisApp()tt:=httptest.New(t,app)tt。GET("/admin").WithBasicAuth("name","pass").Expect().Status(httptest.StatusOK).Body().Equal("welcome")}myIrisApp返回虚构的网络应用程序,它有/admin路径的GET方法,受基本身份验证逻辑保护。上面这个简单的测试用例,使用name和pass通过认证,访问GET/admin,检查其响应状态是否为StatusOK,响应体是否为welcomeTypeScript翻译器在线编辑器日志系统自定义日志系统提供有用的功能,比如日志输出、格式化、日志级别分离、不同的日志后端等,扩展原生日志包维护和自动更新,以非侵入的方式通知框架的用户。它允许开发人员快速上手并制作应用程序。成长不会一蹴而就,会经历从入门到深化,再到掌握框架的过程。如果发现学习和应用的价值,上手后就不会放弃