web

package
v1.7.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 21, 2019 License: Apache-2.0 Imports: 21 Imported by: 140

README

Go Web

Go Web is a framework for micro service web development.

Overview

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.

Features

  • 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.

Getting Started

Dependencies

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

Usage

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)
}

Set Handler

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)
)

Call Service

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.

Static Files

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"),
)

Documentation

Overview

Package web provides web based micro services

Index

Constants

This section is empty.

Variables

View Source
var (
	// For serving
	DefaultName    = "go-web"
	DefaultVersion = "latest"
	DefaultId      = uuid.New().String()
	DefaultAddress = ":0"

	// for registration
	DefaultRegisterTTL      = time.Minute
	DefaultRegisterInterval = time.Second * 30

	// static directory
	DefaultStaticDir = "html"
)

Functions

This section is empty.

Types

type Option

type Option func(o *Options)

func Action

func Action(a func(*cli.Context)) Option

Action sets the command action.

func Address

func Address(a string) Option

Address to bind to - host:port

func Advertise(a string) Option

The address to advertise for discovery - host:port

func AfterStart

func AfterStart(fn func() error) Option

AfterStart is executed after server start.

func AfterStop

func AfterStop(fn func() error) Option

AfterStop is executed after server stop.

func BeforeStart

func BeforeStart(fn func() error) Option

BeforeStart is executed before the server starts.

func BeforeStop

func BeforeStop(fn func() error) Option

BeforeStop is executed before the server stops.

func Context

func Context(ctx context.Context) Option

Context specifies a context for the service. Can be used to signal shutdown of the service. Can be used for extra option values.

func Flags

func Flags(flags ...cli.Flag) Option

Flags sets the command flags.

func Handler

func Handler(h http.Handler) Option

func Id

func Id(id string) Option

Unique server id

func Metadata

func Metadata(md map[string]string) Option

Metadata associated with the service

func MicroService

func MicroService(s micro.Service) Option

MicroService sets the micro.Service used internally

func Name

func Name(n string) Option

Server name

func RegisterInterval

func RegisterInterval(t time.Duration) Option

func RegisterTTL

func RegisterTTL(t time.Duration) Option

func Registry

func Registry(r registry.Registry) Option

func Secure

func Secure(b bool) Option

Secure Use secure communication. If TLSConfig is not specified we use InsecureSkipVerify and generate a self signed cert

func Server

func Server(srv *http.Server) Option

func StaticDir

func StaticDir(d string) Option

StaticDir sets the static file directory. This defaults to ./html

func TLSConfig

func TLSConfig(t *tls.Config) Option

TLSConfig to be used for the transport.

func Version

func Version(v string) Option

Version of the service

type Options

type Options struct {
	Name      string
	Version   string
	Id        string
	Metadata  map[string]string
	Address   string
	Advertise string

	Action func(*cli.Context)
	Flags  []cli.Flag

	RegisterTTL      time.Duration
	RegisterInterval time.Duration

	Server  *http.Server
	Handler http.Handler

	// Alternative Options
	Context context.Context

	Registry registry.Registry
	Service  micro.Service

	Secure      bool
	TLSConfig   *tls.Config
	BeforeStart []func() error
	BeforeStop  []func() error
	AfterStart  []func() error
	AfterStop   []func() error

	// Static directory
	StaticDir string
}

type Service

type Service interface {
	Client() *http.Client
	Init(opts ...Option) error
	Options() Options
	Handle(pattern string, handler http.Handler)
	HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request))
	Run() error
}

Service is a web service with service discovery built in

func NewService

func NewService(opts ...Option) Service

NewService returns a new web.Service

Directories

Path Synopsis
examples

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL