func (r *rpcClient) Publish(ctx context.Context, p Publication, opts ...PublishOption) error { md, ok := c.GetMetadata(ctx) if !ok { md = make(map[string]string) } md["Content-Type"] = p.ContentType() // encode message body cf, err := r.newCodec(p.ContentType()) if err != nil { return errors.InternalServerError("go.micro.client", err.Error()) } b := &buffer{bytes.NewBuffer(nil)} if err := cf(b).Write(&codec.Message{Type: codec.Publication}, p.Message()); err != nil { return errors.InternalServerError("go.micro.client", err.Error()) } r.once.Do(func() { r.opts.Broker.Connect() }) return r.opts.Broker.Publish(p.Topic(), &broker.Message{ Header: md, Body: b.Bytes(), }) }
func (r *rpcClient) stream(ctx context.Context, address string, req Request) (Streamer, error) { msg := &transport.Message{ Header: make(map[string]string), } md, ok := c.GetMetadata(ctx) if ok { for k, v := range md { msg.Header[k] = v } } msg.Header["Content-Type"] = req.ContentType() cf, err := r.newCodec(req.ContentType()) if err != nil { return nil, errors.InternalServerError("go.micro.client", err.Error()) } c, err := r.opts.Transport.Dial(address, transport.WithStream(), transport.WithTimeout(r.opts.DialTimeout)) if err != nil { return nil, errors.InternalServerError("go.micro.client", fmt.Sprintf("Error sending request: %v", err)) } var once sync.Once stream := &rpcStream{ context: ctx, request: req, once: once, closed: make(chan bool), codec: newRpcPlusCodec(msg, c, cf), } ch := make(chan error, 1) go func() { ch <- stream.Send(req.Request()) }() select { case err = <-ch: case <-time.After(r.opts.RequestTimeout): err = errors.New("go.micro.client", "request timeout", 408) } return stream, err }
func (dc *dcWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error { md, _ := c.GetMetadata(ctx) filter := func(services []*registry.Service) []*registry.Service { for _, service := range services { var nodes []*registry.Node for _, node := range service.Nodes { if node.Metadata["datacenter"] == md["datacenter"] { nodes = append(nodes, node) } } service.Nodes = nodes } return services } callOptions := append(opts, client.WithSelectOption( selector.Filter(filter), )) fmt.Printf("[DC Wrapper] filtering for datacenter %s\n", md["datacenter"]) return dc.Client.Call(ctx, req, rsp, callOptions...) }
func (l *logWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error { md, _ := c.GetMetadata(ctx) fmt.Printf("[Log Wrapper] ctx: %v service: %s method: %s\n", md, req.Service(), req.Method()) return l.Client.Call(ctx, req, rsp) }
func (e *Example) Call(ctx context.Context, req *example.Request, rsp *example.Response) error { md, _ := c.GetMetadata(ctx) log.Infof("Received Example.Call request with metadata: %v", md) rsp.Msg = server.DefaultOptions().Id + ": Hello " + req.Name return nil }