Introduction
Hello, World! 👋 Today we will deal with a young (but ambitious) Fiber web framework on Go and understand that this is not "yet another new framework, like X", but a great tool for creating rapid web applications.
📌 It will be a review article, dive into Fiber we will start further.
Table of contents
- What is Fiber and why is it so good?
- Useful information to start working with Fiber
- Main features
- Benchmarks
- Project assistance
What is Fiber and why is it so good?
Follow official README from GitHub repository:
Fiber is an Express.js styled HTTP web framework implementation running on Fasthttp, the fastest HTTP engine for Go (Golang). The package make use of similar framework convention as they are in Express.
And I tend to agree with that. If you have ever implemented a web application on Node.js using Express.js (like me), then many methods and principles will seem very common to you!
For example, this is standard Hello, World!
by Express.js:
// ...
const app = express()
app.get('/', (req, res) => res.send('Hello, World!'))
app.listen(8080)
And similar example by Fiber:
// ...
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) {
c.Send("Hello, World!")
})
app.Listen(8080)
Useful information to start working with Fiber
Actually, all you need for start is official documentation! 😉
Fiber, as a web framework, was created with idea of minimalism to more easily start creating a web application's backend for new gophers, but who have experience with JavaScript.
That's what the authors themselves say:
People switching from Node.js to Go often end up in a bad learning curve to start building their webapps, this project is meant to ease things up for fast development, but with zero memory allocation and performance in mind.
Main features
- Optimized for speed and low memory usage
- Rapid Server-Side Programming
- Easy routing with parameters
- Static files with custom prefix
- Middleware with
Next()
support - Express API endpoints
- Extended documentation
Easy to enable the prefork feature
Just set Prefork
to true
on your code:
// ...
app := fiber.New()
app.Prefork = true // enable prefork
app.Get("/", func(c *fiber.Ctx) {
c.Send(fmt.Sprintf("Hi, I'm worker #%v", os.Getpid()))
// => Hi, I'm worker #16858
// => Hi, I'm worker #16877
// => Hi, I'm worker #16895
})
app.Listen(8080)
What's prefork?
Enable prefork feature will spawn multiple go processes listening on the same port. Nginx has a great article about Socket Sharding, this picture are taken from the same article 👇
✨ My favorite killer feature ✨
And one more big feature (for me) is full access to all Fasthttp methods and properties (read documentation for more info about it).
Yeah, you didn't mishear! Fiber is extremely easy to use as Express.js and has everything under the hood that Fasthttp has now and will have in the future 🔥
Benchmarks 🤖
Click here to see all benchmark results. I'll only bring some.
- TechEmpower: JSON serialization
- Go-Web: enable HTTP pipelining
Project assistance
- Add a GitHub Star to project.
- Tweet about project on your Twitter.
- Help to translate README and API Docs to another language.
Photo by
[Title] Fiber Authors https://gofiber.io/
[1] Nate Grant https://unsplash.com/photos/dFF8z3WH5FI
P.S.
If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻
❗️ You can support me on Boosty, both on a permanent and on a one-time basis. All proceeds from this way will go to support my OSS projects and will energize me to create new products and articles for the community.
And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!
My main projects that need your help (and stars) 👇
- 🔥 gowebly: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.
- ✨ create-go-app: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.
Top comments (17)
@koddr , i do very much like the idea of the framework and i would love to rewrite a slow Fastify project in it, ofc i'll first have to verify the claims being made and play with it myself and maybe even become a member of the community, but i'm getting skeptical because i see @kataras comments were hidden by you, did he have something bad to say about the framework ?? in general hiding comment's is bad and it doesn't inspire confidence nor trust. why was his comment hidden ?!
Nothing wrong there, he just fixed an old bug, which he posted in the comments. That's all.
Exposed his comments, since it's so shocking to some of my readers, no problem.
Thank you, i gave the project a GitHub star already because it doesn't matter if it has some bugs, that's fixable the important thing is the idea, and i'll start trying out soon.
Based on github.com/gofiber/fiber/blob/mast... I should be able to register a route of:
app.Get("/api/values/:id", func(ctx *fiber.Ctx)
but it can't even do that.... it panicsAnyway, I fixed it with PR: github.com/gofiber/fiber/pull/28
Screenshot with my PR
Good luck to this initiative! Please inform your users that this framework does not support HTTP/2.
Thanks,
Gerasimos Maropoulos. Author of the Iris web framework.
Yes, framework is too young and have some trouble (its written by one man as side project... not me, but I active help to promote).
Thx for PR :D
P.S. btw, I'm really looking forward to the Iris CLI release ;)
Vic you are koddr! Oh my god good job mate I hope my projects gave you an idea about how the whole thing works, good luck and anytime you need my help you have it!
P.S I am working on it as we speak, I found the bug when I was
iris-cli benchmark
of fiber to test its performance :)Yes, my friend, it's me 🥰
Thx for this words, it's extremely important for me (really, thank you).
P.S. actually, your first commit of
Iris CLI
(yep, I seen this moment) gave me an idea for Create Go App. It's something like CRA (create-react-app), but for every Go web frameworks... ONE CLI TO RULE THEM ALL! haha 🤗P.P.S. I'm not sure, what gophers have to say, but I personally need similar all-in-one solution (both hyped frontend/backend frameworks and configured Docker containers by one CLI command)... and why not to write it by myself 😉
Why do we need prefork in Go? Isn't regular gorutines enough?
In short, prefork is done through Unix'
SO_REUSEADDR
and it does not work on Windows hosts. You can implement preforking on any web framework, including the standard net/http. A good library (that iris uses too) is tcplisten by @valyala the creator of fasthttp and a good friend. Example code:Also, see the discussion at the fasthttp repository itself:
Preforking is making use of multiple socket listeners on OS level. We explained preforking with images in our docs fiber.wiki/application#prefork
Does prefork mean that workers are executed in different processes (not goroutines) and cannot communicate or share memory with each other?
This is correct, preforking is for specific use cases. If you work with an external database it should be no problem, because you can pool connections. You can see a good result here: techempower.com/benchmarks/#sectio...
Hey Vic,
thanks for this article! I wanted to dive into Go for a long time, this is the kick in the butt I needed :)
Cheers,
Ben
P.S.: My first ever Dev.to posting.
This is very cool! Glad I could move you.
How is it compared to expressJS - connections benchmarks-wise ? (i'm sure it is better, but how much better)
Plaintext responses per second
Fiber - 6,114,300/s (0 errors) 0.5ms avg latency
Express - 261,708/s (59 errors) 608.9ms avg latency
techempower.com/benchmarks/#sectio...
JSON responses per second
Fiber - 1,212,833/s (0 errors) 0.1ms avg latency
Express - 244,061/s (0 errors) 1.1ms avg latency
techempower.com/benchmarks/#sectio...
20 database queries per request
Fiber - 19,757/s (0 errors) 25.6ms avg latency
Express - 4,259/s (0 errors) 118.4ms avg latency
techempower.com/benchmarks/#sectio...
Keep in mind that these benchmarks are 1 month old and fiber is being updated on a daily basis. Fiber v1.8 will have better performance.
I will update this comment when techempower tested v1.8.
This is awesome, coming from a nodejs/expressjs background, will make it easy to understand and use Go. 👍
Some comments have been hidden by the post's author - find out more