mirror of
https://github.com/go-micro/go-micro.git
synced 2025-06-12 22:07:47 +02:00
Add pub/sub to client/server and make broker more low level
This commit is contained in:
@ -1,11 +1,14 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/myodc/go-micro/broker"
|
||||
c "github.com/myodc/go-micro/context"
|
||||
"github.com/myodc/go-micro/errors"
|
||||
"github.com/myodc/go-micro/registry"
|
||||
@ -13,6 +16,7 @@ import (
|
||||
|
||||
rpc "github.com/youtube/vitess/go/rpcplus"
|
||||
|
||||
"github.com/golang/protobuf/proto"
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
@ -21,6 +25,7 @@ type headerRoundTripper struct {
|
||||
}
|
||||
|
||||
type rpcClient struct {
|
||||
once sync.Once
|
||||
opts options
|
||||
}
|
||||
|
||||
@ -39,7 +44,14 @@ func newRpcClient(opt ...Option) Client {
|
||||
opts.transport = transport.DefaultTransport
|
||||
}
|
||||
|
||||
if opts.broker == nil {
|
||||
opts.broker = broker.DefaultBroker
|
||||
}
|
||||
|
||||
var once sync.Once
|
||||
|
||||
return &rpcClient{
|
||||
once: once,
|
||||
opts: opts,
|
||||
}
|
||||
}
|
||||
@ -152,6 +164,48 @@ func (r *rpcClient) Stream(ctx context.Context, request Request, responseChan in
|
||||
return r.stream(ctx, address, request, responseChan)
|
||||
}
|
||||
|
||||
func (r *rpcClient) Publish(ctx context.Context, p Publication) error {
|
||||
md, ok := c.GetMetadata(ctx)
|
||||
if !ok {
|
||||
md = make(map[string]string)
|
||||
}
|
||||
md["Content-Type"] = p.ContentType()
|
||||
|
||||
// encode message body
|
||||
var body []byte
|
||||
|
||||
switch p.ContentType() {
|
||||
case "application/octet-stream":
|
||||
b, err := proto.Marshal(p.Message().(proto.Message))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
body = b
|
||||
case "application/json":
|
||||
b, err := json.Marshal(p.Message())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
body = b
|
||||
}
|
||||
|
||||
r.once.Do(func() {
|
||||
r.opts.broker.Connect()
|
||||
})
|
||||
|
||||
return r.opts.broker.Publish(p.Topic(), &broker.Message{
|
||||
Header: md,
|
||||
Body: body,
|
||||
})
|
||||
}
|
||||
|
||||
func (r *rpcClient) NewPublication(topic string, message interface{}) Publication {
|
||||
return r.NewProtoPublication(topic, message)
|
||||
}
|
||||
|
||||
func (r *rpcClient) NewProtoPublication(topic string, message interface{}) Publication {
|
||||
return newRpcPublication(topic, message, "application/octet-stream")
|
||||
}
|
||||
func (r *rpcClient) NewRequest(service, method string, request interface{}) Request {
|
||||
return r.NewProtoRequest(service, method, request)
|
||||
}
|
||||
|
Reference in New Issue
Block a user