alien - A lightweight http router from outer space
Alien
Alien is a lightweight http router( multiplexer) for Go( Golang ), made for humans who don't like magic.
Documentation docs
Features
- fast ( see the benchmarks, or run them yourself)
- lightweight ( just a single file read all of it in less than a minute)
- safe( designed with concurrency in mind)
- middleware support.
- routes groups
- no external dependency( only the standard library )
Motivation
Instead of talking about how good Golang can be, I am trying to show how good Golang can be.
Using the standard library only, following good practices and well tested code( Over 90% coverage)
Installation
go get github.com/gernest/alien
Usage
normal static routes
package main import ( "log" "net/http" "github.com/gernest/alien" ) func main() { m := alien.New() m.Get("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello world")) }) log.Fatal(http.ListenAndServe(":8090", m)) }
visiting your localhost at path /
will print hello world
named params
package main import ( "log" "net/http" "github.com/gernest/alien" ) func main() { m := alien.New() m.Get("/hello/:name", func(w http.ResponseWriter, r *http.Request) { p := alien.GetParams(r) w.Write([]byte(p.Get("name"))) }) log.Fatal(http.ListenAndServe(":8090", m)) }
visiting your localhost at path /hello/tanzania
will print tanzania
catch all params
package main import ( "log" "net/http" "github.com/gernest/alien" ) func main() { m := alien.New() m.Get("/hello/*name", func(w http.ResponseWriter, r *http.Request) { p := alien.GetParams(r) w.Write([]byte(p.Get("name"))) }) log.Fatal(http.ListenAndServe(":8090", m)) }
visiting your localhost at path /hello/my/margicl/sheeplike/ship
will print my/margical/sheeplike/ship
middlewares
Middlewares are anything that satisfy the interface func(http.Handler)http.Handler
. Meaning you have thousand of middlewares at your disposal, you can use middlewares from many golang http frameworks on alien(most support the interface).
package main import ( "log" "net/http" "github.com/gernest/alien" ) func middleware(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello middlware")) }) } func main() { m := alien.New() m.Use(middleware) m.Get("/", func(_ http.ResponseWriter, _ *http.Request) { }) log.Fatal(http.ListenAndServe(":8090", m)) }
visiting your localhost at path /
will print hello middleware
groups
You can group routes
package main import ( "log" "net/http" "github.com/gernest/alien" ) func main() { m := alien.New() g := m.Group("/home") m.Use(middleware) g.Get("/alone", func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("home alone")) }) log.Fatal(http.ListenAndServe(":8090", m)) }
visiting your localhost at path /home/alone
will print home alone
Benchmarks
The benchmarks for alien are based on go-hhtp-routing-benchmark for some reason I wanted to include them in alien so anyone can benchmark for him/herself ( no more magic).
You can run all benchmarks by running the foolowing command in the root of the alien package.
go test -bench="."
These are results from an old 32 bit dell laptop with 2 GB of ram and running linux mint.
PASS BenchmarkAlien_Param-2 10000 123242 ns/op 103802 B/op 8 allocs/op BenchmarkAlien_Param5-2 10000 270898 ns/op 219256 B/op 12 allocs/op BenchmarkAlien_Param20-2 10000 646280 ns/op 445555 B/op 27 allocs/op BenchmarkAlien_ParamWrite-2 10000 4095764 ns/op 711800 B/op 5031 allocs/op BenchmarkAlien_GithubStatic-2 1000000 1667 ns/op 80 B/op 3 allocs/op BenchmarkAlien_GithubParam-2 10000 341458 ns/op 224242 B/op 10 allocs/op BenchmarkAlien_GithubAll-2 100 64580632 ns/op 44826075 B/op 1882 allocs/op BenchmarkAlien_GPlusStatic-2 1000000 1283 ns/op 48 B/op 3 allocs/op BenchmarkAlien_GPlusParam-2 10000 286417 ns/op 189088 B/op 9 allocs/op BenchmarkAlien_GPlus2Params-2 10000 415275 ns/op 294360 B/op 10 allocs/op BenchmarkAlien_GPlusAll-2 5000 18000915 ns/op 10774329 B/op 133 allocs/op BenchmarkAlien_ParseStatic-2 1000000 1309 ns/op 80 B/op 3 allocs/op BenchmarkAlien_ParseParam-2 10000 164879 ns/op 108838 B/op 9 allocs/op BenchmarkAlien_Parse2Params-2 10000 267585 ns/op 204160 B/op 10 allocs/op BenchmarkAlien_ParseAll-2 2000 12309365 ns/op 8086112 B/op 194 allocs/op BenchmarkAlien_StaticAll-2 5000 336983 ns/op 13056 B/op 471 allocs/op ok github.com/gernest/alien 193.458s
FAQ about alien
Why name alien?
There is no magic in this package, just common sense with a juice of technology. Aliens don't believe in magic.
What is alien for?
Everyone, especially people who wants to understand more about Golang with a real project( not a toy ).
How you can contribute to alien!
Contributions are welcome,
- share the project with friends and family
- talk about alien on hacker news
- talk about alien on reddit
- tweet about alien
- star alien repostory
- fork it and forget
- use alien for your new project
- buy the author a beer
Author
Geofrey Ernest @gernest on 推ter
Licence
MIT see LICENCE