大家好,我是polarisxu。每次发布框架相关的文章,总会有人提到GoFiber框架。于是乎,学习了Fiber之后,感觉真??的很好。所以写这个纤维系列。Fiber项目地址:https://github.com/gofiber/fiber,目前Star数15.3k+。01Fiberframework这是一个受NodeJS框架启发的Go语言web框架:Express。该框架基于FastHTTP构建,旨在实现简单性、零内存分配和改进的性能以实现快速开发。如果你是NodeJS开发者并且想学习Go,这个框架应该适合你。同时,还有专门为NodeJS开发者准备的Go学习资料:https://github.com/miguelmota/golang-for-nodejs-developers的框架于2020年1月上线,没想到短时间内引起大量关注。从README的多语言可以看出:从第三方性能测试的结果来看,Fiber的性能要比Gin和Echo好很多。下面是详细的Benchmark测试说明:https://docs.gofiber.io/extra/benchmarks。官方Fiber哲学的摘录:Fiber作为一个Web框架,在创建时考虑了极简主义并遵循UNIX方法,因此新的gophers可以在热情和值得信赖的欢迎下快速进入Go世界。Fiber的灵感来自互联网上最流行的Web框架Express。我们结合了Express的易用性和Go的原始性能。如果您曾经在Node.js上实现过Web应用程序(使用Express或类似的东西),许多方法和原则对您来说应该是不言自明的。我们在问题和Discord频道中关注整个互联网用户的消息,以创建一个快速、灵活和友好的Goweb框架,以满足任何任务、截止日期和开发人员技能。就像Express在JavaScript世界中一样。所以,总结一下Fiber的特点(优点):强大的路由静态文件服务极高性能低内存占用API接口中间件和Next支持快速服务器端编程支持各种模板引擎WebSocket支持Frequencylimiter文件翻译成16种但是,关于语言有两点需要注意。Fiber使用了unsafe和fasthttp,因此它可能与最新版本的Go存在兼容性问题。目前Fiber2.18.0兼容Go1.14到Go1.17;但是fasthttp和net/http不兼容,所以net/http生态项目不能在fiber上使用。02和Express的简单对比既然是受Express启发的,那我们就对比一下吧。基于HelloWorldExpress的HelloWorld程序:constexpress=require("express");//参考Expresslibraryconstapp=express();//创建一个Express实例//路由:/endpointapp.get("/",(req,res)=>{res.send("HelloWorld!");});//在3000端口启动服务app.listen(3000);真的很简单,几行代码就可以搞定一个web服务。现在使用Fiber实现类似上面的功能:packagemainimport"github.com/gofiber/fiber/v2"//注意最新版本是v2.18.0,所以有v2funcmain(){app:=fiber.New()//创建一个Fiber实例//routing:/endpointapp.Get("/",func(c*fiber.Ctx)error{returnc.SendString("Hello,World!")})//在3000端口启动服务app.Listen(":3000")}目前几乎所有的Go框架都采用类似的方式,这里不多做解释。Fiber启动后终端输出:$gorunmain.go┌──────────────────────────────────────────────────────────────────────────────────────────────┐│Fiberv2.18.0││http://127.0.0.1:3000││(boundonhost0.0.0.0andport3000)│││处理程序.................2进程..........1││Prefork............DisabledPID............83538│└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘和端点任何网络应用程序、微服务或API都包含一个基于描述HTTP方法和处理函数的端点的路由系统,这些方法和处理函数仅在此端点收到来自客户端的请求后执行。除了上面的HTTPGET方法,Express和Fiber还支持其他HTTP基本方法(当然还有其他HTTP方法)。//POSTmethodapp.post("/",(req,res)=>{//functionthatstoresanewdata});//EndpointforPUTmethodapp.put("/",(req,res)=>{//functionthatreplacestheexistingdata});//EndpointforPATCHmethodapp.patch("/",(req,res)=>{//functionthatreplacespartoftheexistingdata});//EndpointforDELETEmethodapp.delete("/",(req,res)=>{//functionthatdeletestesthedata});对应Fiber代码://EndpointforPOSTmethodapp.Post("/",func(c*fiber.Ctx)error{//functionthatstoresanewdata})//EndpointforPUTmethodapp.Put("/",func(c*fiber.Ctx)error{//functionthatreplacestheexistingdata})//EndpointforPATHmethodapp.Path("/",func(c*fiber.Ctx)error{//functionthatreplacespartoftheexistingdata})//EndpointforDELETEmethodapp.Delete("/",func(c*fiber.Ctx)error{//functionthatdeletesthedata})middleware中间件函数可以访问HTTP请求和响应对象,并调用下一个中间件函数。通常,中间件函数执行以下操作:执行我们希望它执行的代码对请求或响应对象进行任何修改完成请求-响应循环调用堆栈中的下一个中间件函数请参阅中间件示例,它们是在Express中以及如何在Fiber中写入。app.use(function(req,res,next){//打印当前时间console.log("Date:",Date.now());next();});Fiber对应的代码如下:app.Use(func(c*fiber.Ctx)error{//打印当前时间fmt.Println("Date:",time.Now())returnc.Next()})ServingstaticfilesWeb应用中经常会有静态文件,它们需要能够被请求,比如图片,css/js文件等。Servingstaticfiles一般基于以下几点:存放静态文件的文件夹指定一个web程序中的挂载点引用挂载点看Express是怎么做的:app.use("/static",//mountaddressexpress.static("public")//pathtothefilefolder);Fiber对应的代码如下:app.Static("/static",//mountaddress"./public",//pathtothefilefolder)因此,我们在/static/下的所有文件访问都对应public下的文件。例如:http://localhost:3000/static/images/background.jpg对应public/images/background.jpg使用模板的文件目前很多Go框架对各种模板引擎的支持还不够。但Fiber与Express类似,支持大量开箱即用的模板引擎,例如Pug、Jade、Mustache和Handlebars。以Pug为例,看看Express和Fiber是如何使用的。(注意,下面的代码会在./views目录下寻找index.pug文件,如果没有这个文件会报错)app.set("viewengine","pug");//初始化模板文件夹app.set("views","./views");app.get("/",(req,res)=>{res.render("index",{title:"Hey!",message:"Thisistheindextemplate.",});});对应的Fiber代码如下(注意Fiber对模板的支持是https://github.com/gofiber/template包)://根据./views文件夹初始化Pug模板引擎engine:=pug.New("./views",".pug")app:=fiber.New(fiber.Config{Views:engine,//设置模板引擎})app.Get("/",func(c*fiber.Ctx)error{returnc.Render("index",fiber.Map{"Title":"Hey!","Message":"Thisistheindextemplate.",})})03总结本文简单介绍了Fiber的一些特性。因为Fiber是受Express的启发,所以和Express比较。我不知道你对纤维有什么看法?下一篇文章将更详细地介绍Fiber的一些特性。参考https://dev.to/koddr/go-fiber-by-examples-how-can-the-fiber-web-framework-be-useful-487a本文转载自微信公众号「polarisxu」,您可以使用以下二维码关注。转载本文请联系polarisxu公众号。https://docs.gofiber.io/api/fiber
