rename Streamer to Stream
This commit is contained in:
parent
c2cfe5310c
commit
65068e8b82
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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...)
|
|
||||||
}
|
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
103
server/server.go
103
server/server.go
@ -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()
|
|
||||||
}
|
|
||||||
|
@ -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
|
||||||
|
@ -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...)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user