// Package micro is a pluggable RPC framework for microservices package micro import ( "github.com/micro/go-micro/client" "github.com/micro/go-micro/server" "golang.org/x/net/context" ) type serviceKey struct{} // Service is an interface that wraps the lower level libraries // within go-micro. Its a convenience method for building // and initialising services. type Service interface { Init(...Option) Options() Options Client() client.Client Server() server.Server Run() error String() string } // Publisher is syntactic sugar for publishing type Publisher interface { Publish(ctx context.Context, msg interface{}, opts ...client.PublishOption) error } type Option func(*Options) var ( HeaderPrefix = "X-Micro-" ) // NewService creates an returns a new Service based on the packages within. func NewService(opts ...Option) Service { return newService(opts...) } // FromContext retrieves a Service from the Context. func FromContext(ctx context.Context) (Service, bool) { s, ok := ctx.Value(serviceKey{}).(Service) return s, ok } // NewContext returns a new Context with the Service embedded within it. func NewContext(ctx context.Context, s Service) context.Context { return context.WithValue(ctx, serviceKey{}, s) } // NewPublisher returns a new Publisher func NewPublisher(topic string, c client.Client) Publisher { if c == nil { c = client.NewClient() } return &publisher{c, topic} } // RegisterHandler is syntactic sugar for registering a handler func RegisterHandler(s server.Server, h interface{}, opts ...server.HandlerOption) error { return s.Handle(s.NewHandler(h, opts...)) } // RegisterSubscriber is syntactic sugar for registering a subscriber func RegisterSubscriber(topic string, s server.Server, h interface{}, opts ...server.SubscriberOption) error { return s.Subscribe(s.NewSubscriber(topic, h)) }