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 }