Go Web is a framework for micro service web development.
Go Web provides a tiny HTTP web server library which leverages go-micro to create micro web services as first class citizens in a microservice world. It wraps go-micro to give you service discovery, heartbeating and the ability to create web apps as microservices.
-
Service Discovery - Services are automatically registered in service discovery on startup. Go Web includes a http.Client with pre-initialised roundtripper which makes use of service discovery so you can use service names.
-
Heartbeating - Go Web apps will periodically heartbeat with service discovery to provide liveness updates. In the event a service fails it will be removed from the registry after a pre-defined expiry time.
-
Custom Handlers - Specify your own http router for handling requests. This allows you to maintain full control over how you want to route to internal handlers.
-
Static Serving - Go Web automatically detects a local static
html
dir and serves files if no route handler is specified. A quick solution for those who want to write JS web apps as microservices.
Go Web makes use of Go Micro which means it needs service discovery
See the go-micro for install instructions
For a quick start use consul
# install
brew install consul
# run
consul agent -dev
service := web.NewService(
web.Name("example.com"),
)
service.HandleFunc("/foo", fooHandler)
if err := service.Init(); err != nil {
log.Fatal(err)
}
if err := service.Run(); err != nil {
log.Fatal(err)
}
You might have a preference for a HTTP handler, so use something else. This loses the ability to register endpoints in discovery but we'll fix that soon.
import "github.com/gorilla/mux"
r := mux.NewRouter()
r.HandleFunc("/", indexHandler)
r.HandleFunc("/objects/{object}", objectHandler)
service := web.NewService(
web.Handler(r)
)
Go-web includes a http.Client with a custom http.RoundTripper that uses service discovery
c := service.Client()
rsp, err := c.Get("http://example.com/foo")
This will lookup service discovery for the service example.com
and route to one of the available nodes.
Go web was always meant as a way to register web apps where the majority of the code would be written in JS. To enable that by default, if no handler is registered on "/" and we find a local "html" directory then static files will be served.
You will see a log output like so.
2019/05/12 14:55:47 Enabling static file serving from /tmp/foo/html
If you want to set this path manually use the StaticDir option. If a relative path is specified we will use os.Getwd() and prefix this.
service := web.NewService(
web.Name("example.com"),
web.StaticDir("/tmp/example.com/html"),
)