gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/broker/service/service.go (about)

     1  // Package service provides the broker service client
     2  package service
     3  
     4  import (
     5  	"context"
     6  	"time"
     7  
     8  	"gitee.com/liuxuezhan/go-micro-v1.18.0/broker"
     9  	pb "gitee.com/liuxuezhan/go-micro-v1.18.0/broker/service/proto"
    10  	"gitee.com/liuxuezhan/go-micro-v1.18.0/client"
    11  	"gitee.com/liuxuezhan/go-micro-v1.18.0/util/log"
    12  )
    13  
    14  type serviceBroker struct {
    15  	Addrs   []string
    16  	Client  pb.BrokerService
    17  	options broker.Options
    18  }
    19  
    20  var (
    21  	DefaultName = "go.micro.broker"
    22  )
    23  
    24  func (b *serviceBroker) Address() string {
    25  	return b.Addrs[0]
    26  }
    27  
    28  func (b *serviceBroker) Connect() error {
    29  	return nil
    30  }
    31  
    32  func (b *serviceBroker) Disconnect() error {
    33  	return nil
    34  }
    35  
    36  func (b *serviceBroker) Init(opts ...broker.Option) error {
    37  	for _, o := range opts {
    38  		o(&b.options)
    39  	}
    40  	return nil
    41  }
    42  
    43  func (b *serviceBroker) Options() broker.Options {
    44  	return b.options
    45  }
    46  
    47  func (b *serviceBroker) Publish(topic string, msg *broker.Message, opts ...broker.PublishOption) error {
    48  	log.Debugf("Publishing to topic %s broker %v", topic, b.Addrs)
    49  	_, err := b.Client.Publish(context.TODO(), &pb.PublishRequest{
    50  		Topic: topic,
    51  		Message: &pb.Message{
    52  			Header: msg.Header,
    53  			Body:   msg.Body,
    54  		},
    55  	}, client.WithAddress(b.Addrs...))
    56  	return err
    57  }
    58  
    59  func (b *serviceBroker) Subscribe(topic string, handler broker.Handler, opts ...broker.SubscribeOption) (broker.Subscriber, error) {
    60  	var options broker.SubscribeOptions
    61  	for _, o := range opts {
    62  		o(&options)
    63  	}
    64  	log.Debugf("Subscribing to topic %s queue %s broker %v", topic, options.Queue, b.Addrs)
    65  	stream, err := b.Client.Subscribe(context.TODO(), &pb.SubscribeRequest{
    66  		Topic: topic,
    67  		Queue: options.Queue,
    68  	}, client.WithAddress(b.Addrs...), client.WithRequestTimeout(time.Hour))
    69  	if err != nil {
    70  		return nil, err
    71  	}
    72  
    73  	sub := &serviceSub{
    74  		topic:   topic,
    75  		queue:   options.Queue,
    76  		handler: handler,
    77  		stream:  stream,
    78  		closed:  make(chan bool),
    79  		options: options,
    80  	}
    81  
    82  	go func() {
    83  		for {
    84  			select {
    85  			case <-sub.closed:
    86  				log.Debugf("Unsubscribed from topic %s", topic)
    87  				return
    88  			default:
    89  				// run the subscriber
    90  				log.Debugf("Streaming from broker %v to topic [%s] queue [%s]", b.Addrs, topic, options.Queue)
    91  				if err := sub.run(); err != nil {
    92  					log.Debugf("Resubscribing to topic %s broker %v", topic, b.Addrs)
    93  					stream, err := b.Client.Subscribe(context.TODO(), &pb.SubscribeRequest{
    94  						Topic: topic,
    95  						Queue: options.Queue,
    96  					}, client.WithAddress(b.Addrs...), client.WithRequestTimeout(time.Hour))
    97  					if err != nil {
    98  						log.Debugf("Failed to resubscribe to topic %s: %v", topic, err)
    99  						time.Sleep(time.Second)
   100  						continue
   101  					}
   102  					// new stream
   103  					sub.stream = stream
   104  				}
   105  			}
   106  		}
   107  	}()
   108  
   109  	return sub, nil
   110  }
   111  
   112  func (b *serviceBroker) String() string {
   113  	return "service"
   114  }
   115  
   116  func NewBroker(opts ...broker.Option) broker.Broker {
   117  	var options broker.Options
   118  	for _, o := range opts {
   119  		o(&options)
   120  	}
   121  
   122  	addrs := options.Addrs
   123  	if len(addrs) == 0 {
   124  		addrs = []string{"127.0.0.1:8001"}
   125  	}
   126  
   127  	return &serviceBroker{
   128  		Addrs:   addrs,
   129  		Client:  pb.NewBrokerService(DefaultName, client.DefaultClient),
   130  		options: options,
   131  	}
   132  }