rename Streamer to Stream

This commit is contained in:
Asim Aslam 2018-04-14 18:15:09 +01:00
parent c2cfe5310c
commit 65068e8b82
10 changed files with 21 additions and 146 deletions

View File

@ -10,8 +10,10 @@ import (
func TestBackoff(t *testing.T) { func TestBackoff(t *testing.T) {
delta := time.Duration(0) delta := time.Duration(0)
c := NewClient()
for i := 0; i < 5; i++ { for i := 0; i < 5; i++ {
d, err := exponentialBackoff(context.TODO(), NewRequest("test", "test", nil), i) d, err := exponentialBackoff(context.TODO(), c.NewRequest("test", "test", nil), i)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -15,7 +15,7 @@ type Client interface {
NewMessage(topic string, msg interface{}) Message NewMessage(topic string, msg interface{}) Message
NewRequest(service, method string, req interface{}, reqOpts ...RequestOption) Request NewRequest(service, method string, req interface{}, reqOpts ...RequestOption) Request
Call(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) error Call(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) error
Stream(ctx context.Context, req Request, opts ...CallOption) (Streamer, error) Stream(ctx context.Context, req Request, opts ...CallOption) (Stream, error)
Publish(ctx context.Context, msg Message, opts ...PublishOption) error Publish(ctx context.Context, msg Message, opts ...PublishOption) error
String() string String() string
} }
@ -37,8 +37,8 @@ type Request interface {
Stream() bool Stream() bool
} }
// Streamer is the inteface for a bidirectional synchronous stream // Stream is the inteface for a bidirectional synchronous stream
type Streamer interface { type Stream interface {
Context() context.Context Context() context.Context
Request() Request Request() Request
Send(interface{}) error Send(interface{}) error
@ -76,35 +76,7 @@ var (
DefaultPoolTTL = time.Minute DefaultPoolTTL = time.Minute
) )
// Makes a synchronous call to a service using the default client
func Call(ctx context.Context, request Request, response interface{}, opts ...CallOption) error {
return DefaultClient.Call(ctx, request, response, opts...)
}
// Creates a streaming connection with a service and returns responses on the
// channel passed in. It's up to the user to close the streamer.
func Stream(ctx context.Context, request Request, opts ...CallOption) (Streamer, error) {
return DefaultClient.Stream(ctx, request, opts...)
}
// Publishes a publication using the default client. Using the underlying broker
// set within the options.
func Publish(ctx context.Context, msg Message) error {
return DefaultClient.Publish(ctx, msg)
}
// Creates a new client with the options passed in // Creates a new client with the options passed in
func NewClient(opt ...Option) Client { func NewClient(opt ...Option) Client {
return newRpcClient(opt...) return newRpcClient(opt...)
} }
// Creates a new message using the default client
func NewMessage(topic string, message interface{}) Message {
return DefaultClient.NewMessage(topic, message)
}
// Creates a new request using the default client. Content Type will
// be set to the default within options and use the appropriate codec
func NewRequest(service, method string, request interface{}, reqOpts ...RequestOption) Request {
return DefaultClient.NewRequest(service, method, request, reqOpts...)
}

View File

@ -14,4 +14,4 @@ type CallWrapper func(CallFunc) CallFunc
type Wrapper func(Client) Client type Wrapper func(Client) Client
// StreamWrapper wraps a Stream and returns the equivalent // StreamWrapper wraps a Stream and returns the equivalent
type StreamWrapper func(Streamer) Streamer type StreamWrapper func(Stream) Stream

View File

@ -89,7 +89,7 @@ func (m *MockClient) Call(ctx context.Context, req client.Request, rsp interface
return fmt.Errorf("rpc: can't find service %s", req.Method()) return fmt.Errorf("rpc: can't find service %s", req.Method())
} }
func (m *MockClient) Stream(ctx context.Context, req client.Request, opts ...client.CallOption) (client.Streamer, error) { func (m *MockClient) Stream(ctx context.Context, req client.Request, opts ...client.CallOption) (client.Stream, error) {
m.Lock() m.Lock()
defer m.Unlock() defer m.Unlock()

View File

@ -135,7 +135,7 @@ func (r *rpcClient) call(ctx context.Context, address string, req Request, resp
} }
} }
func (r *rpcClient) stream(ctx context.Context, address string, req Request, opts CallOptions) (Streamer, error) { func (r *rpcClient) stream(ctx context.Context, address string, req Request, opts CallOptions) (Stream, error) {
msg := &transport.Message{ msg := &transport.Message{
Header: make(map[string]string), Header: make(map[string]string),
} }
@ -340,7 +340,7 @@ func (r *rpcClient) Call(ctx context.Context, request Request, response interfac
return gerr return gerr
} }
func (r *rpcClient) Stream(ctx context.Context, request Request, opts ...CallOption) (Streamer, error) { func (r *rpcClient) Stream(ctx context.Context, request Request, opts ...CallOption) (Stream, error) {
// make a copy of call opts // make a copy of call opts
callOpts := r.opts.CallOptions callOpts := r.opts.CallOptions
for _, opt := range opts { for _, opt := range opts {
@ -371,7 +371,7 @@ func (r *rpcClient) Stream(ctx context.Context, request Request, opts ...CallOpt
default: default:
} }
call := func(i int) (Streamer, error) { call := func(i int) (Stream, error) {
// call backoff first. Someone may want an initial start delay // call backoff first. Someone may want an initial start delay
t, err := callOpts.Backoff(ctx, request, i) t, err := callOpts.Backoff(ctx, request, i)
if err != nil { if err != nil {
@ -401,7 +401,7 @@ func (r *rpcClient) Stream(ctx context.Context, request Request, opts ...CallOpt
} }
type response struct { type response struct {
stream Streamer stream Stream
err error err error
} }

View File

@ -12,5 +12,5 @@ type publisher struct {
} }
func (p *publisher) Publish(ctx context.Context, msg interface{}, opts ...client.PublishOption) error { func (p *publisher) Publish(ctx context.Context, msg interface{}, opts ...client.PublishOption) error {
return p.c.Publish(ctx, p.c.NewPublication(p.topic, msg)) return p.c.Publish(ctx, p.c.NewMessage(p.topic, msg))
} }

View File

@ -119,9 +119,9 @@ func prepareMethod(method reflect.Method) *methodType {
if stream { if stream {
// check stream type // check stream type
streamType := reflect.TypeOf((*Streamer)(nil)).Elem() streamType := reflect.TypeOf((*Stream)(nil)).Elem()
if !argType.Implements(streamType) { if !argType.Implements(streamType) {
log.Log(mname, "argument does not implement Streamer interface:", argType) log.Log(mname, "argument does not implement Stream interface:", argType)
return nil return nil
} }
} else { } else {

View File

@ -3,11 +3,7 @@ package server
import ( import (
"context" "context"
"os"
"os/signal"
"syscall"
"github.com/micro/go-log"
"github.com/pborman/uuid" "github.com/pborman/uuid"
) )
@ -40,11 +36,11 @@ type Request interface {
Stream() bool Stream() bool
} }
// Streamer represents a stream established with a client. // Stream represents a stream established with a client.
// A stream can be bidirectional which is indicated by the request. // A stream can be bidirectional which is indicated by the request.
// The last error will be left in Error(). // The last error will be left in Error().
// EOF indicated end of the stream. // EOF indicated end of the stream.
type Streamer interface { type Stream interface {
Context() context.Context Context() context.Context
Request() Request Request() Request
Send(interface{}) error Send(interface{}) error
@ -67,102 +63,7 @@ var (
DefaultServer Server = newRpcServer() DefaultServer Server = newRpcServer()
) )
// DefaultOptions returns config options for the default service
func DefaultOptions() Options {
return DefaultServer.Options()
}
// Init initialises the default server with options passed in
func Init(opt ...Option) {
if DefaultServer == nil {
DefaultServer = newRpcServer(opt...)
}
DefaultServer.Init(opt...)
}
// NewServer returns a new server with options passed in // NewServer returns a new server with options passed in
func NewServer(opt ...Option) Server { func NewServer(opt ...Option) Server {
return newRpcServer(opt...) return newRpcServer(opt...)
} }
// NewSubscriber creates a new subscriber interface with the given topic
// and handler using the default server
func NewSubscriber(topic string, h interface{}, opts ...SubscriberOption) Subscriber {
return DefaultServer.NewSubscriber(topic, h, opts...)
}
// NewHandler creates a new handler interface using the default server
// Handlers are required to be a public object with public
// methods. Call to a service method such as Foo.Bar expects
// the type:
//
// type Foo struct {}
// func (f *Foo) Bar(ctx, req, rsp) error {
// return nil
// }
//
func NewHandler(h interface{}, opts ...HandlerOption) Handler {
return DefaultServer.NewHandler(h, opts...)
}
// Handle registers a handler interface with the default server to
// handle inbound requests
func Handle(h Handler) error {
return DefaultServer.Handle(h)
}
// Subscribe registers a subscriber interface with the default server
// which subscribes to specified topic with the broker
func Subscribe(s Subscriber) error {
return DefaultServer.Subscribe(s)
}
// Register registers the default server with the discovery system
func Register() error {
return DefaultServer.Register()
}
// Deregister deregisters the default server from the discovery system
func Deregister() error {
return DefaultServer.Deregister()
}
// Run starts the default server and waits for a kill
// signal before exiting. Also registers/deregisters the server
func Run() error {
if err := Start(); err != nil {
return err
}
if err := DefaultServer.Register(); err != nil {
return err
}
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL)
log.Logf("Received signal %s", <-ch)
if err := DefaultServer.Deregister(); err != nil {
return err
}
return Stop()
}
// Start starts the default server
func Start() error {
config := DefaultServer.Options()
log.Logf("Starting server %s id %s", config.Name, config.Id)
return DefaultServer.Start()
}
// Stop stops the default server
func Stop() error {
log.Logf("Stopping server")
return DefaultServer.Stop()
}
// String returns name of Server implementation
func String() string {
return DefaultServer.String()
}

View File

@ -20,8 +20,8 @@ type HandlerWrapper func(HandlerFunc) HandlerFunc
// SubscriberWrapper wraps the SubscriberFunc and returns the equivalent // SubscriberWrapper wraps the SubscriberFunc and returns the equivalent
type SubscriberWrapper func(SubscriberFunc) SubscriberFunc type SubscriberWrapper func(SubscriberFunc) SubscriberFunc
// StreamerWrapper wraps a Streamer interface and returns the equivalent. // StreamWrapper wraps a Stream interface and returns the equivalent.
// Because streams exist for the lifetime of a method invocation this // Because streams exist for the lifetime of a method invocation this
// is a convenient way to wrap a Stream as its in use for trace, monitoring, // is a convenient way to wrap a Stream as its in use for trace, monitoring,
// metrics, etc. // metrics, etc.
type StreamerWrapper func(Streamer) Streamer type StreamWrapper func(Stream) Stream

View File

@ -36,12 +36,12 @@ func (c *clientWrapper) Call(ctx context.Context, req client.Request, rsp interf
return c.Client.Call(ctx, req, rsp, opts...) return c.Client.Call(ctx, req, rsp, opts...)
} }
func (c *clientWrapper) Stream(ctx context.Context, req client.Request, opts ...client.CallOption) (client.Streamer, error) { func (c *clientWrapper) Stream(ctx context.Context, req client.Request, opts ...client.CallOption) (client.Stream, error) {
ctx = c.setHeaders(ctx) ctx = c.setHeaders(ctx)
return c.Client.Stream(ctx, req, opts...) return c.Client.Stream(ctx, req, opts...)
} }
func (c *clientWrapper) Publish(ctx context.Context, p client.Publication, opts ...client.PublishOption) error { func (c *clientWrapper) Publish(ctx context.Context, p client.Message, opts ...client.PublishOption) error {
ctx = c.setHeaders(ctx) ctx = c.setHeaders(ctx)
return c.Client.Publish(ctx, p, opts...) return c.Client.Publish(ctx, p, opts...)
} }